U
    ­A›d•‹  ã                   @   s–  d dl Z d dlZd dlZd dlZd dlmZ ddlmZmZm	Z	m
Z
mZ ddlmZ ddlmZ ddlmZ G dd	„ d	eƒZejZd
d„ ZG dd„ de	j	ƒZddddœZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd;dd„Zd d!„ Zd"d#„ Z d$d%„ Z!dZ"d&d'„ Z#d(d)„ Z$d*d+„ Z%d,d-„ Z&d.d/„ Z'd0d1„ Z(d2d3„ Z)d<d4d5„Z*d=d7d8„Z+e ,ej-ee¡ e .ej-e¡ e /ej-e¡ e 0ej-d9¡ e 1ej-d:¡ dS )>é    N)ÚIntEnumé   )ÚImageÚ
ImageChopsÚ	ImageFileÚImagePaletteÚImageSequence)Úi16le)Úo8)Úo16lec                   @   s   e Zd ZdZdZdZdZdS )ÚLoadingStrategyz.. versionadded:: 9.1.0r   r   é   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚRGB_AFTER_FIRSTÚ RGB_AFTER_DIFFERENT_PALETTE_ONLYÚ
RGB_ALWAYS© r   r   úK/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/PIL/GifImagePlugin.pyr   '   s   r   c                 C   s   | d d… dkS )Né   )s   GIF87as   GIF89ar   )Úprefixr   r   r   Ú_accept6   s    r   c                       s~   e Zd ZdZdZdZdZdd„ Zdd„ Zd	d
„ Z	e
dd„ ƒZe
dd„ ƒZdd„ Zddd„Z‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚGifImageFileZGIFzCompuserve GIFFNc                 C   s,   | j  d¡}|r(|d r(| j  |d ¡S d S )Nr   r   )ÚfpÚread)ÚselfÚsr   r   r   ÚdataF   s    zGifImageFile.datac                 C   sX   t dt|ƒdƒD ]B}|d ||   krJ||d    krJ||d  ksn  dS qdS )Nr   é   r   r   TF)ÚrangeÚlen)r   ÚpÚir   r   r   Ú_is_palette_neededL   s    8zGifImageFile._is_palette_neededc                 C   sØ   | j  d¡}t|ƒs d}t|ƒ‚|d d… | jd< t|dƒt|dƒf| _g | _|d }|d@ d }|d	@ rª|d
 | jd< | j  d|> ¡}|  |¡rªt	 
d|¡}| | _| _| j | _| j  ¡ | _d | _d | _|  d¡ d S )Né   znot a GIF filer   Úversioné   é
   é   r   é€   é   Ú
