U
    sVc                     @   s   d dl Zd dlZd dlZd dlmZmZmZmZ d dl	m
Z ejdd Zejdd Zejdd Zejd	d
 ZG dd dZG dd dZG dd dZdS )    N)	DataFramelreshapemeltwide_to_longc                  C   sD   t  d d } | d dktj| d< | d dktj| d< | S )N
   Ar   id1Bid2)tmZmakeTimeDataFrameastypenpZint64res r   B/tmp/pip-unpacked-wheel-xj8nt62q/pandas/tests/reshape/test_melt.pydf   s    r   c                  C   sB   t dddgdddgddd	gg} td
tdg| _ddg| j_| S )N5:?StgKԲ?Uy$> M?gKi<8b->?ghBĒABCabcCAPlow)r   listcolumnsnamesr   r   r   r   df1   s    r    c                   C   s   dS )Nvarr   r   r   r   r   var_name$   s    r"   c                   C   s   dS )Nvalr   r   r   r   r   
value_name)   s    r$   c                   @   s  e Zd Zdd Zdd Zdd Zdd Zej	d	e
eejfd
d Zdd Zej	ddgdgdedddddddddddddfdgdgdedddddddddddddfgdd Zej	d d!d"ggd!gd"gd!d"ggd#d$ Zd%d& Zd'd( Zd)d* Zej	d+dd,gd-d. Zd/d0 Zej	d1eejd2d3d4d5ejddd6dd7gd8d9edddddggd:d; Zd<d= Zd>d? Zd@dA ZdBdC ZdDdE Z dFdG Z!dHdI Z"dJdK Z#dLS )MTestMeltc                 C   s"   t |}|j ddgkstd S )Nvariablevaluer   r   tolistAssertionError)selfr   resultr   r   r   test_top_level_method/   s    zTestMelt.test_top_level_methodc                 C   s   t | t| t |jddgddgdt|ddgddgd t |j||dt|||d t |jddt|dd d S )	Nr   r
   r   r	   id_vars
value_varsr"   r$   r   	col_level)r   assert_frame_equalr   )r+   r   r    r"   r$   r   r   r   test_method_signatures3   s    zTestMelt.test_method_signaturesc                 C   sr   |  }|j ddgkst|j dgd}|j dddgksDt|j ddgd}|j ddddgksntd S )Nr&   r'   r   r/   r
   r(   )r+   r   r,   Zresult1Zresult2r   r   r   test_default_col_namesB   s    zTestMelt.test_default_col_namesc                 C   s   |j ddgdd}t|dks"t|j ddgddgd}t|d  d |d  d dgd dgd  |d  |d   dddd	d
gd}t|| d S )Nr   r
   r   r.   r   r	      r   r
   r&   r'   r&   r'   r   )r   lenr*   r   r)   r   r4   )r+   r   Zresult3Zresult4Z	expected4r   r   r   test_value_varsL   s    
	zTestMelt.test_value_varstype_c                 C   s   t |d  d |d  d dgd dgd  |d  |d   ddddd	gd
}|jddg|dd}t|| d S )Nr   r8   r
   r   r   r	   r9   r&   r'   r:   r   r	   r.   )r   r)   r   r   r4   )r+   r=   r   expectedr,   r   r   r   test_value_vars_types\   s    
	zTestMelt.test_value_vars_typesc                 C   s\   t |d dgt| dgt| |d dddddgd	}|jdgdgd
}t|| d S )Nr   ar	   br	   rC   )rA   r   r   r'   r   r   r'   r:   r.   )r   r;   r   r   r4   )r+   r    r?   r,   r   r   r   test_vars_work_with_multiindexk   s    

