U
    e»{j:P  ã                   @   s:  d dl Zd dlZd dlmZmZ d dlmZ d dlm	Z
 d dlmZ d dl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 d d	lmZ d
dddddgZddddddgZeddƒeddƒeddƒeddƒeddƒed d!ƒgZ d"Z!d#d$d%d&gZ"ej#ej#fej$ej$fd'ej#fej#d(fd(ej$ fej$ d)fgZ%d*d+„ Z&d,d-„ Z'ej( )d.e"¡d/d0„ ƒZ*d1d2„ Z+d3d4„ Z,d5d6„ Z-ej( )d7e%¡d8d9„ ƒZ.d:d;„ Z/d<d=„ Z0d>d?„ Z1d@dA„ Z2dBdC„ Z3dDdE„ Z4dFdG„ Z5dHdI„ Z6ej( )dJdKdLdMg¡dNdO„ ƒZ7dPdQ„ Z8dRdS„ Z9dTdU„ Z:dVdW„ Z;dXdY„ Z<ej( )dZe=eeƒ¡d[d\„ ƒZ>G d]d^„ d^ƒZ?dS )_é    N)Úassert_allcloseÚassert_array_equal)ÚVersion)Úunits)ÚSkyCoord)ÚCCDDataÚCutout2DÚNoOverlapErrorÚPartialOverlapErrorÚ	add_arrayÚextract_arrayÚoverlap_slicesÚsubpixel_indices)Úassert_quantity_allclose)ÚWCSÚSip)Úproj_plane_pixel_area)ç
×£p=
%@çö(\�Âõ@)ç{®Gáz@çq=
×£ð)@)ç®GázT?@ç…ëQ¸Å?@)çq=
×£pÝ?ç®Gázî?)ç33333s4@ç=
×£p=(@)ç…ëQ¸E@çìQ¸…k8@)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!   r   c                	   C   s*   t jtdd�� tdddƒ W 5 Q R X dS )z>Overlap from arrays with different number of dim is undefined.ú!.*the same number of dimensions.*©Úmatch)r"   r%   r)   ©r#   r!   ©r   r   N©ÚpytestÚraisesÚ
ValueErrorr   © r3   r3   ú^/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/nddata/tests/test_utils.pyÚtest_slices_different_dim9   s    r5   c                	   C   s*   t jtdd�� tdddƒ W 5 Q R X dS )z&Position must have same dim as arrays.r*   r+   )r"   r%   r-   )r   r   r   Nr/   r3   r3   r3   r4   Útest_slices_pos_different_dim?   s    r6   Úposc              	   C   s&   t  t¡� tdd| ƒ W 5 Q R X dS )zAIf there is no overlap between arrays, an error should be raised.©r%   r%   ©r!   r!   N)r0   r1   r	   r   )r7   r3   r3   r4   Útest_slices_no_overlapE   s    r:   c               
   C   sž   t dddƒ} | tdddƒftdddƒffks0t‚t dddd	d
