U
    »mœd2i  ã                   @   st  d gZ ddlZddlZddlZddlZddlZddddddd	d	d
d	d	dddddœZdddddddddddddddœZi 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/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ ZG d9d:„ d:ƒZG d;d<„ d<eƒZd=d>„ Zd?d@„ ZdAdB„ ZdCdD„ ZdEdF„ ZdGdH„ ZdIdJ„ ZdKdL„ Z dMdN„ Z!dOdP„ Z"dQdR„ Z#G dSdT„ dTe$ƒZ%dWdVd „Z&dS )XÚreadsavé    Nz>u1z>i2z>i4z>f4z>f8z>c8z|Oz>c16z>u2z>u4z>i8z>u8)é   é   é   é   é   é   é   é   é	   é
   é   é   é   é   é   ZSTART_MARKERZCOMMON_VARIABLEÚVARIABLEÚSYSTEM_VARIABLEÚ
END_MARKERÚ	TIMESTAMPZCOMPILEDZIDENTIFICATIONÚVERSIONÚHEAP_HEADERÚ	HEAP_DATAZ	PROMOTE64ÚNOTICEÚDESCRIPTION)r   r   r   r   r   r   r   r   r   r   é   é   é   é   c                 C   s.   |   ¡ }|d dkr*|  |d |d  ¡ dS )z+Align to the next 32-bit position in a filer   r   N)ÚtellÚseek)ÚfÚpos© r#   úF/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/scipy/io/_idl.pyÚ	_align_32K   s    r%   c                 C   s   |   |¡ dS )zSkip `n` bytesN©Úread©r!   Únr#   r#   r$   Ú_skip_bytesT   s    
r*   c                 C   s
   |   |¡S )zRead the next `n` bytesr&   r(   r#   r#   r$   Ú_read_bytesZ   s    r+   c                 C   s$   t  t d|  d¡dd… ¡d ¡S )zRead a single bytez>Br   Nr   r   )ÚnpZuint8ÚstructÚunpackr'   ©r!   r#   r#   r$   Ú
_read_byte_   s    r0   c                 C   s   t  t d|  d¡¡d ¡S )úRead a signed 32-bit integerú>lr   r   ©r,   Zint32r-   r.   r'   r/   r#   r#   r$   Ú
_read_longd   s    r4   c                 C   s$   t  t d|  d¡dd… ¡d ¡S )zRead a signed 16-bit integerz>hr   r   r   )r,   Zint16r-   r.   r'   r/   r#   r#   r$   Ú_read_int16i   s    r5   c                 C   s   t  t d|  d¡¡d ¡S )r1   z>ir   r   r3   r/   r#   r#   r$   Ú_read_int32n   s    r6   c                 C   s   t  t d|  d¡¡d ¡S )zRead a signed 64-bit integerz>qr
   r   )r,   Úint64r-   r.   r'   r/   r#   r#   r$   Ú_read_int64s   s    r8   c                 C   s$   t  t d|  d¡dd… ¡d ¡S )zRead an unsigned 16-bit integerz>Hr   r   r   )r,   Zuint16r-   r.   r'   r/   r#   r#   r$   Ú_read_uint16x   s    r9   c                 C   s   t  t d|  d¡¡d ¡S )zRead an unsigned 32-bit integerú>Ir   r   )r,   Zuint32r-   r.   r'   r/   r#   r#   r$   Ú_read_uint32}   s    r;   c                 C   s   t  t d|  d¡¡d ¡S )zRead an unsigned 64-bit integerz>Qr
   r   )r,   Zuint64r-   r.   r'   r/   r#   r#   r$   Ú_read_uint64‚   s    r<   c                 C   s   t  t d|  d¡¡d ¡S )zRead a 32-bit floatz>fr   r   )r,   Zfloat32r-   r.   r'   r/   r#   r#   r$   Ú_read_float32‡   s    r=   c                 C   s   t  t d|  d¡¡d ¡S )zRead a 64-bit floatz>dr
   r   )r,   Zfloat64r-   r.   r'   r/   r#   r#   r$   Ú_read_float64Œ   s    r>   c                   @   s   e Zd ZdZdd„ ZdS )ÚPointerzClass used to define pointersc                 C   s
   || _ d S ©N)Úindex)ÚselfrA   r#   r#   r$   Ú__init__”   s    zPointer.__init__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rC   r#   r#   r#   r$   r?   ‘   s   r?   c                   @   s   e Zd ZdZdS )ÚObjectPointerz$Class used to define object pointersN)rD   rE   rF   rG   r#   r#   r#   r$   rH   ™   s   rH   c                 C   s2   t | ƒ}|dkr*t| |ƒ d¡}t| ƒ nd}|S )zRead a stringr   Úlatin1Ú )r4   r+   Údecoder%   )r!   ÚlengthÚcharsr#   r#   r$   Ú_read_stringž   s    