backgroundr    ÚRGBr   )r   r   r   ÚSyntaxErrorÚinfoÚi16Ú_sizeÚtiler%   r   ÚrawÚglobal_paletteÚpaletteÚ_fpÚtellÚ_GifImageFile__rewindÚ	_n_framesÚ_is_animatedÚ_seek)r   r   ÚmsgÚflagsÚbitsr#   r   r   r   Ú_openR   s(    
zGifImageFile._openc                 C   s`   | j d krZ|  ¡ }z|  |  ¡ d d¡ qW n" tk
rN   |  ¡ d | _ Y nX |  |¡ | j S )Nr   F)r:   r8   r<   ÚEOFErrorÚseek©r   Úcurrentr   r   r   Ún_framesn   s    

zGifImageFile.n_framesc                 C   sx   | j d krr| jd k	r"| jdk| _ nP|  ¡ }|r6d| _ n<z|  dd¡ d| _ W n tk
rf   d| _ Y nX |  |¡ | j S )Nr   TF)r;   r:   r8   r<   rA   rB   rC   r   r   r   Úis_animatedz   s    



zGifImageFile.is_animatedc                 C   s–   |   |¡sd S || jk r(d | _|  d¡ | j}t| jd |d ƒD ]N}z|  |¡ W qB tk
rŽ } z|  |¡ d}t|ƒ|‚W 5 d }~X Y qBX qBd S )Nr   r   zno more images in GIF file)Z_seek_checkÚ_GifImageFile__frameÚimr<   r!   rA   rB   )r   ÚframeZ
last_frameÚfÚer=   r   r   r   rB   �   s    



zGifImageFile.seekTc                    sô  |dkrBdˆ _ d ˆ _dˆ _ˆ j ˆ j¡ dˆ _dˆ jkrTˆ jd= nˆ jrT|rTˆ  	¡  |ˆ jd krtd|› �}t
|ƒ‚ˆ jˆ _ˆ j r ˆ j ˆ j ¡ ˆ  ¡ ršq�dˆ _ ˆ j d¡}|r¸|dkr¼t‚d }i }d }d }d }	|sàˆ j d¡}|rì|dkrô�qr�nx|dk�rHˆ j d¡}ˆ  ¡ }
|d dk�rj|
d }|d@ �r:|
d	 }t|
dƒd
 |d< d|@ }|d? }|�r6|ˆ _nÌ|d dk�rÆd}|
�r–||
7 }ˆ  ¡ }
�q|d|k�r¶|d  d| 7  < n||d< d }qÐnp|d dk�r6|dk�r6|
ˆ j ¡ f|d< |
d d… dk�r6ˆ  ¡ }
t|
ƒd	k�r6|
d dk�r6t|
dƒˆ jd< ˆ  ¡ �rl�q6�n$|dk�rlˆ j d¡}t|dƒt|dƒ }}|t|dƒ |t|dƒ  }}|ˆ jd k�s²|ˆ jd k�ræ|�ræt|ˆ jd ƒt|ˆ jd ƒfˆ _t ˆ j¡ ||||f}	|d }|d@ dk}|d@ �rJ|d@ d }ˆ j d	|> ¡}ˆ  |¡�rFt d|¡}nd}ˆ j d¡d }ˆ j ¡ ˆ _ �qrn d }qÐ|d k�r€t‚|ˆ _|�s�d S g ˆ _ˆ j�r°ˆ j ˆ jˆ j¡ |d k	�r¾|nˆ jˆ _|ˆ _|dk�r:ˆ j�rt t!j"k�r |d k	�rød ndˆ _#nd!ˆ _#nd"ˆ _#|�s2ˆ j�r2dd#l$m$} |ˆ jƒ}|ˆ _%n‚ˆ j#d!k�r¼t t!j&k�sX|�r¼d ˆ _'d$ˆ jk�r¢ˆ j (ˆ jd$ d¡ ˆ j )d tj*j+¡ˆ _d ˆ _#ˆ jd$= ndˆ _#ˆ j )dtj*j+¡ˆ _‡ fd%d&„}|	ˆ _�zJˆ jdk �rèd ˆ _�n0ˆ jdk�r�ˆ j\}}}}|| || f}t |¡ d!}ˆ j ,d$|¡}|d k	�rVˆ j#d'k�r|d }||ƒd( }n&ˆ j ,d)d¡}ˆ j#d'k�r|d}||ƒ}tj- .|||¡ˆ _nˆˆ jd k	�r°ˆ  /ˆ jˆ j¡ˆ _nh|d k	�rˆ j\}}}}|| || f}t |¡ d!}|}ˆ j#d'k�rd }||ƒd( }tj- .|||¡ˆ _W n t0k
�r0   Y nX |d k	�rœd}|d k	�r||dk�rlt t!j"k�r||ˆ jd$< nˆ j#d'k�r||}d*||||fˆ j |||ffgˆ _| ,d¡�r¶|d ˆ jd< d+D ]4}||k�rØ|| ˆ j|< n|ˆ jk�rºˆ j|= �qºd S ),Nr   éÿÿÿÿÚcommentr   zcannot seek to frame ó   ;ó   !éù   r    r)   Údurationé   r   éþ   ó    ó   
éÿ   Ú	extensionr,   ó   NETSCAPE2.0Úloopó   ,é	   é   r   r(   é@   r+   r*   r.   FÚRGBAÚPÚL)ÚcopyÚtransparencyc                    s6   ˆ j r(tˆ j j| d | d d … ƒ} n
| | | f} | S )Nr    )Ú_frame_paletteÚtupler6   )Úcolor©r   r   r   Ú_rgbN  s    "
z GifImageFile._seek.<locals>._rgb©r.   r^   )r   r-   Úgif)rQ   rW   )1Z_GifImageFile__offsetZdisposerG   r7   rB   r9   Zdisposal_methodr0   r3   ÚloadÚ
ValueErrorr   r   r   rA   r1   r8   r"   ÚsizeÚmaxr2   r   Z_decompression_bomb_checkr%   r   r4   rH   ÚpasteÚdispose_extentr5   rc   Ú_frame_transparencyÚLOADING_STRATEGYr   r   Úmodera   r6   r   ZpyaccessÚputpalettealphaÚconvertÚDitherÚFLOYDSTEINBERGÚgetÚcoreÚfillÚ_cropÚAttributeError)r   rI   Zupdate_imager=   r   r6   r0   Zframe_transparencyÚ	interlaceZframe_dispose_extentÚblockr>   Zdispose_bitsrM   Zx0Zy0Úx1Úy1r?   r#   ra   rg   Zdispose_sizeZdispose_modere   rb   Úkr   rf   r   r<   �   sR   








&"



ÿþ









üÿ	
zGifImageFile._seekc                    s¦   | j r
dnd}d | _| jdkr@| jd k	rŒtj || j| j¡| _nL| j	dkrŒ| j| _| j r†tj d| j| jpld¡| _| jj
| j  ¡ Ž  nd | _|| _	d | _ tƒ  ¡  d S )Nr_   r`   r   rh   )rc   Ú_prev_imrG   rp   r   rx   ry   rl   rH   rr   Ú
putpaletteÚgetdataÚsuperÚload_prepare)r   Z	temp_mode©Ú	__class__r   r   r…   œ  s$    

  ÿ