�} | tdddƒftdddƒffksdt‚dD ]0}tjtdd�� t dd|fdd
�} W 5 Q R X qhdS )z1Compute a slice for partially overlapping arrays.©r%   ©r   ©r   r   r!   Nr#   r   Úpartial©Úmode)r   r"   z!.*Arrays overlap only partially.*r+   Ústrict)r   ÚsliceÚAssertionErrorr0   r1   r
   )Útempr7   r3   r3   r4   Útest_slices_partial_overlapL   s    $$ ÿrE   c                  C   sØ  t ddddd�\} }| d j| d j  kr4dks:n t‚| d j| d j  krZdks`n t‚|d j|d j  kr€dks†n t‚|d j|d j  kr¦dks¬n t‚t ddd	dd�\} }| d j| d j  kràd
ksæn t‚| d j| d j  k�r
dk�sn t‚|d j|d j  k�r4dk�s:n t‚|d j|d j  k�r^dk�sdn t‚t dddƒ\} }| d j| d j  k�r˜dk�sžn t‚| d j| d j  k�rÂdk�sÈn t‚|d j|d j  k�rìdk�sòn t‚|d j|d j  k�rdk�sn t‚t dddƒ\} }| d j| d j  k�rPdk�sVn t‚| d j| d j  k�rzdk�s€n t‚|d j|d j  k�r¤dk�sªn t‚|d j|d j  k�rÎdk�sÔn t‚dS )z:
    Test overlap_slices when extracting along edges.
    ©é
   rG   ©r   r   ©r#   r#   rA   r?   r   r#   r   )é   rJ   é   rG   r.   r8   r%   N)r   ÚstartrC   Ústop)Zslc_lgZslc_smr3   r3   r4   Útest_slices_edges[   s(    &&&&&**********rN   c                	   C   s.   t jtdd�� tddddd� W 5 Q R X dS )	z+Call overlap_slices with non-existing mode.z^Mode can be only.*r+   r;   r<   r=   Úfullr?   Nr/   r3   r3   r3   r4   Útest_slices_overlap_wrong_modez   s    rP   Úpositionc              	   C   s&   t  t¡� tdd| ƒ W 5 Q R X dS )zT
    A ValueError should be raised if position contains a non-finite
    value.
    )rK   rK   rH   Nr/   )rQ   r3   r3   r4   Útest_slices_nonfinite_position€   s    rR   c            
      C   s¦   t  d¡} d}ddddddd	d
ddddg}|D ]$\}}t| ||fdd�}t||ƒ q.d}d}d}|gd |g }	t||	ƒD ]&\}}t| ||fddd�}t||ƒ qzdS )úb
    Test overlap_slices (via extract_array) for rounding with an
    even-shaped extraction.
    rG   ©r!   )ç×£p=
×÷?r-   )ç      ø?r-   )çj¼t“ø?r-   )ç×£p=
×ÿ?r-   )ç       @r-   )ç®Gáz @©r!   r   )çìQ¸…ë@r[   )ç      @r[   )ç5^ºI@r[   )çìQ¸…ë@r[   )ç      @r[   )ç®Gáz@r$   r>   r?   ©g®Gáz®ï¿gR¸…ëQà¿g      à¿g\�Âõ(\ß¿g{®Gáz„¿r   )é�ÿÿÿr   )r   r#   r)   rc   ©r@   Ú
fill_valueN©ÚnpÚaranger   r   Úzip©
ÚdataÚshapeZpositions_expectedr7   ÚexpÚoutZ	positionsZexp1Zexp2Úexpectedr3   r3   r4   Ú&test_extract_array_even_shape_rounding‹   s6    
ôÿrp   c            
      C   sª   t  d¡} d}ddddddd	d
ddddg}|D ]$\}}t| ||fdd�}t||ƒ q.d}d}d}|gd |gd  }	t||	ƒD ]&\}}t| ||fddd�}t||ƒ q~dS )rS   rG   r<   )rU   ©r   r#   r!   )rV   rq   )rW   ©r#   r!   r   )rX   rr   )rY   rr   )rZ   rr   )r\   rr   )r]   rr   )r^   ©r!   r   r"   )r_   rs   )r`   rs   )ra   rs   r>   r?   rb   )rc   rc   r   )rc   r   r#   r   r"   rc   rd   Nrf   rj   r3   r3   r4   Ú%test_extract_array_odd_shape_rounding³   s:    
ôÿþrt   c               	   C   sB   t  t¡�} tt d¡dddd� W 5 Q R X dt| jƒks>t‚dS )z*Call extract_array with non-existing mode.r"   rT   r=   rO   r?   z0Valid modes are 'partial', 'trim', and 'strict'.N)	r0   r1   r2   r   rg   rh   ÚstrÚvaluerC   )Úer3   r3   r4   Útest_extract_array_wrong_modeÛ   s     rx   c                  C   sž   t  tt  d¡dddd�t  ddg¡k¡s.t‚dD ]4} t  tt  d¡d| fƒt  | d | g¡k¡s2t‚q2t  tt  d	¡dd
t jd�t  dt jg¡k¡sšt‚dS )ú[Extract 1 d arrays.

    All dimensions are treated the same, so we can test in 1 dim.
    r"   rT   r=   rc   ©re   r   rr   r#   ç      @©r"   r   N)rg   Úallr   rh   ÚarrayrC   Úinf©Úir3   r3   r4   Útest_extract_array_1d_evenâ   s    "ÿ2ÿÿr‚   c               
   C   s   t  tt  d¡dddd�t  dddg¡k¡s0t‚t  tt  d¡dddd�t  dddg¡k¡s`t‚d	D ]:} t  tt  d¡d| fƒt  | d | | d g¡k¡sdt‚qdt  tt  d¡dddd�t  d
ddg¡k¡sÐt‚t  d¡}t|ddƒ}|d dksöt‚t  |d ¡�s
t‚|j|jk�st‚dS )a  Extract 1 d arrays.

    All dimensions are treated the same, so we can test in 1 dim.
    The first few lines test the most error-prone part: Extraction of an
    array on the boundaries.
    Additional tests (e.g. dtype of return array) are done for the last
    case only.
    r"   r<   ©r&   rc   rz   r   r=   r#   r-   r!   r   r{   r|   N)rg   r}   r   rh   r~   rC   ÚisnanÚdtype)r�   ZarrayinÚ	extractedr3   r3   r4   Útest_extract_array_1d_oddò   s(    	ÿÿ$ÿ*ÿ
$ÿ
r‡   c                   C   sd   t  tt  d¡dddd�t  dddg¡k¡s0t‚t  tt  d¡dddd�t  dddg¡k¡s`t‚dS )	z(In 1d, shape can be int instead of tupler"   r   rƒ   rc   rz   r   r&   N©rg   r}   r   rh   r~   rC   r3   r3   r3   r4   Útest_extract_array_1d  s    $ÿ$ÿr‰   c               	   C   sD   t  ddd¡D ]0} t  tt  d¡d| ƒt  dddg¡k¡st‚qdS )	zinteger is at bin centerg®Gáz@gìQ¸…ë@çš™™™™™¹?r%   r   r!   r"   N)rg   rh   r}   r   r~   rC   )Úar3   r3   r4   Útest_extract_Array_float  s    rŒ   c               	   C   sš   t  tt  d¡dddd�t  dg¡k¡s,t‚dD ]8} t  tt  d¡d| fdd�t  | d | g¡k¡s0t‚q0t  tt  d	¡dd
dd�t  dg¡k¡s–t‚dS )ry   r"   rT   r=   Útrimr?   r   rr   r#   r{   r|   r   Nrˆ   r€   r3   r3   r4   Útest_extract_array_1d_trim   s    ,(ÿ
 ÿrŽ   r@   r>   r�   rA   c                 C   sN   t  d¡}t  d¡}||dd…dd…f< t|dd| d�}t  ||k¡sJt‚dS )zq
    Test extract_array utility function.

    Test by extracting an array of ones out of an array of zeros.
    ©é   r�   r8   r   rJ   r?   N)rg   ÚzerosÚonesr   r}   rC   )r@   Úlarge_test_arrayÚsmall_test_arrayZextracted_arrayr3   r3   r4   Útest_extract_array_easy/  s
    

