U
    +ifB}                  	   @   s  d dl Z d dlZd dlZd dlZd dlmZmZ d dlZd dl	Z	d dl
Zd dl
mZmZmZmZmZmZmZmZmZ d dlmZ d dlmZmZmZmZ dZe	jdZ d dl!m"Z"m#Z# e	jj$Z%dd	 Z&d
d Z'dd Z(dd Z)e	jddd Z*dd Z+e	j,ddddhe- fe- ddhfdhddhfe- dhfdfddhddhfe- dhfd fgd!d" Z.d#d$ Z/d%d& Z0d'd( Z1e	j,d)d*d+gd,d- Z2d.d/ Z3d0d1 Z4d2d3 Z5d4d5 Z6d6d7 Z7d8d9 Z8d:d; Z9d<d= Z:e	j,d>d+d*gd?d@ Z;dAdB Z<e	jdCdDdE Z=e	jdFdGdH Z>dIdJ Z?dKdL Z@dMdN ZAdOdP ZBdQdR ZCe	j,dSdTdUdVgdWdX ZDdYdZ ZEd[d\ ZFd]d^ ZGd_d` ZHdadb ZIdcdd ZJdedf ZKe	jd dgdh ZLdS )i    N)catch_warningssimplefilter)		DataFrameDatetimeIndexIndex
MultiIndexSeries	Timestampconcat
date_rangetimedelta_range)_maybe_removeensure_clean_pathensure_clean_store
safe_closeZbloscz7ignore:object name:tables.exceptions.NaturalNameWarningHDFStoreread_hdfc              
   C   s   t | <}z t|}tdW 5 Q R X W n tk
r@   Y nX W 5 Q R X t | J}t|6}t  |d< t|dks~tt|d tkstW 5 Q R X W 5 Q R X d S )NZblaha   )	tmensure_cleanr   
ValueErrormakeDataFramelenAssertionErrortyper   )
setup_pathpathtbl r    V/home/mars/bis/venv/lib/python3.8/site-packages/pandas/tests/io/pytables/test_store.pytest_context.   s    

r"   c                    sl   t jdfdd  fdd}|dd}|dd}td	 |dd}|dd}||ks\t||kshtd S )
N   c              	      sJ   | t | d,t fdddD ]}| q(W 5 Q R X  S )Nrbc                      s     j S N)read
block_sizer    chunk_num_blocksfhr    r!   <lambda>D       z7test_no_track_times.<locals>.checksum.<locals>.<lambda>r-   )openiterupdatedigest)filenameZhash_factoryr)   chunkr    r(   r!   checksumA   s
    z%test_no_track_times.<locals>.checksumc              
      sd   t R}tddgi}t|dd}|jd|ddd | d W 5 Q R X  |W  5 Q R  S Q R X d S )Nr   r   wmodetableT)formatdata_columnsindextrack_times)r   r   r   put)r<   r   dfZhdfr4   r   r    r!   create_h5_and_return_checksumH   s    
	z:test_no_track_times.<locals>.create_h5_and_return_checksumF)r<   Tr   )hashlibmd5timesleepr   )r   r@   Zchecksum_0_tt_falseZchecksum_0_tt_trueZchecksum_1_tt_falseZchecksum_1_tt_truer    r?   r!   test_no_track_times<   s    




rE   c              	   C   s(   t | }t|g kstW 5 Q R X d S r%   )r   listr   r   storer    r    r!   test_iter_emptyh   s    
rI   c              
   C   s  t | h}t| |  t |d< t |d< t |d< t }d|d< d|d< |d d	k|d
< |d d	k|d< d|d< d|d< d|d< td|d< td|d< tdddd	d	|d< tdddd	d	|d< t	j
|j|jdd dgf< | jdd}tdd tdtjj ||d< W 5 Q R X |j|jjd  |jt|ksRt|jt|ksft|  W 5 Q R X t | 4}t }|d| |d}t| t| W 5 Q R X d S )!Nr   bcfooobj1barobj2Ar   bool1Bbool2Tbool3r   int1   int220010102
timestamp120010103
timestamp2  	datetime1   	datetime2   datetimerecordignorer>   Zbah)r   reprinfor   makeTimeSeriesZmakeStringSeriesr   r	   rb   npnanlocr;   _consolidate_convertr   r   pderrorsZPerformanceWarning_handleZcreate_grouprootr2   r   strappend
get_storer)r   rH   r>   sr    r    r!   	test_repro   sB    

rv   c              
   C   s   t | }t |d< t |d< t |d< d|ks:td|ksFtd|ksRtd|ks^td|ksjtd|ksvtd|ksttdd	 t |d
< W 5 Q R X d
|kstW 5 Q R X d S )Nr   rJ   zfoo/barrK   z/foo/barz/foo/brN   Trc   znode()))r   r   rh   r   r   r   rG   r    r    r!   test_contains   s    
rw   c              
   C   s   t | }t |d< t |d< t }t|d |d|d d  |d|dd   |jjj	j
dkspt|jjj	j
dkst|jjj	j
dkstt|d |d| d |dj	_
d}tjt|d |d W 5 Q R X W 5 Q R X d S )	Nr   rJ   df1
   z0.15.2df2z/'NoneType' object has no attribute 'startswith'match)r   r   rh   r   makeTimeDataFramer   rs   rq   r   Z_v_attrsZpandas_versionr   rJ   rx   Zget_nodepytestraises	Exceptionselect)r   rH   r>   msgr    r    r!   test_versioning   s     


r   zwhere, expected/Zfirst_groupZsecond_grouprx   rz   Zthird_groupdf3s1df4) /first_group/second_group/second_group/third_groupr   )r   r   c                 C   s  t dddgt dddgt dddgt d	d
dgtd
d	dgtdddgdddggtjddgddtjddgddd}tddd`}|d|d  |d|d  |d|d  |d|d  |d|d  |jd d!|d!  |jjd d"|d" d# |jjd$d%|d% d# t	t
|j| d&t	|ks<t|j| d&D ]\}}}||ks`t|| \}}	|t|ks~t|	t|kst|D ]J}
d'||
g}||}d(|
krt|||
  nt|||
  qqHW 5 Q R X d S ))Nr   rV   r^         r`         	   ry      )r   rV   r^   )r   r   r`   zi,i,iZdtype)r   r   r   )ry   r      )rx   rz   r   r   r   a1tb1tb2zwalk_groups.hdfr5   r6   z/first_group/df1rx   z/first_group/df2rz   z/second_group/df3r   z/second_group/s1r   z/second_group/third_group/df4r   r   r   r   )objr   r   wherer   r>   )r   r   ri   arrayr   r=   rp   Zcreate_arrayZcreate_tabler   rF   walkr   setjoingetr   assert_frame_equalassert_series_equal)r   expectedr   ZobjsrH   r   groupsleavesZexpected_groupsZexpected_framesleafZ
frame_pathr   r    r    r!   	test_walk   s<    "

r   c                 C   s   t | }t }||d< |j}t|| t|d}t|| t }||d< |j}t|| dD ]4}d| d}t	j
t|d t|| W 5 Q R X qhdD ]}t|d|  qW 5 Q R X d S )	Nr   r>   )dr7   r   handlecomplibz$'HDFStore' object has no attribute ''r{   )r7   r   r   r   _)r   r   rh   r   r   getattrr}   r>   r   r~   r   AttributeError)r   rH   ru   resultr>   xr   r    r    r!   test_getattr
  s"    

r   c              	   C   s   t dtjdgdtjtjgdtdd}t ddgdtjgdtdd}t| ,}|j|dd	d
 t|d}t|| W 5 Q R X t| .}|j|dd	dd t|d}t|| W 5 Q R X t| .}|j|dd	dd t|d}t|| W 5 Q R X d S )Ng        g       @g      ?)Zcol1Zcol2abcr;   acr>   r8   r9   F)r9   ZdropnaT)	r   ri   rj   rF   r   to_hdfr   r   r   )r   Zdf_with_missingZdf_without_missingr   Zreloadedr    r    r!   test_store_dropna'  s(     





r   c              	   C   s   t | }t d}|j|ddddid |  jddd}|j|dd	dd
 tt	|dt
||g |d j|ddddid |d j|dd	dd
 tt	|dt
|d |d g W 5 Q R X d S )NCZss3r8   r;   r`   )r9   Zmin_itemsizeZlonger)r   T)rs   r9   rR   Zss4)r   r   ZmakeMixedDataFrame	set_indexr   copyZreset_indexZassignr   r   r
   r   )r   r   r>   rz   r    r    r!   test_to_hdf_with_min_itemsizeB  s    