rN   c                 C   s4   t | ƒ}|dkr,t | ƒ}t| |ƒ}t| ƒ nd}|S )z.Read a data string (length is specified twice)r   rJ   )r4   r+   r%   )r!   rL   Zstring_datar#   r#   r$   Ú_read_string_data©   s    

rO   c                 C   s^  |dkr$t | ƒdkrtdƒ‚t| ƒS |dkr4t| ƒS |dkrDt | ƒS |dkrTt| ƒS |dkrdt| ƒS |dkrŽt| ƒ}t| ƒ}t ||d  ¡S |d	kržt| ƒS |d
kr°tdƒ‚nª|dkrÚt| ƒ}t| ƒ}t 	||d  ¡S |dk� rðt
t | ƒƒS |dk�rtt | ƒƒS |dk�rt| ƒS |dk�r*t| ƒS |dk�r<t| ƒS |dk�rNt| ƒS td| ƒ‚dS )z*Read a variable with a specified data typer   z*Error occurred while reading byte variabler   r   r   r   r   y              ð?r	   r
   z'Should not be here - please report thisr   r   r   r   r   r   r   z)Unknown IDL type: %i - please report thisN)r6   Ú	Exceptionr0   r5   r=   r>   r,   Z	complex64rO   Z
complex128r?   rH   r9   r;   r8   r<   )r!   ÚdtypeÚrealÚimagr#   r#   r$   Ú
_read_dataµ   sJ    






rT   c           
      C   s€  |d }|d }g }|D ]z}|d s,|d rN|  |d  ¡ |d ftjf¡ q|d tkr‚|  |d  ¡ |d ft|d  f¡ qtd|d  ƒ‚qtj|f|d�}t|ƒD ]–}|D ]Œ}|d }|d rút| |d	 |d  |d
 |d  ƒ||d  |< q´|d �r*t	| ||d	 |d  ƒ||d  |< q´t
| |ƒ||d  |< q´q¬|d dk�r||d dt|d ƒ… }	|	 ¡  | |	¡}|S )z�
    Read a structure, with the array and structure descriptors given as
    `array_desc` and `structure_desc` respectively.
    Ú	nelementsÚtagtableÚ	structureÚarrayÚnameÚtypecodez Variable type %i not implemented©rQ   ÚarrtableÚstructtableÚndimsr   ÚdimsN)ÚappendÚlowerr,   Úobject_Ú
DTYPE_DICTrP   ÚrecarrayÚrangeÚ_read_structureÚ_read_arrayrT   ÚintÚreverseÚreshape)
r!   Ú
array_descÚstruct_descZnrowsÚcolumnsrQ   ÚcolrW   Úir_   r#   r#   r$   rf   ß   s@    "
ÿÿþ
ÿ
rf   c           	      C   s   |dkrL|dkr.t | ƒ}||d kr.t d¡ tj|  |d ¡t| d�}nr|dkr€tj|  |d d ¡t| d�ddd… }n>g }t|d	 ƒD ]}|}t| |ƒ}| 	|¡ q�tj
|tjd�}|d
 dkrô|d dt|d
 ƒ… }| ¡  | |¡}t| ƒ |S )z`
    Read an array of type `typecode`, with the array descriptor given as
    `array_desc`.
    )	r   r   r   r   r   r   r   r   r   r   Únbytesz.Not able to verify number of bytes from headerr[   )r   r   r   NrU   r^   r_   )r6   ÚwarningsÚwarnr,   Z
frombufferr'   rc   re   rT   r`   rX   rb   rh   ri   rj   r%   )	r!   rZ   rk   rp   rX   ro   rQ   Údatar_   r#   r#   r$   rg     s8    
ÿÿÿÿ