z'TestMelt.test_vars_work_with_multiindexz(id_vars, value_vars, col_level, expectedr   r	   r   r   r   r   r      r8   r   r   r   )r   r   r'   rB   rC   rG   )rB   r   r'   c                 C   s    |j |||d}t|| d S )Nr2   )r   r   r4   )r+   r/   r0   r3   r?   r    r,   r   r   r   %test_single_vars_work_with_multiindexy   s     z.TestMelt.test_single_vars_work_with_multiindexzid_vars, value_varsrA   rD   c              	   C   s0   d}t jt|d |j||d W 5 Q R X d S )NzF(id|value)_vars must be a list of tuples when columns are a MultiIndexmatchr.   )pytestraises
ValueErrorr   )r+   r/   r0   r    msgr   r   r   $test_tuple_vars_fail_with_multiindex   s    z-TestMelt.test_tuple_vars_fail_with_multiindexc           	      C   s,  |j |d}|j ddgks"t|j dg|d}|j dddgksJt|j ddg|d}|j ddddgksvt|j ddgd|d}|j ddddgkst|j ddgdd	g|d}td|d  d
 d|d  d
 |dgd d	gd  d|d  |d	   idd|dgd}t|| d S )N)r"   r!   r'   r   )r/   r"   r
   r   )r/   r0   r"   r	   r8   r   r:   r   r   r)   r*   r   r   r4   )	r+   r   r"   Zresult5Zresult6Zresult7Zresult8Zresult9Z	expected9r   r   r   test_custom_var_name   s4          
	zTestMelt.test_custom_var_namec           	      C   s,  |j |d}|j ddgks"t|j dg|d}|j dddgksJt|j ddg|d}|j ddddgksvt|j ddgd|d}|j ddddgkst|j ddgdd	g|d}td|d  d
 d|d  d
 ddgd d	gd  ||d  |d	   iddd|gd}t|| d S )N)r$   r&   r#   r   )r/   r$   r
   r   )r/   r0   r$   r	   r8   r   r:   rP   )	r+   r   r$   Zresult10Zresult11Zresult12Zresult13Zresult14Z
expected14r   r   r   test_custom_value_name   s<            
	zTestMelt.test_custom_value_namec                 C   sf  |j ||d}|j ddgks$t|j dg||d}|j dddgksNt|j ddg||d}|j ddddgks|t|j ddgd||d}|j ddddgkst|j ddgdd	g||d}td|d  d
 d|d  d
 |dgd d	gd  ||d  |d	   idd||gd}	t||	 | }
d|
j_|
  }|j ddgksbtd S )Nr1   r!   r#   r   r/   r"   r$   r
   r   )r/   r0   r"   r$   r	   r8   r   r:   foor'   )	r   r   r)   r*   r   r   r4   copyname)r+   r   r$   r"   Zresult15Zresult16Zresult17Zresult18Zresult19Z
expected19Zdf20Zresult20r   r   r   test_custom_var_and_value_name   sP          
	z'TestMelt.test_custom_var_and_value_namer3   r   c                 C   s&   |j |d}|j ddgks"td S )Nr2   r   r'   r(   )r+   r3   r    r   r   r   r   test_col_level  s    zTestMelt.test_col_levelc                 C   s$   |  }|j dddgks td S )Nr   r   r'   r(   )r+   r    r   r   r   r   test_multiindex  s    zTestMelt.test_multiindexcolZ2010   z