r   r9   fixedr8   c              	   C   sZ   dg}t |t|d}t|2}|j|d| dd t|ddd}t|| W 5 Q R X d S )Nu   foor   r8   surrogatepass)r9   ro   )ro   )r   r   r   r   r   r   r   )r9   r   dataZserr   r   r    r    r!   test_to_hdf_errorsT  s    
r   c                    s8  t | $ tdd  fdd}t }d|d< d|d<  jd	|ddgd
 |d	djdksft|d	djdkszt|d	djdkst jd|dgddgd |ddjdkst|ddjdkst|ddjdkstt d  d| d}t	j
t|d  d W 5 Q R X W 5 Q R X W 5 Q R X d S )NTrc   c                    s   t  | jj|S r%   r   rt   r8   colstcolumnrH   r    r!   colg  s    z$test_create_table_index.<locals>.colrL   stringrN   string2r*   r:   r;   f2)r;   r:   Fz1cannot create table index on a Fixed format storer{   )r   r   r   r}   rs   
is_indexedr   r   r=   r~   r   	TypeErrorcreate_table_indexr   r   r>   r   r    r   r!   test_create_table_indexa  s&    
r   c                    s   t | ҉ tdd  fdd}t }d|d< d|d<  jd	|dgd
 |d	djdks`t|d	djdksttd}tjt	|d |d	dj W 5 Q R X d}tjt	|d  j
d	dgd W 5 Q R X W 5 Q R X W 5 Q R X d S )NTrc   c                    s   t  | jj|S r%   r   r   r   r    r!   r     s    z:test_create_table_index_data_columns_argument.<locals>.colrL   r   rN   r   r*   r   r;   z('Cols' object has no attribute 'string2'r{   zcolumn string2 is not a data_column.
In order to read column string2 you must reload the dataframe 
into HDFStore and include string2 with the data_columns argument.columns)r   r   r   r}   rs   r   r   r~   r   r   r   r   r    r   r!   -test_create_table_index_data_columns_argument  s     
r   c              	   C   s   t jtdddtdgddgd}tddd	d
ddgi|d}t| D}|jd|dd |jddd}|jdgd d f }t	
|| W 5 Q R X d S )Nz
2000-01-01r   periodsdateid)namesr   g?g333333?g?gffffff?g      ?r   r>   Tr   zid == 1r   r   )r   Zfrom_arraysr   ranger   r   rs   r   ilocr   r   )r   idxr>   rH   actualr   r    r    r!   test_mi_data_columns  s     
r   c              	   C   s   t  }d|d< d|d< |d dk|d< |d dk|d	< d
|d< d|d< d|d< td|d< td|d< tddddd|d< tddddd|d< tj|j|jdd dgf< | j	d
d}t
| $}|d| t |d| W 5 Q R X d S )NrL   rM   rN   rO   rP   r   rQ   rR   rS   TrT   r   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   Z	df1_mixed)r   r   r	   rb   ri   rj   rk   r;   rl   rm   r   rs   r   r   r   r>   rH   r    r    r!   test_table_mixed_dtypes  s"    
r   c           	   	   C   s   d}dt  dddtdg}tjj||d}t  ddd	}t|d|d
}t|j|	td
 }t| J}|d| |d}t|| |d| |d}t|| W 5 Q R X d S )NzSun Mon Tue Wed Thuz
2012-05-01i  r   r   z
2014-05-01)holidaysZweekmaskr      )r   freqzMon Tue Wed Thu Fri Sat Sunr   r8   )rb   ri   Z
datetime64rn   offsetsZCustomBusinessDayr   r   weekdaymapsplitr   r=   r   r   r   rs   )	r   Zweekmask_egyptr   Z
bday_egyptdtdtsru   rH   r   r    r    r!   test_calendar_roundtrip_issue  s&     


r   c              
   C   s.  t | }t }t }||d< ||d< t|d t|dksFtt||d  t|d t|dkspttj	t
dd |d W 5 Q R X ||d< ||d< t|d	 t|d t|dkst||d< ||d< t|d t|dkst||d< ||d< |d= |d= t|dks tW 5 Q R X d S )
Nr   rJ   r   r   z1'No object named a_nonexistent_store in the file'r{   Za_nonexistent_storezb/foorL   )r   r   rh   r   r   r   r   r   r~   r   KeyErrorremove)r   rH   tsr>   r    r    r!   test_remove  s:    

 


r   c              	   C   s   t | }ttjddtdddd}|jd|dd ||jtd	k }|	dd
}t
|| ddlm} |	dd
}t
|| |	dd}t
|| W 5 Q R X d S )N   rV   20130101r   r   r>   r8   r   Z20130105z!index>datetime.datetime(2013,1,5)r   ra   zindex>datetime(2013,1,5))r   r   ri   randomrandnr   r=   r;   r	   r   r   r   rb   )r   rH   r>   r   r   rb   r    r    r!   test_same_name_scoping  s    
r   c              	   C   sD   t  }d|j_t| "}||d< |d }t || W 5 Q R X d S )NrL   frame)r   r   r;   namer   r   )r   r>   rH   reconsr    r    r!   test_store_index_name$  s    
r   table_formatc              	   C   s   t ttdddtdddgdd}t ttdddtdddgdd}ttddd||d	}t	|X}|j
|d
| d t|d
}tj||dd t|jjtkstt|jjtkstW 5 Q R X d S )Ni  r   rV   u   colsג)r   i  u   rowsאr   )r   r;   r>   r   T)Zcheck_names)r   rn   to_datetimerb   r   r   ri   arangeZreshaper   r   r   r   r   r   r;   r   rr   r   r   )r   r   r   Zidx1r>   r   rz   r    r    r!   test_store_index_name_numpy_str.  s      

r   c              	   C   sD   t  }|d }t| "}||d< |d }t || W 5 Q R X d S )NrP   series)r   r   r   r   )r   r>   r   rH   r   r    r    r!   test_store_series_nameF  s    
r   z6ignore:\nduplicate:pandas.io.pytables.DuplicateWarningc              	   C   sD   t | 2}t |d< t }||d< t|d | W 5 Q R X d S )Nr   )r   r   r}   rh   r   )r   rH   r   r    r    r!   test_overwrite_nodeP  s
    
r   z9ignore:\nthe :pandas.io.pytables.AttributeConflictWarningc              
   C   sh  t  }t| }t|d |d| |d}|jtt	|j
k sRtt|d ttdtdd}|d| |ddg}|jtdk st|jd|d}|jddd d f }t || |dd	d
g}|jtdd k st|jd|d}|jddd d f }t || t|tsBtt|d t|d t  }t  jdjd}|jd|ddgd |d| |dddg}|d|}|d|}	t||	gdd}t||gdd}||jdk|jdk@  }t j||dd W 5 Q R X t| J}ttjddtdddd}|d| |dd}|t|jdk j
}
|j|
 }|jd|
d}t || |jd|
d}t || d}t j!t"|d" |jdtjt	|d d!d W 5 Q R X t j!t"|d" |jdtt	|d d W 5 Q R X t j!t"|d  |jdtt	|dd" W 5 Q R X t j!t"|d" |jdtt	|dd#d$ W 5 Q R X tdd%d}|jdd&d}||j
#| }t || ttjd#d}|d| |jddddgd}|jdddg }t || d'gd# }
d|
d(< |jd|
d}|j|
 }t || |jddd#d)}|dd# }t || W 5 Q R X d S )*Nr>   r   rP   rR   zindex<3r^   r   r   rV   zindex>=3zindex<=4r   rx   rz   z{}_2r   rP   rR   r   zA>0zB>0r   )ZaxisF)Z
check_freqi  Z20000101r   r   r;   zLwhere must be passed as a string, PyTablesExpr, or list-like of PyTablesExprr{   Zfloat64r   )r   startry   )r   r   stopi  zindex in selectionTr   r   )$r   r}   r   r   rs   Zselect_as_coordinatesvaluesri   r   r   r;   allr   r   r   r   rk   r   
isinstancer   renamer9   r
   rP   rR   r   r   r   Zselect_columnr   monthr   r~   r   r   isin)r   r>   rH   rK   r   r   rx   rz   Z
df1_resultZ
df2_resultr   r   Z	selectionr    r    r!   test_coordinates[  s    




 

&&$&

r  c              	   C   s   t | }ttjdtjdd}|d| |jddddd}|jddd	gf }t	|| |jddd
dd}t
|dkst|jd
dd	gf }t	|| W 5 Q R X d S )Nr   r   r>   zcolumns=['A']r   r   r   r   rP   r   (   )r   r   ri   r   randrs   r   rk   r   r   r   r   r   rH   r>   r   r   r    r    r!   test_start_stop_table  s    
r
  c              	   C   s|   t | j}tddgddgd}|jdgd d|dd |jddgdd	dd
}|jd	gddgf }t|| W 5 Q R X d S )Nr   rV   )rL   rN   rL   )selectorr   r  )r  r   r   )r  r   r   rN   )r   r   Zappend_to_multipleZselect_as_multiplerk   r   r   r	  r    r    r!   test_start_stop_multiple  s    

     r  c              	   C   s  t | l}ttjdtjddtdddd}|d| |jdddd	}|jddd d f }t	
|| |jddd
d	}|jdd
d d f }t	
|| |jdddd	}|jddd d f }t	
|| |j}|d| |jdddd	}|jdd }t	|| |jddd
d	}|jdd
 }t	|| t	 }tj|jddddf< tj|jdd
df< W 5 Q R X d S )Nr   r   r   r   r   r>   r   r   r   ry   r   r  ru   r^   r   r   r   )r   r   ri   r   r  r   r=   r   r   r   r   rP   r   r   rj   )r   rH   r>   r   r   ru   r    r    r!   test_start_stop_fixed  s4    
r  c              
   C   s   t tjdd}dd |jD |_dd |jD |_t| }|jd|dd d	}|d|g}t	
||jd d |jd d
 f  d}|d|g}t	
||jd d |jd d
d f  W 5 Q R X d S )N2   d   c                 S   s   g | ]}|d qS Z3dr    .0rK   r    r    r!   
<listcomp>  s     z-test_select_filter_corner.<locals>.<listcomp>c                 S   s   g | ]}|d qS r  r    r  r    r    r!   r    s     r   r8   r   zcolumns=df.columns[:75]K   zcolumns=df.columns[:75:2]rV   )r   ri   r   r   r;   r   r   r=   r   r   r   rk   )r   r>   rH   critr   r    r    r!   test_select_filter_corner  s    
$r  c                    s0   t   t  fdddd }t  | d S )Nc                    s     | dS Nr>   r   pr>   r    r!   r,   0  r-   z#test_path_pathlib.<locals>.<lambda>c                 S   s
   t | dS r  r   r  r    r    r!   r,   0  r-   r   r   Zround_trip_pathlibr   r   r   r    r  r!   test_path_pathlib,  s    
 r  zstart, stop)r   rV   )r   rV   )NNc              	   C   sj   t tdddgtdddgd}t|6}|d| |jd| |d}t|| | | W 5 Q R X d S )	Ni2i2i2abcd)r   rJ   Ztest_datasetr   )r   r   r   rs   r   r   r   )r   r   r   r>   rH   r   r    r    r!    test_contiguous_mixed_data_table5  s    
r"  c                    s8   t    fdd}dd }t ||}t  | d S )Nc              	      s$   t | } |d W 5 Q R X d S r  r   r   r   rH   r  r    r!   writerI  s    
z*test_path_pathlib_hdfstore.<locals>.writerc              
   S   s*   t | }t|dW  5 Q R  S Q R X d S r  r   r$  r    r    r!   readerM  s    
z*test_path_pathlib_hdfstore.<locals>.readerr  r   r%  r&  r   r    r  r!   test_path_pathlib_hdfstoreF  s
    r(  c                    s0   t   t  fdddd }t  | d S )Nc                    s     | dS r  r  r  r  r    r!   r,   X  r-   z,test_pickle_path_localpath.<locals>.<lambda>c                 S   s
   t | dS r  r  r  r    r    r!   r,   X  r-   r  r  r    r  r!   test_pickle_path_localpathU  s    
 r)  c                    s8   t    fdd}dd }t ||}t  | d S )Nc              	      s$   t | } |d W 5 Q R X d S r  r#  r$  r  r    r!   r%  `  s    
