o
    1ήcq                     @   s   d Z ddlZddlmZ ddlmZ ddlZddlmZ ddl	m
Z
 ddlmZmZmZ dd	 ZdddZdd ZG dd dZG dd dZG dd dZG dd dZG dd dZG dd dZG dd dZdS )z
Tests for array coercion, mainly through testing `np.array` results directly.
Note that other such tests exist e.g. in `test_api.py` and many corner-cases
are tested (sometimes indirectly) elsewhere.
    N)param)product)rational)_discover_array_parameters)assert_array_equalassert_warnsIS_PYPYc                  #   s    dd } t | ddV  G dd dtj  fdd}|V  G d	d
 d
}G dd d|}t |ddV  t tddV  G dd d|}t |ddV  G dd d|}t |ddV  dS )z
    Generator for functions converting an array into various array-likes.
    If full is True (default) includes array-likes not capable of handling
    all dtypes
    c                 S   s   | S N ar
   r
   K/tmp/pip-target-vg8gfxp4/lib/python/numpy/core/tests/test_array_coercion.pyndarray      zarraylikes.<locals>.ndarrayr   idc                   @      e Zd ZdS )zarraylikes.<locals>.MyArrN__name__
__module____qualname__r
   r
   r
   r   MyArr!       r   c                    s
   |   S r	   )viewr   r   r
   r   subclass$      
zarraylikes.<locals>.subclassc                   @   s   e Zd Zdd Zdd ZdS )z!arraylikes.<locals>._SequenceLikec                 S      t r	   	TypeErrorselfr
   r
   r   __len__-   r   z)arraylikes.<locals>._SequenceLike.__len__c                 S   r   r	   r   r    r
   r
   r   __getitem__0   r   z-arraylikes.<locals>._SequenceLike.__getitem__Nr   r   r   r"   r#   r
   r
   r
   r   _SequenceLike)   s    r%   c                   @   s   e Zd Zdd ZdddZdS )zarraylikes.<locals>.ArrayDunderc                 S   s
   || _ d S r	   r   r!   r   r
   r
   r   __init__5   r   z(arraylikes.<locals>.ArrayDunder.__init__Nc                 S   s   | j S r	   r   )r!   dtyper
   r
   r   	__array__8   s   z)arraylikes.<locals>.ArrayDunder.__array__r	   )r   r   r   r'   r)   r
   r
   r
   r   ArrayDunder4   s    r*   r)   
memoryviewc                   @      e Zd Zdd ZdS )z"arraylikes.<locals>.ArrayInterfacec                 S      || _ |j| _d S r	   )r   __array_interface__r&   r
   r
   r   r'   B      z+arraylikes.<locals>.ArrayInterface.__init__Nr   r   r   r'   r
   r
   r
   r   ArrayInterfaceA       r1   r.   c                   @   r,   )zarraylikes.<locals>.ArrayStructc                 S   r-   r	   )r   __array_struct__r&   r
   r
   r   r'   J   r/   z(arraylikes.<locals>.ArrayStruct.__init__Nr0   r
   r
   r
   r   ArrayStructI   r2   r4   r3   N)r   npr   r+   )r   r   r%   r*   r1   r4   r
   r   r   