zGifImageFile.load_preparec                 C   sð   | j dkr`| jdkr\ttjkr\| jd k	r@| j | jd¡ d| _nd| _| j | jt	j
j¡| _d S | jsjd S | jd k	r’| j | jd¡ | j d¡}n| j d¡}|  || j¡}| j| _| jj| _|jdkrÜ| j || j|¡ n| j || j¡ d S )Nr   r_   r^   r.   )rG   rr   rq   r   r   rp   rH   rs   rt   r   ru   rv   r�   rz   ro   rn   )r   Zframe_imr   r   r   Úload_end°  s(    




zGifImageFile.load_endc                 C   s   | j S ©N)rG   rf   r   r   r   r8   Ê  s    zGifImageFile.tell)T)r   r   r   ÚformatÚformat_descriptionZ!_close_exclusive_fp_after_loadingr5   r   r%   r@   ÚpropertyrE   rF   rB   r<   r…   rˆ   r8   Ú__classcell__r   r   r†   r   r   ?   s$   


  r   r`   r_   )Ú1r`   r_   c                 C   s‚   | j tkr|  ¡  | S t | j ¡dkrx| jdtjjd�} | jj dkrt| jj	D ]&}|d dkrL| jj	| | j
d<  qtqL| S |  d¡S )	a  
    Takes an image (or frame), returns an image in a mode that is appropriate
    for saving in a Gif.

    It may return the original image, or it may return an image converted to
    palette or 'L' mode.

    :param im: Image object
    :returns: Image object
    r.   r_   ©r6   r^   r    r   rb   r`   )rr   ÚRAWMODErj   r   Zgetmodebasert   ÚPaletteZADAPTIVEr6   Úcolorsr0   )rH   Zrgbar   r   r   Ú_normalize_modeÕ  s    