z,test_path_localpath_hdfstore.<locals>.writerc              
   S   s*   t | }t|dW  5 Q R  S Q R X d S r  r   r$  r    r    r!   r&  d  s    
z,test_path_localpath_hdfstore.<locals>.reader)r   r   Zround_trip_localpathr   r'  r    r  r!   test_path_localpath_hdfstore]  s
    r*  c              
   C   sx   t ddd ddd}t }t >}t|}|jd|dgd |  ||d ||d	d
 W 5 Q R X W 5 Q R X d S )NTrc   c                 [   s  zt| d}|d kr(dd l}| \}}|j	|f||d|}|d krP|
 }t|t|
 ksht|
 D ]Z}	||	jrp||	}
||	}|j|
jkst|rp|jD ]}|jr|
|j jstqqpW 5 t | t | zt| W n ttfk
r   Y nX t| X d S )Nrr   )keyspropindexes)r   oscloseOSErrorr   r   r   tempfilemkstempr   r,  r   r   rt   Zis_tableZnrowsZaxesr   r   )r*   new_fr,  r-  kwargsrH   Ztstorefdr1  kZnew_tZorig_tr   r    r    r!   do_copyp  s2    



ztest_copy.<locals>.do_copyr>   rP   r   )r*   F)r*   r-  )NNT)r   r   r   r   r   rs   r/  )r   r7  r>   r   str    r    r!   	test_copyl  s    
'