arraylikes   s   r6   Tc                 c   sl   t ttdddV  t ttdddV  t ttdddV  |r7t ttdddV  t ttdddV  t ttdd	dV  |r`t tt	dd
dV  t t
dddV  t tdddV  t tdddV  t tdddV  t tdddV  t tdddV  t tdddV  t tdddV  |rt tddddV  tdgdd }t|tjsJ |jtdksJ t |ddV  | rt tdddV  t tddddV  t tddddV  t tdd dV  t td!d"d#dV  t td$d%dV  t td&d'dV  t td(d)dV  d S )*N   float16r   float32float64
longdoubley       @      @	complex64
complex128clongdouble   int8int16int32int64uint8uint16uint32uint64   r   )rH      zi,ir   
structuredtimedelta64[generic]   stimedelta64[s]NaTtimedelta64[s](NaT)datetime64[generic](NaT)z2020-06-07 12:43mszdatetime64[ms]s   1234bytes2345unicodes   4321unstructured_void)r   r5   sqrtr8   r9   r:   r;   r<   r=   longcomplexr@   rA   rB   rC   rD   rE   rF   rG   r   array
isinstancevoidr(   timedelta64
datetime64bytes_unicode_)timesextended_precision
user_dtyperJ   r
   r
   r   scalar_instancesQ   sB   rc   c                 C   s6   | j dkrdS t| jtjtjfr| jdrdS dS )zpReturns True if the the dtype is a parametric legacy dtype (itemsize
    is 0, or a datetime without units)
    r   T64F)itemsize
issubclasstyper5   r]   r\   nameendswithr(   r
   r
   r   is_parametric_dtype   s   
rk   c                   @   s   e Zd Zejjde ddd ddgg ddd	d
 Zejjde ddd ddgg dddd Zejde	 dd Z
dS )TestStringDiscoveryobj333333?
   +   Nstring)objectz1.2z10**43Nonerq   )idsc                 C   s   t t|}td| }tj|ddj|ksJ tj|gddj|ks'J tj|dd}tj|ddj|ks:J |dj|ksDJ d S )NSrj   O)lenstrr5   r(   rY   astyper!   rm   lengthexpectedarrr
   r
   r   test_basic_stringlength   s   z+TestStringDiscovery.test_basic_stringlengthc                 C   sJ   t t|}td| }tj|dd}tj||gddj|ks#J d S )Nru   rv   rj   )rw   rx   r5   r(   rY   rz   r
   r
   r   test_nested_arrays_stringlength   s    z3TestStringDiscovery.test_nested_arrays_stringlength	arraylikec                 C   sr   t d g}t d|d< tt|d }t d| }||}t j|gdd}|jdks0J |j|ks7J d S )Nrn   r   ru   rj   rH   rH   )r5   rY   rw   rx   r(   shape)r!   r   rm   r{   r|   r}   r
   r
   r   test_unpack_first_level   s   z+TestStringDiscovery.test_unpack_first_level)r   r   r   pytestmarkparametrizerr   r~   r   r6   r   r
   r
   r
   r   rl      s    

rl   c                   @   s   e Zd Zdd Zdd Zdd Zdd Zej	d	e
 d
d Zejddd Zej	d	e
 dd Zejjeddejdej	de
 dd Zej	dddddd gdd Zej	dejd d d! Zej	d"ejd# d$d% Zd&S )'TestScalarDiscoveryc                 C   s>   t jddd}|jdksJ t jdgdd}|jdksJ d S )N)rH   r?   rI   zi,i,irj   r
   rH   )r5   rY   r   r!   r}   r
   r
   r   test_void_special_case   s   z*TestScalarDiscovery.test_void_special_casec                 C   s^   t jddd}|jdksJ |jjdksJ t jdgdd}|jdks%J |jjdks-J d S )Nrq   crj      )rH   r   )r5   rY   r   r(   charr   r
   r
   r   test_char_special_case   s   z*TestScalarDiscovery.test_char_special_casec                 C   s   dg}t tjd D ]}|g}q
tj|dd}|jdtjd  d ks%J tt tj|gdd W d    d S 1 s>w   Y  d S )Nrq   r?   r   rj   r   rH   r   )ranger5   MAXDIMSrY   r   r   raises
ValueError)r!   nestedir}   r
   r
   r   test_char_special_case_deep   s   "z/TestScalarDiscovery.test_char_special_case_deepc                 C   s2   t t }|jdksJ |jt dksJ d S )Nr
   rv   )r5   rY   rr   r   r(   r   r
   r
   r   test_unknown_object   s   z'TestScalarDiscovery.test_unknown_objectscalarc                 C   sZ   t |}|jdksJ |j|jksJ t ||gg}|jdks#J |j|jks+J d S )Nr
   rH   r?   )r5   rY   r   r(   )r!   r   r}   r
   r
   r   test_scalar   s   
zTestScalarDiscovery.test_scalarz)ignore:Promotion of numbers:FutureWarningc                 C   s   t t t D ]]\}}|jd |jd }}z	t||g}W n ttfy*   Y qw |jdks2J z|j|j}}t	||}|j|ksGJ W q tyd } z|jtdksZJ W Y d }~qd }~ww d S )Nr   r?   rv   )
r   rc   valuesr5   rY   r   r   r   r(   promote_types)r!   sc1sc2r}   dt1dt2expected_dtypeer
   r
   r   test_scalar_promotion   s"    z)TestScalarDiscovery.test_scalar_promotionc                 C   s   t |tjrt||d d }t|tu rtd tj|td	|j
}t|d}t|g}tjd|j
d}||d< tjd|j
d}|g|d d < t|| t|| t|| t|| d S )Nr?   g      ?z/Rational to object cast is undefined currently.rj   rH   r   )rZ   r5   inexactrg   r   r   xfailrY   rr   ry   r(   reshapeemptyr   )r!   r   r}   arr1arr2arr3arr4r
   r
   r   test_scalar_coercion  s   



z(TestScalarDiscovery.test_scalar_coercionz%`int(np.complex128(3))` fails on PyPyreasonzignore::numpy.ComplexWarningcast_toc                 C   s  |j }tddD ]}|jd }|jtjkrM|j jdurM|jdu rMtt	 t
|| W d   n1 s8w   Y  tj
||d tj
|g|d qz
t
||}W nz t	ttfy   tt tj
||d W d   n1 sxw   Y  t|trt|tjrY  dS tt tj
|g|d W d   n1 sw   Y  tjd|d}tt ||d< W d   Y  dS 1 sw   Y  Y  dS w tj
||d}t|| tjd|d}||d< t|| qdS )aP  
        Test that in most cases:
           * `np.array(scalar, dtype=dtype)`
           * `np.empty((), dtype=dtype)[()] = scalar`
           * `np.array(scalar).astype(dtype)`
        should behave the same.  The only exceptions are paramteric dtypes
        (mainly datetime/timedelta without unit) and void without fields.
        F)r`   r   Nrj   r
   )r(   rc   r   rg   r5   r[   fieldsr   r   r   rY   ry   r   RuntimeError	ExceptionrZ   r   
issubdtypesignedintegerzerosr   )r!   r   r(   r   castresr}   assr
   r
   r   0test_scalar_coercion_same_as_cast_and_assignment  sL   




zDTestScalarDiscovery.test_scalar_coercion_same_as_cast_and_assignmentpyscalarro   gp=
ף$@y        HzG$@d   c                 C   s:   G dd dt |}t||}t|}t|| dS )a  NumPy arrays are read/write which means that anything but invariant
        behaviour is on thin ice.  However, we currently are happy to discover
        subclasses of Python float, int, complex the same as the base classes.
        This should potentially be deprecated.
        c                   @   r   )z>TestScalarDiscovery.test_pyscalar_subclasses.<locals>.MyScalarNr   r
   r
   r
   r   MyScalar`  r   r   N)rg   r5   rY   r   )r!   r   r   r   r|   r
   r
   r   test_pyscalar_subclassesY  s   
z,TestScalarDiscovery.test_pyscalar_subclasses
dtype_charAllc                 C   sh   |dv rt |d }n|dkrt d}nt |}tg t|\}}||ks*J |j|jks2J d S )NSU1VV8)r5   r(   r   rg   re   )r!   r   r(   discovered_dtype_r
   r
   r   test_default_dtype_instanceg  s   
z/TestScalarDiscovery.test_default_dtype_instancer(   Integerc              	   C   s   t |}t d}t t j}||fD ]P}t j||d}t ||}t|| t	t
tf t j|g|d W d   n1 sDw   Y  t	t
tf ||d< W d   n1 s_w   Y  qdS )z
        Signed integers are currently different in that they do not cast other
        NumPy scalar, but instead use scalar.__int__(). The hardcoded
        exception to this rule is `np.array(scalar, dtype=integer)`.
        rj   Nr
   )r5   r(   	ulonglongr:   nanrY   ry   r   r   r   r   OverflowError)r!   r(   invalid_int	float_nanr   coercedr   r
   r
   r   'test_scalar_to_int_coerce_does_not_castw  s   



z;TestScalarDiscovery.test_scalar_to_int_coerce_does_not_castN)r   r   r   r   r   r   r   r   r   r   rc   r   filterwarningsr   r   r   r   r   r   r5   	typecodesr   r   r
   r
   r
   r   r      s*    




8

r   c                   @   sF  e Zd Zejdejejgejde	e
dddde	e
dddde	edd	d
de	eddddgdd Zejdejejgejde	e
dddde	e
dd	ddgdd Zejdddgejddge	dddde	ddddgdd Zejddge	dddde	ddddgdd Zd S )!TestTimeScalarsr(   r   rO   rM   rP   r   {   rN   genericrQ   rH   Dzdatetime64[D]c                 C   s   t j||d}t ||}t|| t jd|d}t|t jr=tt	 ||d< W d    d S 1 s6w   Y  d S ||d< t|| d S Nrj   r
   )
r5   rY   ry   r   onesrf   integerr   r   r   r!   r(   r   r}   r   r   r
   r
   r   test_coercion_basic  s   	

"z#TestTimeScalars.test_coercion_basicnsztimedelta64[ns]   rK   c                 C   sL   t j||d}t ||}t jd|d}||d< t|| t|| d S r   )r5   rY   ry   r   r   r   r
   r
   r   )test_coercion_timedelta_convert_to_number  s   
z9TestTimeScalars.test_coercion_timedelta_convert_to_numberS6U6valunitz[s]z[D]c                 C   s   t ||}t |}|t|d d }t j||d}|d |ks%J t jd|d}||d< |d |ks8J tt	 t |
| W d    d S 1 sQw   Y  d S )Nr   rj   r
   )r5   r]   r(   rg   rx   rY   r   r   r   r   ry   )r!   r   r   r(   r   
cut_stringr}   r   r
   r
   r   !test_coercion_assignment_datetime  s   

"z1TestTimeScalars.test_coercion_assignment_datetimec                 C   sv   t ||}t j|dd t |d}t jddd}||d< |dd d }|d |ks1J |d |ks9J d S )Nr   rj   r
   ru   r   )r5   r\   rY   ry   r   )r!   r   r   r   r   r   r|   r
   r
   r   "test_coercion_assignment_timedelta  s   z2TestTimeScalars.test_coercion_assignment_timedeltaN)r   r   r   r   r   r   r5   rC   r9   r   r\   r]   r   r   r   r   r
   r
   r
   r   r     s4    r   c                   @   s\   e Zd Zdd Zdd Zejde dd Z	ejde dd	 Z
d
d Zdd ZdS )
TestNestedc                 C   s   dg}|}t tjd D ]}|g}qtj|dd}|jdtj ks#J tt tj|gdd W d    n1 s;w   Y  ttj	 t|g}W d    n1 sVw   Y  |j
t
dkseJ |jdtj ksoJ | |u swJ d S )Nrn   rH   r:   rj   r   rv   )r   r5   r   rY   r   r   r   r   r   VisibleDeprecationWarningr(   item)r!   initialr   r   r}   r
   r
   r   test_nested_simple  s   zTestNested.test_nested_simplec                 C   sf   g }| | tj|||gtd}|jddtjd   ksJ tj|d g|gtd}|jdks1J d S )Nrj   rI   r   rH   )rI   rH   )appendr5   rY   rr   r   r   )r!   lr}   r
   r
   r   !test_pathological_self_containing  s   
z,TestNested.test_pathological_self_containingr   c                 C   s   |t d}|}tt jd D ]}|g}qtt t j|dd W d    n1 s-w   Y  t j|td}|j	dt j ksCJ |
 t |
 ksPJ d S )Nr   rH   r:   rj   r   )r5   r   r   r   r   warnsDeprecationWarningrY   rr   r   r   )r!   r   r   r   r   r}   r
   r
   r   test_nested_arraylikes  s   	z!TestNested.test_nested_arraylikesc                 C   s   t dd}||}t j||ggtd}|jdksJ |d |u s%J t|d tu s/J t	t
 t j|||ggtd W d    d S 1 sKw   Y  d S )N   )r?   r?   rj   r   r   rH   )r5   aranger   rY   rr   r   rg   listr   r   r   )r!   r   r}   outr
   r
   r   test_uneven_depth_ragged  s   "z#TestNested.test_uneven_depth_raggedc                 C   sp   t jg dgdgggtd}|jdksJ tt t jg t dgtd W d    d S 1 s1w   Y  d S )NrH   rj   r   )r   rH   )r5   rY   rr   r   r   r   r   r   r   r
   r
   r   test_empty_sequence)  s
   "zTestNested.test_empty_sequencec                 C   s   t d}t d}t d}t||gt dd\}}|dks"J t||gt dd\}}|dks5J t j||gt dd}|d |u sIJ |d	 |u sQJ d S )
N)rI   r?   r   )rI   rI   rv   rj   )r?   rI   r   r   rH   )r5   r   r   r(   asarray)r!   r}   mismatch_first_dimmismatch_second_dimr(   r   r   r
   r
   r   test_array_of_different_depths2  s   




z)TestNested.test_array_of_different_depthsN)r   r   r   r   r   r   r   r   r6   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S )TestBadSequencesc                    sd   g  G  fdddt } |ddg tt t  W d    d S 1 s+w   Y  d S )Nc                          e Zd Z fddZ  ZS )z2TestBadSequences.test_growing_list.<locals>.mylistc                    s    ddg t  S )NrH   r?   )r   superr"   r    	__class__rm   r
   r   r"   R  s   
z:TestBadSequences.test_growing_list.<locals>.mylist.__len__r   r   r   r"   __classcell__r
   rm   r   r   mylistQ      r  rH   r?   r   r   r   r   r   r5   rY   r!   r  r
   r  r   test_growing_listN  s   "z"TestBadSequences.test_growing_listc                    sr   g  G  fdddt } ddg  |ddg tt t  W d    d S 1 s2w   Y  d S )Nc                       r   )z2TestBadSequences.test_mutated_list.<locals>.mylistc                    s   ddgd< t   S )Nr?   rI   r   )r   r"   r    r   r
   r   r"   c  s   
z:TestBadSequences.test_mutated_list.<locals>.mylist.__len__r  r
   r  r  r   r  b  r  r  r?   rI   rH   r  r  r
   r  r   test_mutated_list_  s   "z"TestBadSequences.test_mutated_listc                    sf   g  G  fddd}  td| g tt t  W d    d S 1 s,w   Y  d S )Nc                           e Zd Z fddZdd ZdS )z7TestBadSequences.test_replace_0d_array.<locals>.baditemc                    s   d d d< t d)Nr?   r   znot actually a sequence!)r   r    r  r
   r   r"   p  s   z?TestBadSequences.test_replace_0d_array.<locals>.baditem.__len__c                 S      d S r	   r
   r    r
   r
   r   r#   t  r   zCTestBadSequences.test_replace_0d_array.<locals>.baditem.__getitem__Nr$   r
   r  r
   r   baditemo  s    r  r?   )r   r5   rY   r   r   r   )r!   r  r
   r  r   test_replace_0d_arrayl  s   
"z&TestBadSequences.test_replace_0d_arrayN)r   r   r   r	  r
  r  r
   r
   r
   r   r   H  s    r   c                   @   s   e Zd Zejde dd Zdd Zdd Z	ejj
eejjdk d	d
dd Zejdg dejdeegdd Zejdeegdd ZdS )TestArrayLikesr   c                 C   sN   t d}||}t j|td}t|| t j|gtd}|d |u s%J d S )N        rj   r   )r5   rY   rr   r   )r!   r   r}   rm   r   r
   r
   r   test_0d_object_special_case  s   

z*TestArrayLikes.test_0d_object_special_casec                 C   s   G dd dt j}t d}||}t |}t|| tt t |g W d    n1 s3w   Y  t|}t |}t|| tt	 t |g W d    d S 1 s]w   Y  d S )Nc                   @   r,   )zBTestArrayLikes.test_0d_generic_special_case.<locals>.ArraySubclassc                 S      t d)Nze.g. quantities raise on thisr   r    r
   r
   r   	__float__  s   zLTestArrayLikes.test_0d_generic_special_case.<locals>.ArraySubclass.__float__N)r   r   r   r  r
   r
   r
   r   ArraySubclass  r2   r  r  )
r5   r   rY   r   r   r   r   r   r+   r   )r!   r  r}   rm   r   r
   r
   r   test_0d_generic_special_case  s   





"z+TestArrayLikes.test_0d_generic_special_casec                 C   s   t t j}|d t ju sJ t t jg}|d t ju sJ G dd d}t |}|d |u s3J t |g}|d |u sAJ d S )Nr
   r   c                   @   s,   e Zd Zedd Zedd Zdd ZdS )z8TestArrayLikes.test_arraylike_classes.<locals>.ArrayLikec                 S   r  r	   r
   r    r
   r
   r   r.        zLTestArrayLikes.test_arraylike_classes.<locals>.ArrayLike.__array_interface__c                 S   r  r	   r
   r    r
   r
   r   r3     r  zITestArrayLikes.test_arraylike_classes.<locals>.ArrayLike.__array_struct__c                 S   r  r	   r
   r    r
   r
   r   r)     r   zBTestArrayLikes.test_arraylike_classes.<locals>.ArrayLike.__array__N)r   r   r   propertyr.   r3   r)   r
   r
   r
   r   	ArrayLike  s    

r  )r5   rY   rC   )r!   r}   r  r
   r
   r   test_arraylike_classes  s   
z%TestArrayLikes.test_arraylike_classes   zNeeds 64bit platformr   c              	   C   s   t jddd}t |d}tdD ]7}tt t | W d   n1 s(w   Y  tt t |g W d   n1 sCw   Y  qdS )z0Test the error paths, including for memory leaksr   rD   rj   l            r7   N)r5   rY   broadcast_tor   r   r   MemoryError)r!   r}   r   r
   r
   r    test_too_large_array_error_paths  s   z/TestArrayLikes.test_too_large_array_error_paths	attribute)r.   r)   r3   errorc                    sP   G  fddd}t  t|  W d    d S 1 s!w   Y  d S )Nc                       s    e Zd Z fddZ  ZS )zCTestArrayLikes.test_bad_array_like_attributes.<locals>.BadInterfacec                    s   |krt  | d S r	   )r   __getattr__)r!   attr)r   r  r  r
   r   r     s   zOTestArrayLikes.test_bad_array_like_attributes.<locals>.BadInterface.__getattr__)r   r   r   r   r  r
   r  r  r  r   BadInterface  s    r#  r   r   r5   rY   )r!   r  r  r#  r
   r"  r   test_bad_array_like_attributes  s   "z-TestArrayLikes.test_bad_array_like_attributesc                    sN   G  fddd}t   t|  W d    d S 1 s w   Y  d S )Nc                       r  )zBTestArrayLikes.test_bad_array_like_bad_length.<locals>.BadSequencec                    s    r	   r
   r    r  r
   r   r"     r   zJTestArrayLikes.test_bad_array_like_bad_length.<locals>.BadSequence.__len__c                 S   s   dS )NrH   r
   r    r
   r
   r   r#     r  zNTestArrayLikes.test_bad_array_like_bad_length.<locals>.BadSequence.__getitem__Nr$   r
   r&  r
   r   BadSequence  s    r'  r$  )r!   r  r'  r
   r&  r   test_bad_array_like_bad_length  s   "z-TestArrayLikes.test_bad_array_like_bad_lengthN)r   r   r   r   r   r   r6   r  r  r  skipifr5   r(   intpre   r  RecursionErrorr  r%  r(  r
   r
   r
   r   r  ~  s     

r  c                   @   s0   e Zd ZG dd dZG dd dZdd ZdS )!TestSpecialAttributeLookupFailurec                   @      e Zd Zedd ZdS )z0TestSpecialAttributeLookupFailure.WeirdArrayLikec                 C   r  Nzoops!r   r    r
   r
   r   r)        z:TestSpecialAttributeLookupFailure.WeirdArrayLike.__array__N)r   r   r   r  r)   r
   r
   r
   r   WeirdArrayLike      r1  c                   @   r-  )z5TestSpecialAttributeLookupFailure.WeirdArrayInterfacec                 C   r  r.  r/  r    r
   r
   r   r.     r0  zITestSpecialAttributeLookupFailure.WeirdArrayInterface.__array_interface__N)r   r   r   r  r.   r
   r
   r
   r   WeirdArrayInterface  r2  r3  c                 C   sv   t t t|   W d    n1 sw   Y  t t t|   W d    d S 1 s4w   Y  d S r	   )r   r   r   r5   rY   r1  r3  r    r
   r
   r   test_deprecated  s   "z1TestSpecialAttributeLookupFailure.test_deprecatedN)r   r   r   r1  r3  r4  r
   r
   r
   r   r,    s    r,  )TTT)__doc__r   r   	itertoolsr   numpyr5   numpy.core._rational_testsr   numpy.core._multiarray_umathr   numpy.testingr   r   r   r6   rc   rk   rl   r   r   r   r   r  r,  r
   r
   r
   r   <module>   s&    
=8* QPh6p