rg   c                    s   dt ˆ ƒi}tˆ ƒ}|tˆ ƒd 7 }tˆ dƒ |d tkrJtd|d  ƒ‚t|d  |d< |d dk�rF|d dkr‚tˆ ƒ|d< nt ˆ ƒ|d< tˆ dƒ tˆ ƒ}|d	 d
krÌ|ˆ  ¡ krÂd|d< ntdƒ‚nvt ˆ ƒ}|dkrätdƒ‚|d �rt	ˆ |d |d ƒ|d< n:|d �r,t
ˆ |d	 |d ƒ|d< n|d	 }tˆ |ƒ|d< �nÌ|d dk�r†tˆ dƒ tˆ ƒ|d< tˆ ƒ|d< tˆ ƒ|d< �nŒ|d dk�rÈt ˆ ƒ|d< tˆ ƒ|d< tˆ ƒ|d< tˆ ƒ|d< �nJ|d dk�rþtˆ ƒ|d< tˆ ƒ|d < tˆ ƒ|d!< �n|d d"k�rtˆ ƒ|d#< nø|d d$k�r6tˆ ƒ|d%< nÜ|d d&k�rpt ˆ ƒ|d'< ‡ fd(d)„t|d' ƒD ƒ|d*< n¢|d d+k�r¶t ˆ ƒ|d,< tˆ ƒ|d-< ‡ fd.d)„t|d, ƒD ƒ|d/< n\|d d0k�rÎd1|d2< nD|d d3k�rèt d4¡ n*|d d5k�rt d6¡ ntd7|d  ƒ‚ˆ  |¡ |S )8z!Function to read in a full recordÚrectypeì        r   zUnknown RECTYPE: %i)r   r   r   ÚvarnameÚ
heap_indexrZ   r   Nrs   zUnexpected type code: 0r	   zVARSTART is not 7rW   rk   rl   rX   r   i   ÚdateÚuserÚhostr   ÚformatÚarchÚosÚreleaseÚIDENTIFICATONÚauthorÚtitleÚidcoder   Únoticer   Údescriptionr   Znvaluesc                    s   g | ]}t ˆ ƒ‘qS r#   ©r4   ©Ú.0Ú_r/   r#   r$   Ú
<listcomp>Š  s     z _read_record.<locals>.<listcomp>ÚindicesZCOMMONBLOCKZnvarsrY   c                    s   g | ]}t ˆ ƒ‘qS r#   ©rN   r†   r/   r#   r$   r‰   �  s     Úvarnamesr   TÚendÚUNKNOWNzSkipping UNKNOWN recordr   zSkipping SYSTEM_VARIABLE recordz$record['rectype']=%s not implemented)r4   r;   r*   ÚRECTYPE_DICTrP   rN   Ú_read_typedescr   Ú
ValueErrorrf   rg   rT   rO   re   rq   rr   r    )r!   ÚrecordÚnextrecZrectypedescZvarstartrQ   r#   r/   r$   Ú_read_record;  s„    





ÿ