r“   c           	      C   s`  d}|r>t |tttfƒr(t|dd… ƒ}t |tjƒr>t|jƒ}| jdkrb|sŒ| j d¡dd… }n*|s|tdd„ t	dƒD ƒƒ}tjd|d�| _|�r4g }t	dt
|ƒd	ƒD ]<}t|||d	 … ƒ}| jj |¡}||krØd}| |¡ q¦t|ƒD ]:\}}|dkrìt	t
|ƒƒD ]}||k�r|||<  qì�qqì|  |¡} n t| |ƒ}|dk	�rT|  ||¡S || j_| S )
at  
    Normalizes the palette for image.
      - Sets the palette to the incoming palette, if provided.
      - Ensures that there's a palette for L mode images
      - Optimizes the palette if necessary/desired.

    :param im: Image object
    :param palette: bytes object containing the source palette, or ....
    :param info: encoderinfo
    :returns: Image object
    Ni   r_   r.   c                 s   s   | ]}|d  V  qdS )r    Nr   )Ú.0r$   r   r   r   Ú	<genexpr>  s     z%_normalize_palette.<locals>.<genexpr>r�   r   r    )Ú
isinstanceÚbytesÚ	bytearrayÚlistr   r6   rr   rH   Z
getpaletter!   r"   rd   r’   rw   ÚappendÚ	enumerateZremap_paletteÚ_get_optimize)	rH   r6   r0   Zsource_paletteÚused_palette_colorsr$   Zsource_colorÚindexÚjr   r   r   Ú_normalize_paletteî  s@    





r    c              	   C   s¶   t | ƒ}|j ¡ D ]\}}| j ||¡ qt||| jƒ}t|| jƒD ]}| |¡ qDd}t| ƒrh|dB }t	|| d|ƒ dt| ƒf|_
t ||dd| j dt|j fg¡ | d¡ d S )Nr   r]   ©r   r   r(   ri   ó    )r“   r0   ÚitemsÚencoderinfoÚ
setdefaultr    Ú_get_global_headerÚwriteÚget_interlaceÚ_write_local_headerZencoderconfigr   Ú_saverl   r�   rr   )rH   r   r6   Zim_outr€   Úvr   r>   r   r   r   Ú_write_single_frame"  s    $r¬   c                 C   s>   t |ƒt | ƒkrt || ¡}nt | d¡|  d¡¡}| ¡ S )Nr.   )Ú_get_palette_bytesr   Zsubtract_modulort   Zgetbbox)Zbase_imÚim_frameÚdeltar   r   r   Ú_getbbox7  s     ÿr°   c              	   C   sÐ  | j  d¡}| j  d| j d¡¡}g }d}d }t | g| j  dg ¡¡D �]´}t |¡D �]¢}	t|	 ¡ ƒ}	|dkrœ|	j 	¡ D ] \}
}|
dkrŒqz| j  
|
|¡ qz| j  ¡ }t|	||ƒ}	d|	jkrÎ| 
d|	jd ¡ t|ttfƒrê|| |d< n$|d k�rd|	jk�r|	jd |d< t|ttfƒ�r*|| |d< |d7 }|�rä|d }t|d |	ƒ}|�sx| d¡rV|d	 d  |d 7  < qV| d¡d
k�rè|d k�rØ| j  d| j dd¡¡}t|	|ƒ}t d|	j|¡}| |d d j¡ t||	ƒ}nd }| |	||dœ¡ qVqFt|ƒdk�r–|D ]€}|d }	|d �sLt|	|d	 ƒD ]}| |¡ �q4d}n0|�s^d|d	 d< |	 |d ¡}	|d d d
… }t||	||d	 ƒ �qdS d| j k�rÌt| j d ttfƒ�rÌt| j d ƒ| j d< d S )NrQ   Údisposalr   Zappend_imagesrb   r   rL   rH   r¤   r   )r   r   r   r_   )rH   Úbboxr¤   r²   r¡   TÚinclude_color_table)r¤   rw   r0   Ú	itertoolsÚchainr   ÚIteratorr“   ra   r£   r¥   r    r–   r™   rd   r°   Ú_get_backgroundr   Únewrl   r‚   r6   rš   r"   r¦   r§   ÚcropÚ_write_frame_dataÚsum)rH   r   r6   rQ   r±   Z	im_framesZframe_countZbackground_imZ
imSequencer®   r€   r«   r¤   Úpreviousr²   re   r-   Z
frame_datar   Úoffsetr   r   r   Ú_write_multiple_framesA  sz    



 ÿ

 ÿr¾   c                 C   s   t | ||dd� d S )NT)Úsave_all)rª   )rH   r   Úfilenamer   r   r   Ú	_save_allŒ  s    rÁ   Fc                 C   s€   d| j ksd| jkr,| j  d| j d¡¡}nd }| j  dd¡| j d< |rTt| ||ƒs`t| ||ƒ | d¡ t|dƒr|| ¡  d S )Nr6   ÚoptimizeTrN   Úflush)r¤   r0   rw   r¾   r¬   r§   ÚhasattrrÃ   )rH   r   rÀ   r¿   r6   r   r   r   rª   �  s    