r9  c              
   C   s   t ddgddggd}t| v}d}tjt|d |j|ddd W 5 Q R X |j|dd	d t|d}t|| |	|st
|	|st
W 5 Q R X d S )
Nr   r   )r   r   z/Columns index has to be unique for fixed formatr{   r>   r   r   r8   )r   r   r~   r   r   r   r   r   r   equalsr   )r   r>   r   r   otherr    r    r!   test_duplicate_column_name  s    

r<  c              	   C   sT   t tjjdd}tddddd|_t| }||d< t|d | W 5 Q R X d S )	N)ry   r   )sizeZ0sry   Z1sZexample)r   r   r   r   r>   )	r   ri   r   normalr   r;   r   r   r   r   r    r    r!   !test_preserve_timedeltaindex_type  s
    
r?  c              	   C   s   t tjddtdtdd}d|j_|jddd	}|jj|j	
  }t| F}|j|d
dd|dd td}t|}t|d
|d ||kstW 5 Q R X d S )Nr   r   abcdZABCDE)r;   r   lettersET)r,  rs   r>   r   F)r7   rs   r:   r;   ZBCDr   )r   ri   r   r  rF   r;   r   r   r   r   tolistr   r   r   r   )r   r>   r:   r   Z	cols2loadZcols2load_originalr    r    r!    test_columns_multiindex_modified  s"     
rD  c                 C   s4  t jt jt jt jt jg}t jt jt jg}|D ]x}t	t
jdd|dd}t| L}tdd6 d}tjt|d |j|dd	dd
 W 5 Q R X W 5 Q R X W 5 Q R X q,|D ]}t	t