US/Pacific)Zperiodstzcdcategory)dtypec                 C   s   t td|dddddg|d}tjtdddddg|gdd}t|ddgd	d
d}t ttdd tj|gd dddgd dgd  |d}ddd	d
g|_t	|| d S )Nr[   rG   r   )klassrZ   attr1attr2TZignore_indexra   rZ   	attributer'   rS   r8   rb   rc   )r   rG   r8      )
r   rangepdconcatSeriesr   r   r   r   r4   )r+   rZ   r   Zexpected_valuer,   r?   r   r   r   test_pandas_dtypes  s&    
"   zTestMelt.test_pandas_dtypesc                 C   s^   t ddgtddgd}t|dgdg}t tddgddgddgd}t|| d S )	NrG   r8   XYr>   r	   r   )r	   r&   r'   )r   rh   ZCategoricalr   r   r4   )r+   datar,   r?   r   r   r   test_preserve_category4  s    zTestMelt.test_preserve_categoryc              	   C   sT  t tjddtdd}d}tjt|jdddd	 |	d
dgddg W 5 Q R X tjt|jdddd	 |	ddgddg W 5 Q R X tjt|jdddd	 |	d
dddgddg W 5 Q R X |
 }tdtdg|_tjt|jdddd	 |	dgdg W 5 Q R X tjt|jdddd	 |j	dgdgdd W 5 Q R X d S )Nr[      Zabcdr:   z=The following '{Var}' are not present in the DataFrame: {Col}r0   z\['C'\])ZVarZColrI   rB   rC   Cr^   r/   z\['A'\]r   r]   z\['not_here', 'or_there'\]Znot_hereZor_thereABCDz\['E'\])ErB   rD   z\['F'\]Fr   r2   )r   r   randomrandnr   rK   rL   KeyErrorformatr   rU   r   )r+   r   rN   Zmultir   r   r    test_melt_missing_columns_raises>  s.     " z)TestMelt.test_melt_missing_columns_raisesc                 C   sf   t dgdgdgdgd}t|ddgdd	gd
}t dgd dgd tdddgd}t|| d S )NrT   barrG   r8   )r   rB   rC   r^   r   rB   rC   r^   r.   Zbd)r   rB   r&   r'   )r   r   r   r   r4   r+   r   r,   r?   r   r   r   test_melt_mixed_int_str_id_varsc  s     z(TestMelt.test_melt_mixed_int_str_id_varsc                 C   sH   t dgdgd}t|ddgd}t ddgddgd}t|| d S )NrT   rz   )r   rB   r   rB   )r0   r&   r'   r   r   r   r4   r{   r   r   r   "test_melt_mixed_int_str_value_varsl  s    z+TestMelt.test_melt_mixed_int_str_value_varsc                 C   sR   t dgdgddgd}t|dd}t dd	gddgd
ddgd}t|| d S )Nr   rG   rT   rz   firstindexFrd   rT   rz   r}   r~   r{   r   r   r   test_ignore_indexs  s     zTestMelt.test_ignore_indexc                 C   s   t jjddgddgd}tddgdd	gd
|d}t|dd}t jjddgd ddgd}tdgd dgd  dddd	gd|d}t|| d S )N)r   second)r   thirdbazZfoobar)r   r   rG   r8   rf   r   r   Frd   rT   rz   r}   )rh   Z
MultiIndexfrom_tuplesr   r   r   r4   r+   r   r   r,   Zexpected_indexr?   r   r   r   test_ignore_multiindex|  s     
  zTestMelt.test_ignore_multiindexc                 C   s   t jddgddd}tddgdd	gd