rª   c                 C   s$   | j  dd¡}t| jƒdk r d}|S )Nr|   r   é   r   )r¤   rw   Úminrl   )rH   r|   r   r   r   r¨   ¡  s    r¨   c              	   C   sÔ  d}z,d|j kr|j d }n
|jd }t|ƒ}W n ttfk
rH   Y nBX d}t||j ƒ}|d k	rŠz| |¡}W n tk
rˆ   d}Y nX d|j kr¨t|j d d ƒ}nd}t|j  dd¡ƒ}|sÐ|dksÐ|�r*|rØdnd}	|	|d	> O }	|sðd}|  d
t	dƒ t	dƒ t	|	ƒ t
|ƒ t	|ƒ t	dƒ ¡ |j  d¡}
|
�rbt|ƒ}t|ƒ}|�rb|dB }||B }|  dt
|d ƒ t
|d ƒ t
|jd ƒ t
|jd ƒ t	|ƒ ¡ |
�rÂ|�rÂ|  t|ƒ¡ |  t	dƒ¡ d S )NFrb   TrQ   r)   r   r±   r   r   rO   rP   r\   r³   r+   rZ   r(   )r¤   r0   ÚintÚKeyErrorrk   rœ   rž   rw   r§   r
   Úo16r­   Ú_get_color_table_sizerl   Ú_get_header_palette)r   rH   r½   r>   Ztransparent_color_existsrb   r�   rQ   r±   Zpacked_flagr³   Úpalette_bytesÚcolor_table_sizer   r   r   r©   «  s|    



ÿþýüûúÿ

ÿ
þýüûÿr©   c           
      C   sä   |   ¡ }z°t|dƒ�œ}| jdkr8tjd|g|tjd� ntdd|g}dg}tj	|tj
tjd�}tj	||j|tjd�}|j ¡  | ¡ }	|	r”t |	|¡‚| ¡ }	|	r¬t |	|¡‚W 5 Q R X W 5 zt |¡ W n tk
rÜ   Y nX X d S )NÚwbr.   Zppmtogif)ÚstdoutÚstderrZppmquantÚ256)ÚstdinrÏ   rÐ   )Ú_dumpÚosÚunlinkÚOSErrorÚopenrr   Ú
subprocessÚ
check_callÚDEVNULLÚPopenÚPIPErÏ   ÚcloseÚwaitÚCalledProcessError)
rH   r   rÀ   ÚtempfilerJ   Z	quant_cmdZ	togif_cmdZ
quant_procZ
togif_procÚretcoder   r   r   Ú_save_netpbmí  sB    
  ÿ
  ÿü
râ   c                 C   sÆ   | j dkrÂ|rÂ| dd¡rÂtp&| j dk}|s<| j| j dk rÂg }t|  ¡ ƒD ]\}}|rL| |¡ qL|sxt|ƒt	|ƒkr||S t	| j
j
ƒt | j
j ¡ }d|d  ¡ > }t	|ƒ|d krÂ|dkrÂ|S dS )	aL  
    Palette optimization is a potentially expensive operation.

    This function determines if the palette should be optimized using
    some heuristics, then returns the list of palette entries in use.

    :param im: Image object
    :param info: encoderinfo
    :returns: list of indexes of palette entries in use, or None
    )r_   r`   rÂ   r   r`   i   r   r   N)rr   rw   Ú_FORCE_OPTIMIZEÚwidthÚheightr›   Z	histogramrš   rm   r"   r6   r   ZgetmodebandsÚ