r•   c                  C   sÎ   t jdtd�} t  dd¡D ]&}t| d|ddd�\}}|d	kst‚qtd
ddgdddgƒD ].\}}t| d|fddd�\}}||fksXt‚qXtt  dd¡dƒD ].\}}t| d|fddd�\}}||fksšt‚qšdS )z·Check that the return position is calculated correctly.

    The result will differ by mode. All test here are done in 1d because it's
    easier to construct correct test cases.
    r%   ©r…   r&   r)   r   r>   T)r@   Zreturn_position)r#   rU   g)\�Âõ(ø?g\�Âõ(\ß?gR¸…ëQà?r#   rT   rA   )r&   r   r#   r#   r#   r#   r#   r<   r�   N)rg   rh   Úfloatr   rC   ri   )r“   r�   r†   Únew_posro   r3   r3   r4   Útest_extract_array_return_pos=  s8        ÿ
    ÿ
    ÿ
r™   c               	   C   sP   t tjƒt dƒkrLd} tjt| d��" ttjdtd�ddtj	d� W 5 Q R X d S )	Nz1.20z9fill_value cannot be set to np.nan if the input array hasr+   rF   r–   r8   rI   rz   )
r   rg   Ú__version__r0   r1   r2   r   r’   ÚintÚnan)Úmsgr3   r3   r4   Ú test_extract_array_nan_fillvalueW  s       ÿrž   c                  C   sZ   t  d¡} t  d¡}|  ¡ }|dd…dd…f  |7  < t| |dƒ}t  ||k¡sVt‚dS )zi
    Test add_array utility function.

    Test by adding an array of ones out of an array of zeros.
    r�   r8   r   rJ   N©rg   r‘   r’   Úcopyr   r}   rC   ©r“   r”   Zlarge_test_array_refZadded_arrayr3   r3   r4   Útest_add_array_odd_shape`  s    

r¢   c                  C   sj   t  d¡} t  d¡}|  ¡ }|dd…dd…f  |dd…dd…f 7  < t| |dƒ}t  ||k¡sft‚dS )úl
    Test add_array_2D utility function.

    Test by adding an array of ones out of an array of zeros.
    r�   )r"   r"   r   r!   r"   r.   NrŸ   r¡   r3   r3   r4   Útest_add_array_even_shapeo  s    

,r¤   c                  C   sF   t  d¡} t  d¡}|  ¡ }||7 }t| |dƒ}t  ||k¡sBt‚dS )r£   r�   r8   NrŸ   r¡   r3   r3   r4   Útest_add_array_equal_shape~  s    

r¥   ©rQ   Zsubpixel_indexc                 C   s   t  t| tƒ|k¡st‚dS )z�
    Test subpixel_indices utility function.

    Test by asserting that the function returns correct results for
    given test values.
    N)rg   r}   r   ÚsubsamplingrC   r¦   r3   r3   r4   Útest_subpixel_indices�  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d%S )&ÚTestCutout2Dc                 C   s„  t  d¡ dd¡| _tddd�| _tdd�}t jd	 }d
}|t  |¡ | t  	|¡ g|t  	|¡ |t  |¡ gg|j
_ddg|j
_| jj tj¡| jj tj¡g|j
_ddg|j
_|| _
| ¡ }ddg|j
_t  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g¡}t  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g¡}t||d d |j
jƒ|_|j
 ¡  || _d S )*Ng      4@r%   r"   z13h11m29.96s -01d19m18.7sZicrs)Úframer!   )Znaxisr`   g2.‘ZŠ í>zRA---TANzDEC--TANr   zRA---TAN-SIPzDEC--TAN-SIPr   gcÏ)Åžl>gAÛáŒÄ=gÂóNÕqL½g”¯—˜ù>gÇ¢%�ð¾=gÈÞ{³p8b=ç        gé�Õ2�¾gùåÎöÄá=gaR¾"‹=gW.ò¹2Lð½gdV>OY!c=gT¥•ÆS½gbñ²Yzaÿ>g@¼¼ˆU]ð½gð=³”ri=g	!’‘ö†¾g¤&ûYÑ=gé£å$-½g»ˆ
o+Ý>guŽM/õ½g<�Cå½H½g>ä”�˜YÃ=g3--ëÂ”/=gÝ3;6Ød½)rg   rh   Zreshaperk   r   rQ   r   ÚpiÚcosÚsinÚwcsÚcdÚctypeÚraZto_valueÚuÚdegÚdecÚcrvalÚcrpixÚdeepcopyr~   r   ÚsipÚsetÚsipwcs)Úselfr¯   ÚrhoÚscaler»   r‹   Úbr3   r3   r4   Úsetup_class›  sF    