|d}t|dd}t jddgd ddd}tddddgdddd	gd|d}t|| d S )NrT   rz   r_   r   )r`   rV   r   rG   r8   rf   )xyr   Frd   r   r   r}   )rh   Indexr   r   r   r4   r   r   r   r   test_ignore_index_name_and_type  s    z(TestMelt.test_ignore_index_name_and_typec                 C   s^   t dddggdddgd}|jdgdgd}t dddgdddggddd	gd}t|| d S )
Nidr8   rf   rB   rC   r:   r.   r&   r'   r~   r{   r   r   r    test_melt_with_duplicate_columns  s     z)TestMelt.test_melt_with_duplicate_columnsN)$__name__
__module____qualname__r-   r5   r7   r<   rK   markparametrizetupler   r   arrayr@   rE   r   rH   rO   rQ   rR   rW   rX   rY   rh   rj   Z
date_rangerk   ro   ry   r|   r   r   r   r   r   r   r   r   r   r%   .   s|   









+


%		r%   c                   @   s   e Zd Zdd ZdS )TestLreshapec                 C   s  dddddgdddd	d
gdddddgdddddgdddddgdt jdddgdt jt jddgdddd d!gd"t jd#d$d%gd&t jt jd'd(gd)
}t|}d*d+ td,d-D d.d+ td,d-D d/}t||}ddddddddddddgdddd	d
ddd	d
dd	d
gddddddddddddgddddddddddddgddddddddddddgd0d$d1d2d3d"d#d$d%d&d'd(gd4}t||jd5}t|| t||d6d7}dddddddddddddddgdddd	d
dddd	d
dddd	d
gdddddddddddddddgdddddddddddddddgddddddt jddddt jt jddgd0d$d1d2d3d"t jd#d$d%d&t jt jd'd(gd4}t||jd5}t|| tt	 t||d6d8d9 W 5 Q R X d:d+ td,d;D d<d+ td,d-D d/}d=}t
jt|d> t|| W 5 Q R X d S )?NZ	08jan2009Z	20dec2008Z	30dec2008Z	21dec2008Z	11jan2009i  i  i  iC  i%  e   f   g   h   i   ZMaleZFemaleZ	22dec2008Z	04jan2009Z	29dec2008Z	20jan2009Z	21jan2009Z	22jan2009Z	31dec2008Z	03feb2009Z	05feb2009Z	02jan2009Z	15feb2009i  i
  i  i  i  g     l@g     @g     @g     ߱@g     @g     b@g     Ų@)
birthdtbirthwtr   sexZvisitdt1Zvisitdt2Zvisitdt3Zwt1Zwt2Zwt3c                 S   s   g | ]}d |dqS visitdtr^   r   .0ir   r   r   
<listcomp>  s     z+TestLreshape.test_pairs.<locals>.<listcomp>rG   rp   c                 S   s   g | ]}d |dqS wtr^   r   r   r   r   r   r     s     )r   r   g     |@g     4@g     ĩ@g     Ұ@)r   r   r   r   r   r   r:   F)dropnarT   )r   labelc                 S   s   g | ]}d |dqS r   r   r   r   r   r   r     s     rf   c                 S   s   g | ]}d |dqS r   r   r   r   r   r   r     s     z$All column lists must be same lengthrI   )r   nanr   rg   r   r   r   r4   assert_produces_warningFutureWarningrK   rL   rM   )r+   rn   r   specr,   exp_dataexprN   r   r   r   
test_pairs  s   
IhzTestLreshape.test_pairsN)r   r   r   r   r   r   r   r   r     s   r   c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zejd%d&d'gd(d) Zd*S )+TestWideToLongc              
   C   s   t jd t jd}tddddddd	dd
dddddddtttd|d}|j|d< |	 |	  dddddd	gd
dddddgddddddgddddddgd}t|}|
ddgdddg }t|ddgddd}t|| d S )N{   rf   rB   rC   r]   rF   r^   ef      @333333?ffffff?皙	@?皙?)ZA1970ZA1980ZB1970ZB1980rl   r       r   rG   r8   rl   r   r	   yearr   r   rl   r   r	   r   jr   ru   seedrv   r   dictziprg   r   r)   	set_indexr   r   r4   r+   r   r   r   r?   r,   r   r   r   test_simple  s*    



	
zTestWideToLong.test_simplec                 C   s\   t dddddgdddd	d
gg}dddddg|_ddg}t||ddd |ddgksXtd S )Nr   rG   r8   rf      rp   r[         	   r   Zinc1Zinc2Zedu1Zedu2inceduager   )r   r   r   r*   )r+   r   Zstubsr   r   r   
test_stubs  s
     zTestWideToLong.test_stubsc              
   C   s   t jd t jd}tddddddd	dd
dddddddtttd|d}|j|d< |	 |	  dddddd	gd
dddddgddddddgddddddgd}t|}|
ddgdddg }t|ddgdddd}t|| d S )Nr   rf   rB   rC   r]   rF   r^   r   r   r   r   r   r   r   r   )zA.1970zA.1980zB.1970zB.1980rl   r   r   r   r   rG   r8   r   r   rl   r   r	   .r   r   sepr   r   r   r   r   test_separating_character  s*    



	
z(TestWideToLong.test_separating_characterc              
   C   s   t jd t jd}tddddddd	dd
dddddddtttd|d}|j|d< |	 |	  dddddd	gd
dddddgddddddgddddddgd}t|}|
ddgdddg }t|ddgddd}t|| d S )Nr   rf   rB   rC   r]   rF   r^   r   r   r   r   r   r   r   r   )zA(quarterly)1970zA(quarterly)1980zB(quarterly)1970zB(quarterly)1980rl   r   r   r   r   rG   r8   )rl   A(quarterly)B(quarterly)r   r   r   rl   r   r   r   r   r   r   r   r   test_escapable_characters  s.    



	
z(TestWideToLong.test_escapable_charactersc                 C   s   t ddgddgddgddgd	}|j|d
< ddddgddddgddtjtjgddddgddddgd}t |}|d
dgdddg }t|ddgd
dd}t|| d S )N      ?       @      @      @      @      @X1X2A2010A2011B2010rl   r   r   rG   i  i  )rl   r   r	   r   r   r   rl   r   r	   r   )r   r   r   r   r   r   r   r4   r+   r   r   r?   r,   r   r   r   test_unbalanced  s$    




zTestWideToLong.test_unbalancedc                 C   s  t dddgdddgdddgd	d
dgdddgdddgdddgdddgd}|j|d< t ddddddgddddddgddddddgdddd	d
dgddddddgddddddgddddddgd}|ddgddddd g }t|ddd gddd!}t|jdd"|jdd" d S )#Na11a22a33a21a23b11b12b13b21b22b23rG   r8   rf   rp   r[   r   [   \   ]   )A11A12B11B12BB11BB12BBBXBBBZr   r         )r   r   r   r	   BBr   r   r   r   r   r   r	   r   r   Zaxisr   r   r   r   r   r4   
sort_indexr+   r   r?   r,   r   r   r   test_character_overlap  s2    
z%TestWideToLong.test_character_overlapc              	   C   s   d}t ddgddgddgdd	gd
}|j|d< dg g g g g g g d}t |ddi}|ddgddddddg }|jjddgdd|_t|ddgdd|d}t|jdd|jdd d S )Nznope!r   r   r   r   r   r   r   r   r   r    )rl   r   r   r   r   r   r   r	   r   intrl   r   r   r   r   r	   r   rG   levelr   r   	r   r   r   r   
set_levelsr   r   r4   r  )r+   r   r   r   r?   r,   r   r   r   test_invalid_separator  s2    

z%TestWideToLong.test_invalid_separatorc                 C   s  t dddgdddgdddgd	d
dgdddgdddgdddgdddgd}|j|d< t ddddddgddddddgddddddgdddd	d
dgddddddgddddddgddddddgd}|ddgddddd g }t|ddd gddd!}t|jdd"|jdd" d S )#Nr   r   r   r   r   r   r   r   r   r   r   rG   r8   rf   rp   r[   r   r   r   r   )r   r   r   r   r   r   AratingArating_oldr   r   r   r   )r  r  r   r	   r   r   r   r   r  r  r   r	   r   r   r   r   r  r   r   r   test_num_string_disambiguation9  s6    
z-TestWideToLong.test_num_string_disambiguationc              	   C   s   t ddgddgddgddgd	}|j|d
< dg g g g g g g d}t |ddi}|d
dg}|jjddgdd|_t|ddgd
dd}t|jdd|jdd d S )Nr   r   r   r   r   r   r   r   )AoneAtwoBonerl   r   r  )rl   r  r  r  r   r   r   r	   r   r  r   rG   r  r   r	   r   r   r  r   r   r   r   test_invalid_suffixtypeZ  s,    

z&TestWideToLong.test_invalid_suffixtypec                 C   s6  t dddddddddg	dddddddddg	dddddddd	d
g	dddddddddg	d}t ddddddddddddddd	dd
dgddddddddddddddddddgddddddddddddddddddgddddddddddddddddddgd}|dddgdg }t|dddgdd}t|| d S )NrG   r8   rf   gffffff@g333333@g@g?gffffff?gffffff@ @g333333@gffffff@r   g333333@gffffff
@)famidbirthZht1Zht2r   )htr  r  r   r  r  r   r  r   r   r   r   r   r4   r  r   r   r   test_multiple_id_columnsw  sF    &&&z'TestWideToLong.test_multiple_id_columnsc              	   C   sd   t dddddgdddddgdddddgd}d}tjt|d t|d	d
gddd W 5 Q R X d S )NrG   r8   rf   rp   r[   )ZA_A1ZB_B1r   z3the id variables need to uniquely identify each rowrI   ZA_AZB_Br   colnamer   r   rK   rL   rM   r   r+   r   rN   r   r   r   test_non_unique_idvars  s    (z%TestWideToLong.test_non_unique_idvarsc              
   C   s   t dddgdddgddd	gd
ddgdddgd}t ddddddgddd	d
ddgddddddgddddddgdddg}t|ddgdddd}t|| d S )NzCCH PounderzJohnny DeppzChristoph WaltzzJoel David MoorezOrlando BloomzRory Kinnearg     @@g     @g     |@g     @@g     @g     x@ZAvatarzPirates of the CaribbeanZSpectre)Zactor_1Zactor_2Zactor_fb_likes_1Zactor_fb_likes_2titlerG   r8   )actoractor_fb_likesnumr  r  r  r  r  _r   r  r  r   r   r   test_cast_j_int  sJ    
    zTestWideToLong.test_cast_j_intc              	   C   sX   t ddgddgddgddgd	}d
}tjt|d t|ddgddd W 5 Q R X d S )Nr   r   r   r   r   r   r   r   )r   r   r   r   z,stubname can't be identical to a column namerI   r   r	   r  r   r  r  r   r   r   test_identical_stubnames  s    z'TestWideToLong.test_identical_stubnamesc                 C   s   t ddgddgddgddgd	}t ddddgd
d
ddgddtjtjgddddgd}|ddg}t|ddgddddd}t|| d S )Nr   r   r   r   r   r   r   r   )Ztreatment_placeboZtreatment_testZresult_placebor   Zplacebotestr   r  r,   	treatmentr   r  r,   r%  z[a-z]+r   r   r   suffixr   r   r   r   r   r   r   r4   r  r   r   r   test_nonnumeric_suffix  s0    


     z%TestWideToLong.test_nonnumeric_suffixc                 C   s   t ddgddgddgddgd	d
gd}t ddddgddddgddddgddd	d
gdddg}t|ddgddddd}t|| d S )Nr   r   r   r   r   r   r   r   r   r   )r   result_1Z
result_fooZtreatment_1Ztreatment_foo1rT                 "@r$  r   r  r,   r%  z.+r   r&  r  r  r   r   r   test_mixed_type_suffix  s4    	



     z%TestWideToLong.test_mixed_type_suffixc                 C   s   t ddgddgddgddgd	d
gd}t d	d
d	d
d	d
d	d
gddddddddgddddtjtjtjtjgtjtjtjtjddddgd}|ddg}t|ddgddddd}t|| d S )Nr   r   r   r   r   r   r   r   r   r   )ztreatment_1.1ztreatment_2.1z
result_1.2r*  r   r   g?r  r,  r-  r$  r   r  r,   r%  z[0-9.]+r   r&  r(  r  r   r   r   test_float_suffix  s2    	     z TestWideToLong.test_float_suffixc              
   C   s   ddddddddd	d
ddddddddddddddddddddd}t |}t|dgddgdd}t|dddgdd}t|| d S )Nr   rG   r8   rf   rp   )r   rG   r8   rf   rp   g?r,  g      ?r   gQ?gGz?gQ?g\(\?g333333?gp=
ף?g{Gz?gp=
ף?gq=
ףp?g(\?r   )node_idr   ZPA0ZPA1ZPA3ZPAr0  r   time)	stubnamesr   r   )r   	from_dictr   r   r4   )r+   Z	wide_dataZwide_dfr?   r,   r   r   r   test_col_substring_of_stubname$  s    
z-TestWideToLong.test_col_substring_of_stubnamec              	   C   sv   t tdtdddd}t dddgdddgd	dd	ggd
dd
gd}tt |jd
d}t|| W 5 Q R X d S )Nr   r      r8   )rZ   r'   r   rZ   r	   rq   r'   r&   r:   r6   )r   r   rg   r   r   r   r   r4   r  r   r   r   test_warn_of_column_name_value4  s    z-TestWideToLong.test_warn_of_column_name_valuer`   Ostringc                 C   s   t ddgddgddgd}|d|i}t|d	d
gdddd}tjddddgdd}t ddddgtjgd d|d}|jjd |}|jj	|dd|_t
|| d S )Nr+  2d      i,  i  )r   za-1za-2r   rB   rC   r  -)r2  r   r   r   )r+  rG   )r9  rG   )r+  r8   )r9  r8   )r   r  )rV   rp   )rB   rC   r   r   r  )r   r   r   rh   r   r   r   r   levelsr	  r   r4   )r+   r`   r   r,   r   r?   Z	new_levelr   r   r   test_missing_stubnameB  s(    
z$TestWideToLong.test_missing_stubnameN)r   r   r   r   r   r   r   r   r  r
  r  r  r  r  r!  r"  r)  r.  r/  r4  r6  rK   r   r   r>  r   r   r   r   r     s(   
!)
'r   )Znumpyr   rK   Zpandasrh   r   r   r   r   Zpandas._testingZ_testingr   Zfixturer   r    r"   r$   r%   r   r   r   r   r   r   <module>   s$   



  z h