jdd|dd}t| X}tddB |j|dd	dd
 t|dd|jd  dd}t|stW 5 Q R X W 5 Q R X qd S )Nry   rV   r   Trc   z-cannot have non-object label DataIndexableColr{   r>   r8   )r9   r:   z	index = [r   ]r   )r   ZmakeIntIndexZmakeFloatIndexZmakeDateIndexZmakeTimedeltaIndexZmakePeriodIndexZmakeStringIndexZmakeCategoricalIndexZmakeUnicodeIndexr   ri   r   r   r   r   r~   r   r   r   r   r;   r   r   )r   Ztypes_should_failZtypes_should_runr;   r>   r   r   r   r    r    r!   $test_to_hdf_with_object_column_names  s0    
2
rF  )Mrb   rA   r.  rC   warningsr   r   numpyri   r~   Zpandasrn   r   r   r   r   r   r	   r
   r   r   Zpandas._testingZ_testingr   Zpandas.tests.io.pytables.commonr   r   r   r   Z_default_compressormarkfilterwarningsZignore_natural_naming_warningZpandas.io.pytablesr   r   Z
single_cpuZ
pytestmarkr"   rE   rI   rv   rw   r   Zparametrizer   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r
  r  r  r  r  r"  r(  r)  r*  r9  r<  r?  rD  rF  r    r    r    r!   <module>   s   ,,.





(
  )






o)	
5