ÿ

  
ÿ
r”   c                 C   sŒ   t | ƒt | ƒdœ}|d d@ dkr*tdƒ‚|d d@ dk|d< |d d@ dk|d< |d rtt| ƒ|d	< t| ƒ|d
< n|d rˆt| ƒ|d	< |S )z%Function to read in a type descriptor)rZ   Úvarflagsr•   r   z System variables not implementedr   rX   é    rW   rk   rl   )r4   rP   Ú_read_arraydescÚ_read_structdesc)r!   Ztypedescr#   r#   r$   r�   ¨  s    r�   c                    s0  dt ˆ ƒi}|d dkr|tˆ dƒ t ˆ ƒ|d< t ˆ ƒ|d< t ˆ ƒ|d< tˆ dƒ t ˆ ƒ|d< ‡ fdd	„t|d ƒD ƒ|d
< n°|d dk�rt d¡ tˆ dƒ tˆ ƒ|d< tˆ ƒ|d< t ˆ ƒ|d< tˆ dƒ d|d< g |d
< t|d ƒD ]0}t ˆ ƒ}|dk�rtdƒ‚|d
  t ˆ ƒ¡ qèntd|d  ƒ‚|S )z'Function to read in an array descriptorZarrstartr
   r   rp   rU   r^   Znmaxc                    s   g | ]}t ˆ ƒ‘qS r#   r…   r†   r/   r#   r$   r‰   Í  s     z#_read_arraydesc.<locals>.<listcomp>r_   é   z$Using experimental 64-bit array readr   zExpected a zero in ARRAY_DESCzUnknown ARRSTART: %i)r4   r*   re   rq   rr   r<   rP   r`   )r!   Z	arraydescÚdÚvr#   r/   r$   r—   ¼  s2    

 



r—   c                    s|  i }t ˆ ƒ}|dkrtdƒ‚tˆ ƒ|d< t ˆ ƒ}t ˆ ƒ|d< t ˆ ƒ|d< |d@ |d< |d@ |d	< |d
@ |d< |d �sV‡ fdd„t|d ƒD ƒ|d< |d D ]}tˆ ƒ|d< qœ‡ fdd„|d D ƒ|d< ‡ fdd„|d D ƒ|d< |d	 sô|d �rHtˆ ƒ|d< t ˆ ƒ|d< ‡ fdd„t|d ƒD ƒ|d< ‡ fdd„t|d ƒD ƒ|d< |t|d < n"|d tk�rltdƒ‚t|d  }|S )z*Function to read in a structure descriptorr   zSTRUCTSTART should be 9rY   Zntagsrp   r   Úpredefr   Zinheritsr   Zis_superc                    s   g | ]}t ˆ ƒ‘qS r#   )Ú_read_tagdescr†   r/   r#   r$   r‰   ÿ  s   ÿz$_read_structdesc.<locals>.<listcomp>rV   c                    s"   i | ]}|d  r|d t ˆ ƒ“qS )rX   rY   )r—   ©r‡   Útagr/   r#   r$   Ú
<dictcomp>  s   þ z$_read_structdesc.<locals>.<dictcomp>r\   c                    s"   i | ]}|d  r|d t ˆ ƒ“qS )rW   rY   ©r˜   rž   r/   r#   r$   r    	  s   þ r]   Ú	classnameZnsupclassesc                    s   g | ]}t ˆ ƒ‘qS r#   r‹   r†   r/   r#   r$   r‰     s    Zsupclassnamesc                    s   g | ]}t ˆ ƒ‘qS r#   r¡   r†   r/   r#   r$   r‰     s    Zsupclasstablez"PREDEF=1 but can't find definition)r4   rP   rN   re   ÚSTRUCT_DICT)r!   Z
structdescZstructstartrœ   rŸ   r#   r/   r$   r˜   ë  sJ    


ÿ

ÿ

ÿ


ÿ