þþûÿ	ûÿ	
zTestCutout2D.setup_classc                 C   s<  ddt j ddt j dt j fddt j fdg}|D �] }d}t| j||ƒ}|jjdks\t‚|jd dksnt‚|jdks|t‚|jdksŠt‚|j	|ks˜t‚t
|jd	ƒ |jd
ks²t‚|jdksÀt‚|jd
ksÎt‚|jdksÜt‚|jdksêt‚|jdksøt‚|jtddƒtddƒfk�st‚|jtddƒtddƒfks4t‚q4d S )Nr   rH   r`   )g333333@gffffff
@)gÍÌÌÌÌÌ @gffffffþ?rI   rG   r.   )gš™™™™™ñ?gÍÌÌÌÌÌì?)rY   rY   )ç      ð?rÁ   )©r#   r   rÂ   )r    r    r#   r"   r   )r³   ÚpixelZpixr   rk   rl   rC   Zorigin_originalZorigin_cutoutZinput_position_originalr   Zinput_position_cutoutZposition_originalZposition_cutoutÚcenter_originalÚcenter_cutoutZbbox_originalZbbox_cutoutÚslices_originalrB   Úslices_cutout)r¼   ÚsizesÚsizerQ   Úcr3   r3   r4   Útest_cutoutÆ  s0    ú
 zTestCutout2D.test_cutoutc              	   C   s(   t  t¡� t| jddƒ W 5 Q R X d S )Nr9   )r#   r#   r#   )r0   r1   r2   r   rk   ©r¼   r3   r3   r4   Útest_size_lengthá  s    zTestCutout2D.test_size_lengthc              
   C   sF   dt j ddt j ffD ](}t t¡� t| jd|ƒ W 5 Q R X qd S )Nr   r9   )r³   ÚcmÚKr0   r1   r2   r   rk   )r¼   rÉ   r3   r3   r4   Útest_size_unitså  s    zTestCutout2D.test_size_unitsc                 C   sŠ   dt j dt j t j  }t| jd|ƒ}|jjdks8t‚|jd dksJt‚|jtddƒtddƒfksht‚|j	td	d
ƒtd	d
ƒfks†t‚dS )z4
        Check size in derived pixel units.
        g333333Ó?rŠ   r9   rH   r.   r%   r#   r"   r   r   N)
r³   ÚarcsecrÃ   r   rk   rl   rC   rÆ   rB   rÇ   )r¼   rÉ   rÊ   r3   r3   r4   Útest_size_pixelê  s    zTestCutout2D.test_size_pixelc                 C   s|   t | jddtj | jd�}|jjdks*t‚|jd dks<t‚|jtddƒtddƒfksZt‚|j	tdd	ƒtdd	ƒfksxt‚d S )
Nr9   rŠ   ©r¯   r.   r%   r#   r   r   r!   )
r   rk   r³   rÑ   r¯   rl   rC   rÆ   rB   rÇ   ©r¼   rÊ   r3   r3   r4   Útest_size_angleõ  s
    zTestCutout2D.test_size_anglec              	   C   s2   t  t¡� t| jdddtj fƒ W 5 Q R X d S )Nr9   r   )r0   r1   r2   r   rk   r³   rÑ   rÌ   r3   r3   r4   Útest_size_angle_without_wcsü  s    z(TestCutout2D.test_size_angle_without_wcsc                 C   st   t | jdddd�}|jjdks"t‚|jd dks4t‚|jtddƒtddƒfksRt‚|jtddƒtddƒfkspt‚d S )Nr.   rH   r�   r?   r9   r   r!   ©r   rk   rl   rC   rÆ   rB   rÇ   rÔ   r3   r3   r4   Útest_cutout_trim_overlap   s
    z%TestCutout2D.test_cutout_trim_overlapc                 C   st   t | jdddd�}|jjdks"t‚|jd dks4t‚|jtddƒtddƒfksRt‚|jtdd	ƒtdd	ƒfkspt‚d S )
Nr.   rH   r>   r?   rI   r   r!   r#   r   r×   rÔ   r3   r3   r4   Útest_cutout_partial_overlap  s
    z(TestCutout2D.test_cutout_partial_overlapc                 C   sP   d}t | jddd|d�}|jjdks(t‚|jd dks:t‚|jd |ksLt‚d S )Nrc   r.   rH   r>   rd   rI   r   )r   rk   rl   rC   )r¼   re   rÊ   r3   r3   r4   Ú&test_cutout_partial_overlap_fill_value  s
    z3TestCutout2D.test_cutout_partial_overlap_fill_valuec                 C   sŽ   t  | j¡}t|ddƒ}d}d}||j|< | |¡}|d d d… }|| |ksRt‚t  | j¡}t| jdddd�}||j|< || |ksŠt‚d S )Nr[   rH   r.   g      Y@r&   T)r    )rg   r    rk   r   Úto_original_positionrC   )r¼   rk   rÊ   Úxyrv   Zxy_origZyxÚc2r3   r3   r4   Ú	test_copy  s    


zTestCutout2D.test_copyc                 C   s4   d}t | j|dƒ}d}| | |¡¡}t||ƒ d S )Nr9   rH   r.   )r   rk   Zto_cutout_positionrÛ   r   )r¼   rQ   rÊ   rÜ   Úresultr3   r3   r4   Útest_to_from_large$  s
    zTestCutout2D.test_to_from_largec              	   C   s*   t  t¡� t| j| jdƒ W 5 Q R X d S )NrH   )r0   r1   r2   r   rk   rQ   rÌ   r3   r3   r4   Útest_skycoord_without_wcs+  s    z&TestCutout2D.test_skycoord_without_wcsc                 C   sr   t | j| jd| jd�}| j |jd |jd | j¡}| j |jd |jd |j¡}t|j|jƒ t|j	|j	ƒ d S )NrH   rÓ   r#   r   ©
r   rk   rQ   r¯   Ú
from_pixelrÄ   rÅ   r   r²   rµ   ©r¼   rÊ   Úskycoord_originalÚskycoord_cutoutr3   r3   r4   Útest_skycoord/  s      ÿ  ÿzTestCutout2D.test_skycoordc                 C   st   t | j| jd| jdd�}| j |jd |jd | j¡}| j |jd |jd |j¡}t|j|jƒ t|j	|j	ƒ d S )NrH   r>   ©r¯   r@   r#   r   râ   rä   r3   r3   r4   Útest_skycoord_partial:  s      ÿ  ÿz"TestCutout2D.test_skycoord_partialc                 C   s:   d}d}t | j| j||f| jd�}|jj||fks6t‚d S )Nr!   r   rÓ   )r   rk   rQ   r¯   Zarray_shaperC   )r¼   ZxsizeZysizerÊ   r3   r3   r4   Útest_naxis_updateE  s    zTestCutout2D.test_naxis_updatec                 C   sv   t | jdd| jdd�j}t t|ƒ¡}t|j|jj	d	žŽ |jj
dd| d� t|j|jj	d
žŽ |jj
dd| d� d S )Nr.   rH   r>   rè   r#   r«   g�íµ ÷Æ°>)ZrtolZatol)r#   )r#   )r   rk   r»   r¯   rg   Úsqrtr   r   Zwcs_pix2worldr·   r¶   Zall_pix2world)r¼   ÚwZpscaler3   r3   r4   Útest_crpix_maps_to_crvalK  s       ÿ   ÿz%TestCutout2D.test_crpix_maps_to_crvalc                 C   s|   t | j| jdd�}t|| jdƒ}| j |jd |jd | j¡}| j |jd |jd |j¡}t|j	|j	ƒ t|j
|j
ƒ d S )NZadu)rk   r¯   ÚunitrH   r#   r   )r   rk   r¯   r   rQ   rã   rÄ   rÅ   r   r²   rµ   )r¼   ZccdrÊ   rå   ræ   r3   r3   r4   Ú test_cutout_with_nddata_as_inputU  s      ÿ  ÿz-TestCutout2D.test_cutout_with_nddata_as_inputN)Ú__name__Ú
__module__Ú__qualname__rÀ   rË   rÍ   rÐ   rÒ   rÕ   rÖ   rØ   rÙ   rÚ   rÞ   rà   rá   rç   ré   rê   rí   rï   r3   r3   r3   r4   r©   š  s$   +
r©   )@Únumpyrg   r0   Znumpy.testingr   r   Zpackaging.versionr   Zastropyr   r³   Zastropy.coordinatesr   Zastropy.nddatar   r   r	   r
   r   r   r   r   Zastropy.tests.helperr   Zastropy.wcsr   r   Zastropy.wcs.utilsr   Ztest_positionsZtest_position_indicesrB   Ztest_slicesr§   Ztest_pos_badrœ   r   Ztest_nonfinite_positionsr5   r6   ÚmarkZparametrizer:   rE   rN   rP   rR   rp   rt   rx   r‚   r‡   r‰   rŒ   rŽ   r•   r™   rž   r¢   r¤   r¥   ri   r¨   r©   r3   r3   r3   r4   Ú<module>   s~   (
ú	ú	



ú



((

	 ÿ