bit_length)rH   r0   Zoptimiser�   r$   ÚcountZnum_palette_colorsZcurrent_palette_sizer   r   r   rœ   !  s$    ÿþürœ   c                 C   s:   | sdS t | ƒdk rdS t t t | ƒd d¡¡d S d S )Nr   r[   r   r    r   )r"   ÚmathÚceilÚlog)rÌ   r   r   r   rÊ   O  s
    rÊ   c                 C   s<   t | ƒ}d|> t| ƒd  }|dkr8| tdƒd | 7 } | S )zä
    Returns the palette, null padded to the next power of 2 (*3) bytes
    suitable for direct inclusion in the GIF header

    :param palette_bytes: Unpadded palette bytes, in RGBRGB form
    :returns: Null padded palette
    r   r    r   )rÊ   r"   r
   )rÌ   rÍ   Zactual_target_size_diffr   r   r   rË   Y  s
    rË   c                 C   s   | j j S )zš
    Gets the palette for inclusion in the gif header

    :param im: Image object
    :returns: Bytes, len<=768 suitable for inclusion in gif header
    r�   )rH   r   r   r   r­   k  s    r­   c              
   C   s`   d}|r\t |tƒrXz| j || ¡}W q\ tk
rT } zt|ƒdkrD‚ W 5 d }~X Y q\X n|}|S )Nr   )z$cannot allocate more than 256 colorsz/cannot add non-opaque RGBA color to RGB palette)r–   rd   r6   Zgetcolorrk   Ústr)rH   Zinfo_backgroundr-   rK   r   r   r   r·   u  s    
r·   c                 C   sx  d}| j  d¡dks<|r@d|ks<d|ks<| d¡s<| d¡r@d}t| | d¡ƒ}t| ƒ}t|ƒ}d	| t| jd
 ƒ t| jd ƒ t|d ƒt|ƒtd
ƒ t|ƒg}d|krî| 	dtdƒ tdƒ d tdƒ tdƒ t|d ƒ td
ƒ ¡ | d¡�rtdtdƒ }|d }t
|tƒ�r"| ¡ }td
t|ƒdƒD ]*}	||	|	d … }
|tt|
ƒƒ|
 7 }�q2|td
ƒ7 }| 	|¡ |S )z2Return a list of strings representing a GIF headers   87ar'   s   89arb   rY   rQ   rM   r-   s   GIFr   r   r+   rO   rV   r,   rX   r    rS   )r0   rw   r·   r­   rÊ   rÉ   rl   r
   rË   rš   r–   rë   Úencoder!   r"   )rH   r0   r'   r-   rÌ   rÍ   ÚheaderZcomment_blockrM   r$   Zsubblockr   r   r   r¦   Œ  sp    ÿýüûú	ÿþý
õÿþýüû
úùÿ

r¦   c              	   C   sR   zF||_ t| ||dƒ t || dd|j dt|j fg¡ |  d¡ W 5 |` X d S )Nr   ri   r¡   r¢   )r¤   r©   r   rª   rl   r�   rr   r§   )r   r®   r½   Úparamsr   r   r   rº   Ê  s      ÿrº   c                 C   sd   t | |ƒ}|dkri }d|kr6d| jkr6| jd |d< t| ||ƒ}|j| _|j| _t| |ƒ}||fS )a  
    Legacy Method to get Gif data from image.

    Warning:: May modify image data.

    :param im: Image object
    :param palette: bytes object containing the source palette, or ....
    :param info: encoderinfo
    :returns: tuple of(list of header items, optimized palette)

    Nr-   )rœ   r0   r    r6   rH   r¦   )rH   r6   r0   r�   Zim_modrí   r   r   r   Ú	getheaderÞ  s    

rï   r¡   c                 K   s0   G dd„ dƒ}|   ¡  |ƒ }t|| ||ƒ |jS )aë  
    Legacy Method

    Return a list of strings representing this image.
    The first string is a local image header, the rest contains
    encoded image data.

    To specify duration, add the time in milliseconds,
    e.g. ``getdata(im_frame, duration=1000)``

    :param im: Image object
    :param offset: Tuple of (x, y) pixels. Defaults to (0, 0)
    :param \**params: e.g. duration or other encoder info parameters
    :returns: List of bytes containing GIF encoded frame data

    c                   @   s   e Zd Zg Zdd„ ZdS )zgetdata.<locals>.Collectorc                 S   s   | j  |¡ d S r‰   )r   rš   )r   r   r   r   r   r§     s    z getdata.<locals>.Collector.writeN)r   r   r   r   r§   r   r   r   r   Ú	Collector  s   rð   )rj   rº   r   )rH   r½   rî   rð   r   r   r   r   rƒ   ú  s
    rƒ   z.gifz	image/gif)F)NN)r¡   )2r´   rè   rÔ   rØ   Úenumr   Ú r   r   r   r   r   Ú_binaryr	   r1   r
   r   rÉ   r   r   rq   r   r   r�   r“   r    r¬   r°   r¾   rÁ   rª   r¨   r©   râ   rã   rœ   rÊ   rË   r­   r·   r¦   rº   rï   rƒ   Zregister_openrŠ   Zregister_saveZregister_save_allZregister_extensionZregister_mimer   r   r   r   Ú<module>   sR   		   4
K

B1.

>

$