ÿ
r˜   c                 C   sl   dt | ƒi}|d dkr$t| ƒ|d< t | ƒ|d< t | ƒ}|d@ dk|d< |d@ dk|d< |d tk|d< |S )	z$Function to read in a tag descriptorÚoffsetéÿÿÿÿrZ   r   rX   r–   rW   Zscalar)r4   r<   rc   )r!   ZtagdescZtagflagsr#   r#   r$   r�   !  s    r�   c                 C   sZ  t | tƒrht | tƒrJ| jdkr$d } q
| j|kr:|| j } q
t d¡ d } q
t| |ƒ\}}|r`|} d| fS t | tjjj	ƒr¬t
| ƒD ]"\}}t||ƒ\}}|r€|| |< q€d| fS t | tjjjƒrðt
| ƒD ]"\}}t||ƒ\}}|rÄ|| |< qÄd| fS t | tjƒ�rN| jjtjk�rFt| jƒD ],}t|  |¡|ƒ\}}|�r|  ||¡ �qd| fS d| fS d S )Nr   zNVariable referenced by pointer not found in heap: variable will be set to NoneTF)Ú
isinstancer?   rA   rq   rr   Ú_replace_heapr,   ÚcoreÚrecordsrd   Ú	enumerater’   ZndarrayrQ   Útyperb   re   ÚsizeÚitemZitemset)ÚvariableÚheapÚreplaceÚnewZirr’   ZivÚvaluer#   r#   r$   r§   4  s@    






r§   c                       sH   e Zd ZdZi fdd„Z‡ fdd„Z‡ fdd„Zdd	„ ZeZeZ	‡  Z
S )
ÚAttrDicta.  
    A case-insensitive dictionary with access via item, attribute, and call
    notations:

        >>> d = AttrDict()
        >>> d['Variable'] = 123
        >>> d['Variable']
        123
        >>> d.Variable
        123
        >>> d.variable
        123
        >>> d('VARIABLE')
        123
        >>> d['missing']
        Traceback (most recent error last):
        ...
        KeyError: 'missing'
        >>> d.missing
        Traceback (most recent error last):
        ...
        AttributeError: 'AttrDict' object has no attribute 'missing'
    c                 C   s   t  | |¡ d S r@   )ÚdictrC   )rB   Úinitr#   r#   r$   rC   �  s    zAttrDict.__init__c                    s   t ƒ  | ¡ ¡S r@   )ÚsuperÚ__getitem__ra   ©rB   rY   ©Ú	__class__r#   r$   r·   ’  s    zAttrDict.__getitem__c                    s   t ƒ  | ¡ |¡S r@   )r¶   Ú__setitem__ra   )rB   Úkeyr²   r¹   r#   r$   r»   •  s    zAttrDict.__setitem__c              	   C   sB   z|   |¡W S  tk
r<   tdt| ƒ› d|› d�ƒd ‚Y nX d S )Nú'z' object has no attribute ')r·   ÚKeyErrorÚAttributeErrorr«   r¸   r#   r#   r$   Ú__getattr__˜  s    ÿÿzAttrDict.__getattr__)rD   rE   rF   rG   rC   r·   r»   rÀ   Ú__setattr__Ú__call__Ú__classcell__r#   r#   r¹   r$   r³   v  s   r³   Fc              	   C   sº  g }|s|ri }nt ƒ }t| dƒ}t|dƒ}|dkr@td| ƒ‚t|dƒ}	|	dkrV�n–|	dk�rà|rltdƒ |r|t|dƒ}
ntjd	d
�}
|rštd|
j ƒ |
 d¡ t	|ƒ}|
 t
 dt|ƒ¡¡ t|ƒ}|t|ƒd 7 }| d¡}t| dk�rFt d¡}|
 t
 dt|ƒ| ¡¡ |
 t
 dt|||  | ƒ¡¡ |
 |¡ �qÈ| ¡ }t | || ¡¡}|
 ¡ t|ƒ d }|
 t
 dt|d ƒ¡¡ |
 t
 dt||d  d ƒ¡¡ |
 |¡ |
 |¡ q¤| ¡  |
}| d¡ ntd|	 ƒ‚t|ƒ}| |¡ d|k�rì|d �rì�q�qì| ¡  i }|D ]$}|d dk�r*|d ||d < �q*|D ]H}|d dk�rTt|d |ƒ\}}|�r†||d< |d ||d  ¡ < �qT|�r�|D ]R}|d dk�r¨tdƒ td|d  ƒ td|d   ƒ td!|d"  ƒ  �qü�q¨|D ]b}|d d#k�r tdƒ td$|d%  ƒ td&|d'  ƒ td(|d)  ƒ td*|d+  ƒ  �qd�q |D ]R}|d d,k�rhtdƒ td-|d.  ƒ td/|d0  ƒ td1|d2  ƒ  �q¼�qh|D ]2}|d d3k�rÀtdƒ td4|d5  ƒ  �qô�qÀtdƒ td6t|ƒ ƒ d7d8„ |D ƒ}t|ƒD ]&}|dk�r"td9| |¡|f ƒ �q"tdƒ d|k�r�td:ƒ |D ]}td;|t|| ƒf ƒ �qhtdƒ |�r²|D ]}|| ||< �qš|S |S d<S )=aâ	  
    Read an IDL .sav file.

    Parameters
    ----------
    file_name : str
        Name of the IDL save file.
    idict : dict, optional
        Dictionary in which to insert .sav file variables.
    python_dict : bool, optional
        By default, the object return is not a Python dictionary, but a
        case-insensitive dictionary with item, attribute, and call access
        to variables. To get a standard Python dictionary, set this option
        to True.
    uncompressed_file_name : str, optional
        This option only has an effect for .sav files written with the
        /compress option. If a file name is specified, compressed .sav
        files are uncompressed to this file. Otherwise, readsav will use
        the `tempfile` module to determine a temporary filename
        automatically, and will remove the temporary file upon successfully
        reading it in.
    verbose : bool, optional
        Whether to print out information about the save file, including
        the records read, and available variables.

    Returns
    -------
    idl_dict : AttrDict or dict
        If `python_dict` is set to False (default), this function returns a
        case-insensitive dictionary with item, attribute, and call access
        to variables. If `python_dict` is set to True, this function
        returns a Python dictionary with all variable names in lowercase.
        If `idict` was specified, then variables are written to the
        dictionary specified, and the updated dictionary is returned.

    Examples
    --------
    >>> from os.path import dirname, join as pjoin
    >>> import scipy.io as sio
    >>> from scipy.io import readsav

    Get the filename for an example .sav file from the tests/data directory.

    >>> data_dir = pjoin(dirname(sio.__file__), 'tests', 'data')
    >>> sav_fname = pjoin(data_dir, 'array_float32_1d.sav')

    Load the .sav file contents.

    >>> sav_data = readsav(sav_fname)

    Get keys of the .sav file contents.

    >>> print(sav_data.keys())
    dict_keys(['array1d'])

    Access a content with a key.

    >>> print(sav_data['array1d'])
    [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
     0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
     0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
     0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
     0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
     0. 0. 0.]

    Úrbr   s   SRzInvalid SIGNATURE: %ss    s    zIDL Save file is compressedzw+bz.sav)Úsuffixz -> expanding to %ss   SR r2   ru   r   r   r:   r   zInvalid RECFMT: %sr�   rt   r   rs   rw   r   rv   r   z2--------------------------------------------------zDate: %srx   zUser: %sry   zHost: %srz   r   z
Format: %sr{   zArchitecture: %sr|   zOperating System: %sr}   zIDL Version: %sr~   r   z
Author: %sr€   z	Title: %sr�   zID Code: %sr‚   r   zDescription: %sr„   z&Successfully read %i records of which:c                 S   s   g | ]}|d  ‘qS )rt   r#   )r‡   Úrr#   r#   r$   r‰   €  s     zreadsav.<locals>.<listcomp>z - %i are of type %szAvailable variables:z
 - %s [%s]N)r³   Úopenr+   rP   ÚprintÚtempfileÚNamedTemporaryFilerY   Úwriter4   r-   Úpackrh   r;   r'   r�   r,   r7   r   ÚzlibÚ
decompressÚlenÚcloser    r”   r`   r§   ra   ÚsetÚcountr«   )Ú	file_nameZidictZpython_dictZuncompressed_file_nameÚverboser©   Ú	variablesr!   Ú	signatureZrecfmtZfoutrt   r“   ÚunknownZmodvalr"   Z
rec_stringrÆ   r¯   r°   r±   r’   ZrectypesÚrtÚvarr#   r#   r$   r   £  sÒ    F






"
"







ÿ

)NFNF)'Ú__all__r-   Únumpyr,   rÉ   rÍ   rq   rc   r�   r£   r%   r*   r+   r0   r4   r5   r6   r8   r9   r;   r<   r=   r>   r?   rH   rN   rO   rT   rf   rg   r”   r�   r—   r˜   r�   r§   r´   r³   r   r#   r#   r#   r$   Ú<module>   sˆ   òó	*-/m/6B-    ÿ