o
    g&                     @   s2  d dl Z d dlZ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 ddlmZ dd	lmZ eeZed
jZdZddddddddddddddddZedZ ej!Z"	 de" Z#	 G dd deZ$G d d! d!eZ%d"d# Z&dRd$d%Z'G d&d' d'Z(G d(d) d)e)Z*G d*d+ d+Z+G d,d- d-e(Z,d.d/ Z-G d0d1 d1ejZ.d2d3d4d5d6d7d8d8d9d:d;d<d=d>d?Z/d@dA Z0G dBdC dCZ1G dDdE dEZ2dFdG Z3dHdI Z4e0dJfdKdLZ5dMdN Z6e	7e.j8e.e- e	9e.j8e5 e	:e.j8e4 e	;e.j8dOdPg e	<e.j8dQ dS )S    N)IntEnum   )Image
ImageChops	ImageFileImagePaletteImageSequence)i16be)i32be)o8)o16be)o32bes   \w\w\w\ws   PNG

)1r   )LL;2)r   L;4)r   r   )II;16B)RGBr   )r   zRGB;16B)PP;1)r   P;2)r   P;4)r   r   )LAr   )RGBAzLA;16B)r   r   )r   zRGBA;16B))r   r   )   r   )   r   )   r   )   r   )r   r   )r   r   )r      )r   r   )r   r   )r   r   )r   r   )r   r   )r      )r   r    s   ^* *$@   c                   @   s   e Zd ZdZ	 dZ	 dZdS )Disposalr   r   r   N)__name__
__module____qualname__OP_NONEOP_BACKGROUNDOP_PREVIOUS r)   r)   P/home/ubuntu/cloudmapper/venv/lib/python3.10/site-packages/PIL/PngImagePlugin.pyr"   b   s    r"   c                   @   s   e Zd ZdZ	 dZdS )Blendr   r   N)r#   r$   r%   	OP_SOURCEOP_OVERr)   r)   r)   r*   r+   w   s
    r+   c                 C   s*   t  }|| t}|jrd}t||S )NzDecompressed Data Too Large)zlibdecompressobj
decompressMAX_TEXT_CHUNKunconsumed_tail
ValueError)sdobj	plaintextmsgr)   r)   r*   _safe_zlib_decompress   s   r8   c                 C   s   t | |d@ S )Nl    )r.   crc32)dataseedr)   r)   r*   _crc32      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dZdS )ChunkStreamc                 C   s   || _ g | _d S N)fpqueueselfr@   r)   r)   r*   __init__      
zChunkStream.__init__c                 C   s   d}| j r| j  \}}}| j| n| jd}|dd }| j }t|}t|s<tj	s<dt
| d}t||||fS )z.Fetch a new chunk. Returns header information.Nr   r   zbroken PNG file (chunk ))rA   popr@   seekreadtelli32is_cidr   LOAD_TRUNCATED_IMAGESreprSyntaxError)rC   cidposlengthr4   r7   r)   r)   r*   rI      s   

zChunkStream.readc                 C   s   | S r?   r)   rC   r)   r)   r*   	__enter__      zChunkStream.__enter__c                 G   s   |    d S r?   )close)rC   argsr)   r)   r*   __exit__   s   zChunkStream.__exit__c                 C   s   d  | _ | _d S r?   )rA   r@   rS   r)   r)   r*   rV      r=   zChunkStream.closec                 C   s   | j |||f d S r?   )rA   appendrC   rP   rQ   rR   r)   r)   r*   push   s   zChunkStream.pushc                 C   s*   t d||| t| d|d ||S )z"Call the appropriate chunk handlerzSTREAM %r %s %schunk_ascii)loggerdebuggetattrdecoderZ   r)   r)   r*   call   s   zChunkStream.callc              
   C   s   t jr|d d? d@ r| || dS z"t|t|}t| jd}||kr3dt| d}t|W dS  t	j
yO } zdt| d}t||d}~ww )	zRead and verify checksumr      r   Nr   z(broken PNG file (bad header checksum in rF   z(broken PNG file (incomplete checksum in )r   rM   crc_skipr<   rK   r@   rI   rN   rO   structerror)rC   rP   r:   crc1crc2r7   er)   r)   r*   crc   s   
zChunkStream.crcc                 C   s   | j d dS )zRead checksumr   N)r@   rI   )rC   rP   r:   r)   r)   r*   rd      s   zChunkStream.crc_skip   IENDc              
   C   sr   g }	 z	|   \}}}W n tjy  } zd}t||d }~ww ||kr(	 |S | |t| j| || q)NTztruncated PNG file)	rI   re   rf   OSErrorrj   r   
_safe_readr@   rY   )rC   endchunkcidsrP   rQ   rR   ri   r7   r)   r)   r*   verify   s   

zChunkStream.verifyN)rk   )r#   r$   r%   rD   rI   rT   rX   rV   r[   rb   rj   rd   rp   r)   r)   r)   r*   r>      s    r>   c                   @   s   e Zd ZdZedddZdS )iTXtzq
    Subclass of string to allow iTXt chunks to look like strings while
    keeping their extra information

    Nc                 C   s   t | |}||_||_|S )z
        :param cls: the class to use when creating the instance
        :param text: value for this key
        :param lang: language code
        :param tkey: UTF-8 version of the key name
        )str__new__langtkey)clstextrt   ru   rC   r)   r)   r*   rs      s   	ziTXt.__new__)NN)r#   r$   r%   __doc__staticmethodrs   r)   r)   r)   r*   rq      s    rq   c                   @   s6   e Zd ZdZdd ZdddZddd	Zdd
dZdS )PngInfoz<
    PNG chunk container (for use with save(pnginfo=))

    c                 C   s
   g | _ d S r?   )chunksrS   r)   r)   r*   rD     s   
zPngInfo.__init__Fc                 C   s*   ||g}|r| d | j t| dS )a"  Appends an arbitrary chunk. Use with caution.

        :param cid: a byte string, 4 bytes long.
        :param data: a byte string of the encoded data
        :param after_idat: for use with private chunks. Whether the chunk
                           should be written after IDAT

        TN)rY   r{   tuple)rC   rP   r:   
after_idatchunkr)   r)   r*   add  s   

zPngInfo.add c                 C   s   t |ts|dd}t |ts|dd}t |ts!|dd}t |ts,|dd}|rE| d|d | d | d t|  dS | d|d | d | d |  dS )	zAppends an iTXt chunk.

        :param key: latin-1 encodable text key name
        :param value: value for this key
        :param lang: language code
        :param tkey: UTF-8 version of the key name
        :param zip: compression flag

        latin-1strictutf-8   iTXts         s      N)
isinstancebytesencoder   r.   compress)rC   keyvaluert   ru   zipr)   r)   r*   add_itxt  s   



 (zPngInfo.add_itxtc                 C   s   t |tr| j|||j|j|dS t |ts0z|dd}W n ty/   | j|||d Y S w t |ts;|dd}|rL| d|d t	
|  dS | d|d |  dS )	zAppends a text chunk.

        :param key: latin-1 encodable text key name
        :param value: value for this key, text or an
           :py:class:`PIL.PngImagePlugin.iTXt` instance
        :param zip: compression flag

        )r   r   r      zTXt        tEXtr   N)r   rq   r   rt   ru   r   r   UnicodeErrorr   r.   r   )rC   r   r   r   r)   r)   r*   add_text9  s   
	

zPngInfo.add_textNF)r   r   F)r#   r$   r%   rx   rD   r   r   r   r)   r)   r)   r*   rz     s    

rz   c                       s   e Zd Z f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%d& Zd'd( Zd)d* Z  ZS )+	PngStreamc                    sR   t  | i | _i | _d| _d | _d | _d | _d | _d | _	d | _
d | _d| _d S )Nr   r   r   )superrD   im_infoim_textim_sizeim_modeim_tile
im_paletteim_custom_mimetypeim_n_frames_seq_numrewind_statetext_memoryrB   	__class__r)   r*   rD   Z  s   
zPngStream.__init__c                 C   s2   |  j |7  _ | j tkrd| j  d}t|d S )Nz%Too much memory used in text chunks: z>MAX_TEXT_MEMORY)r   MAX_TEXT_MEMORYr3   )rC   chunklenr7   r)   r)   r*   check_text_memoryk  s   
zPngStream.check_text_memoryc                 C   s   | j  | j| jd| _d S )N)infotileseq_num)r   copyr   r   r   rS   r)   r)   r*   save_rewindt  s   zPngStream.save_rewindc                 C   s(   | j d | _| j d | _| j d | _d S )Nr   r   r   )r   r   r   r   rS   r)   r)   r*   rewind{  s   zPngStream.rewindc                 C   s   t | j|}|d}td|d |  td||  || }|dkr0d| d}t|zt||d d  }W n tyL   t j	rId }n Y n t
jyW   d }Y nw || jd< |S )	Nr   ziCCP profile name %rzCompression method %sr   Unknown compression method z in iCCP chunkr   icc_profile)r   rm   r@   findr^   r_   rO   r8   r3   rM   r.   rf   r   )rC   rQ   rR   r4   icomp_methodr7   r   r)   r)   r*   
chunk_iCCP  s(   

zPngStream.chunk_iCCPc                 C   s   t | j|}|dk rt jr|S d}t|t|dt|df| _zt|d |d f \| _| _	W n	 t
y:   Y nw |d rDd| jd	< |d
 rNd}t||S )N   zTruncated IHDR chunkr   r   r   	      r   	interlace   zunknown filter category)r   rm   r@   rM   r3   rK   r   _MODESr   
im_rawmode	Exceptionr   rO   rC   rQ   rR   r4   r7   r)   r)   r*   
chunk_IHDR  s$    
zPngStream.chunk_IHDRc                 C   s\   d| j v rd| j d || jfg}n| jd urd| j d< dd| j || jfg}|| _|| _t)Nbboxr   Tdefault_imager   )r   r   r   r   r   im_idatEOFError)rC   rQ   rR   r   r)   r)   r*   
chunk_IDAT  s   


zPngStream.chunk_IDATc                 C   s   t r?   )r   )rC   rQ   rR   r)   r)   r*   
chunk_IEND  s   zPngStream.chunk_IENDc                 C   s&   t | j|}| jdkrd|f| _|S )Nr   r   )r   rm   r@   r   r   rC   rQ   rR   r4   r)   r)   r*   
chunk_PLTE  s   

zPngStream.chunk_PLTEc                 C   s   t | j|}| jdkr(t|r!|d}|dkr|| jd< |S || jd< |S | jdv r6t|| jd< |S | jdkrKt|t|dt|df| jd< |S )	Nr   r   r   transparencyr   r   r   r   r   r   )	r   rm   r@   r   _simple_palettematchr   r   i16)rC   rQ   rR   r4   r   r)   r)   r*   
chunk_tRNS  s   



	


 zPngStream.chunk_tRNSc                 C   s$   t | j|}t|d | jd< |S )N     j@gamma)r   rm   r@   rK   r   r   r)   r)   r*   
chunk_gAMA  s   zPngStream.chunk_gAMAc                 C   sB   t | j|}tdt|d  |}tdd |D | jd< |S )Nz>%dIr   c                 s   s    | ]}|d  V  qdS )r   Nr)   ).0eltr)   r)   r*   	<genexpr>  s    z'PngStream.chunk_cHRM.<locals>.<genexpr>chromaticity)r   rm   r@   re   unpacklenr|   r   )rC   rQ   rR   r4   raw_valsr)   r)   r*   
chunk_cHRM  s   zPngStream.chunk_cHRMc                 C   s>   t | j|}|dk rt jr|S d}t||d | jd< |S )Nr   zTruncated sRGB chunkr   srgb)r   rm   r@   rM   r3   r   r   r)   r)   r*   
chunk_sRGB  s   zPngStream.chunk_sRGBc           	      C   s   t | j|}|dk rt jr|S d}t|t|dt|d}}|d }|dkr8|d |d f}|| jd< |S |dkrC||f| jd	< |S )
Nr   zTruncated pHYs chunkr   r   r   r   
F%u?dpiaspect)r   rm   r@   rM   r3   rK   r   )	rC   rQ   rR   r4   r7   pxpyunitr   r)   r)   r*   
chunk_pHYs  s   
zPngStream.chunk_pHYsc                 C   s   t | j|}z
|dd\}}W n ty   |}d}Y nw |rD|dd}|dd}|dkr3|n|| j|< || j|< | t	| |S )Nr   r       r   r   replaceexif)
r   rm   r@   splitr3   ra   r   r   r   r   )rC   rQ   rR   r4   kvv_strr)   r)   r*   
chunk_tEXt
  s   
zPngStream.chunk_tEXtc                 C   s   t | j|}z
|dd\}}W n ty   |}d}Y nw |r&|d }nd}|dkr6d| d}t|z
t|dd  }W n tyP   t jrMd}n Y n tj	y[   d}Y nw |r{|
dd}|
dd	}| | j|< | j|< | t| |S )
Nr   r   r   r   r   z in zTXt chunkr   r   r   )r   rm   r@   r   r3   rO   r8   rM   r.   rf   ra   r   r   r   r   )rC   rQ   rR   r4   r   r   r   r7   r)   r)   r*   
chunk_zTXt  s:   
zPngStream.chunk_zTXtc                 C   sl  t | j| }}z
|dd\}}W n ty   | Y S w t|dk r'|S |d |d |dd  }}}z|dd\}}	}
W n tyM   | Y S w |dkry|dkrwzt|
}
W n tyk   t jrj| Y S   tj	yv   | Y S w |S z|
dd}|
dd}|	
dd}	|

dd}
W n ty   | Y S w t|
||	 | j|< | j|< | t|
 |S )Nr   r   r   r   r   r   r   )r   rm   r@   r   r3   r   r8   rM   r.   rf   ra   r   rq   r   r   r   )rC   rQ   rR   rr4   r   cfcmrt   tkr   r)   r)   r*   
chunk_iTXt?  sJ    zPngStream.chunk_iTXtc                 C   s    t | j|}d| | jd< |S )N   Exif  r   )r   rm   r@   r   r   r)   r)   r*   
chunk_eXIfg  s   zPngStream.chunk_eXIfc                 C   s   t | j|}|dk rt jr|S d}t|| jd ur%d | _td |S t|}|dks1|dkr8td |S || _t|d| j	d< d| _
|S )	Nr   z"APNG contains truncated acTL chunkz4Invalid APNG, will use default PNG image if possibler   l        r   loopz
image/apng)r   rm   r@   rM   r3   r   warningswarnrK   r   r   )rC   rQ   rR   r4   r7   n_framesr)   r)   r*   
chunk_acTLm  s$   


zPngStream.chunk_acTLc                 C   s@  t | j|}|dk rt jr|S d}t|t|}| jd u r#|dks/| jd ur5| j|d kr5d}t||| _t|dt|d}}t|dt|d	}}	| j\}
}|| |
ks_|	| |kred
}t|||	|| |	| f| j	d< t
|dt
|d}}|dkrd}t|t| d | j	d< |d | j	d< |d | j	d< |S )N   z"APNG contains truncated fcTL chunkr   r   #APNG contains frame sequence errorsr   r   r   r   zAPNG contains invalid framesr         d     duration   disposal   blend)r   rm   r@   rM   r3   rK   r   rO   r   r   r   float)rC   rQ   rR   r4   r7   seqwidthheightr   r   im_wim_h	delay_num	delay_denr)   r)   r*   
chunk_fcTL  s4   
zPngStream.chunk_fcTLc                 C   sv   |dk rt jrt | j|}|S d}t|t | jd}t|}| j|d kr.d}t||| _| |d |d S )Nr   z"APNG contains truncated fDAT chunkr   r   )	r   rM   rm   r@   r3   rK   r   rO   r   )rC   rQ   rR   r4   r7   r   r)   r)   r*   
chunk_fdAT  s   zPngStream.chunk_fdAT)r#   r$   r%   rD   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  __classcell__r)   r)   r   r*   r   Y  s,    		"(r   c                 C   s   | d d t kS )Nr   )_MAGIC)prefixr)   r)   r*   _accept  r=   r  c                       s   e Zd ZdZdZdd Zedd Zdd Zd	d
 Z	dddZ
dd Zdd Zdd Zdd Zdd Z fddZdd Z  ZS )PngImageFilePNGzPortable network graphicsc              	   C   s  t | jdsd}t|| j| _d| _g | _t| j| _	 | j \}}}z
| j	|||}W n0 t
y:   Y n0 tya   td||| t| j|}|dd  r_| j||f Y nw | j|| q| jj| _| jj| _| jj| _d | _| jj| _| jj| _| jjpd| _| j dd	| _!| jj"r| jj"\}}t#$||| _%|d
kr|d | _&n|| _&| jjd urd	| _'| j(  | j&| _)| j* | _+| j!r|  jd7  _| ,d | jdk| _-d S )Nr   znot a PNG filer   T%r %s %s (unknown)r   r   r   F   fdATr   ).r  r@   rI   rO   _fp_PngImageFile__frameprivate_chunksr   pngrb   r   AttributeErrorr^   r_   r   rm   islowerrY   rj   r   moder   _sizer   r   _textr   r   r   custom_mimetyper   r   getr   r   r   rawpalette_PngImageFile__prepare_idat!_close_exclusive_fp_after_loadingr   _PngImageFile__rewind_idatrJ   _PngImageFile__rewind_seekis_animated)rC   r7   rP   rQ   rR   r4   rawmoder:   r)   r)   r*   _open  sZ   






zPngImageFile._openc                 C   sD   | j d u r| jr| j}| | jd  |   | jr| | | j S )Nr   )r  r#  r  rH   r   load)rC   framer)   r)   r*   rw     s   

zPngImageFile.textc                 C   s^   | j du rd}t|| j | jd d d  | j  | j  | jr*| j   d| _ dS )zVerify PNG fileNz)verify must be called directly after openr   r   r   )r@   RuntimeErrorrH   r   r  rp   rV   _exclusive_fp)rC   r7   r)   r)   r*   rp     s   




zPngImageFile.verifyc                 C   s   |  |sd S || jk r| dd | j}t| jd |d D ]!}z| | W q ty@ } z| | d}t||d }~ww d S )Nr   Tr   zno more images in APNG file)_seek_checkr  r"  ranger   rH   )rC   r'  
last_framefri   r7   r)   r)   r*   rH   !  s   



zPngImageFile.seekFc              	   C   s  |dkrT|r-| j | j | j  | j| _d | _| jrd | _| jj	| _
| jj| _| j | _d | _d | _| j
dd| _| j
d| _| j
d| _| j
d| _d| _n|| jd krdd| }t||   | jrt| j| j| j | j | _| j | _| jrt| j| j d| _d}	 | jd
 z
| j \}}}W n tjtfy   Y ndw |dkrd}t ||dkr|rd}t|d	}z
| j!||| W n? t"y   Y n8 t y   |dkr|d
8 }|r|| _Y n#t| j| Y n t#y   t$%d||| t| j| Y nw q|| _| jj| _| j
d| _| j
d| _| j
d| _| js2t | jd u rC| jt&j'krCt&j(| _| jt&j'kr[| j | _| )| j| j| _d S | jt&j(krwt*j+,| j-| j.| _| )| j| j| _d S d | _d S )Nr   r   Fr   r   r   r   zcannot seek to frame Tr   rk   zNo more images in APNG file   fcTLzAPNG missing frame datar  r  )/r  rH   r!  r  r   r   r  impyaccessr   r   r   r   r@   _prev_imdisposer  r   
dispose_opblend_opdispose_extentr  r3   r&  paster   r   rm   rI   re   rf   rO   r   rb   UnicodeDecodeErrorr  r^   r_   r"   r(   r'   _cropr   corefillr  size)rC   r'  r   r7   frame_startrP   rQ   rR   r)   r)   r*   r"  0  s   



!

zPngImageFile._seekc                 C   s   | j S r?   )r  rS   r)   r)   r*   rJ     s   zPngImageFile.tellc                 C   s0   | j dr| jd | _| j| _tj|  dS )z"internal: prepare to read PNG filer   )r   N)r   r  decoderconfigr  _PngImageFile__idatr   load_preparerS   r)   r)   r*   r?    s   zPngImageFile.load_preparec                 C   s   | j dkrG| jd | j \}}}|dvr!| j||| dS |dkr?z
| j||| W n	 ty8   Y nw |d | _ n|| _ | j dks|dkrO| j }nt|| j }| j | | _ | j|S )zinternal: read more image datar   r   )   IDATs   DDATr  r   r  )r>  r@   rI   r  r[   rb   r   min)rC   
read_bytesrP   rQ   rR   r)   r)   r*   	load_read  s(   

zPngImageFile.load_readc              	   C   s  | j dkr| j| j  	 | jd z
| j \}}}W n tjtfy)   Y nmw |dkr/ng|dkrB| jrBd| _| j	||| nTz
| j
||| W nH tyU   Y nA tyl   |dkrc|d8 }t| j| Y n) ty   td||| t| j|}|dd	  r| j||df Y nw q| jj| _| js| j  d
| _d
S | jr| jtjkr| | j| j}| jjdkrd| j v r|!d| j d }n|"d}| j#|| j| | j| _| j$rd
| _$d
S d
S d
S d
S )z%internal: finished reading image datar   Tr   rk   r.  r  r  r   r   Nr   r   r   )%r>  r@   rI   r  re   rf   rO   r#  r  r[   rb   r7  r   r   rm   r  r^   r_   r  r  rY   r   r  rV   r1  r4  r+   r-   r8  r/  r5  r  r   convert_transparentconvertr6  r0  )rC   rP   rQ   rR   r4   updatedmaskr)   r)   r*   load_end  s`   







zPngImageFile.load_endc                 C   s6   d| j vr	|   d| j vrd| j vrd S |   S )Nr   zRaw profile type exif)r   r&  getexif_get_merged_dictrS   r)   r)   r*   _getexif  s
   
zPngImageFile._getexifc                    s   d| j vr	|   t  S )Nr   )r   r&  r   rI  rS   r   r)   r*   rI    s   

zPngImageFile.getexifc                 C   s   d| j v r| | j d S i S )z
        Returns a dictionary containing the XMP tags.
        Requires defusedxml to be installed.

        :returns: XMP tags in a dictionary.
        zXML:com.adobe.xmp)r   _getxmprS   r)   r)   r*   getxmp  s
   
	zPngImageFile.getxmpr   )r#   r$   r%   formatformat_descriptionr%  propertyrw   rp   rH   r"  rJ   r?  rC  rH  rK  rI  rM  r	  r)   r)   r   r*   r    s     C

]	!3r  )r       )L;1rQ  )r   s    )r   s    )r   s    )r   s   )r   s    )r   s   )r   s   )r   s   )r   s   )r   s   )r   s   )r   rR  r   r   r   r   r   zI;16r   r   r   r   r   r   c                 G   sJ   d |}| tt||  | | t|t|}| t| dS )z'Write a PNG chunk (including CRC field)r   N)joinwriteo32r   r<   r@   rP   r:   rj   r)   r)   r*   putchunk  s
   

rW  c                   @      e Zd Zdd Zdd ZdS )_idatc                 C   s   || _ || _d S r?   )r@   r~   )rC   r@   r~   r)   r)   r*   rD   ,  rE   z_idat.__init__c                 C   s   |  | jd| d S )Nr@  )r~   r@   rC   r:   r)   r)   r*   rT  0     z_idat.writeNr#   r$   r%   rD   rT  r)   r)   r)   r*   rY  )  s    rY  c                   @   rX  )_fdatc                 C   s   || _ || _|| _d S r?   )r@   r~   r   )rC   r@   r~   r   r)   r)   r*   rD   7  s   
z_fdat.__init__c                 C   s*   |  | jdt| j| |  jd7  _d S )Nr  r   )r~   r@   rU  r   rZ  r)   r)   r*   rT  <  s   z_fdat.writeNr\  r)   r)   r)   r*   r]  4  s    r]  c                 C   s  | j d| jdd}| j d| jdd}| j d| jdtj}| j d| jdtj}	|r:t|}
nt| g|}
g }d}|
D ]}t	
|D ]}|j|krZ| }n|dkrg|j|| jd}n||}| j  }t|ttfr~|| |d< t|ttfr|| |d< t|	ttfr|	| |d< |d7 }|r0|d	 }|d
 d}|d
 d}|tjkrt|dk rtj}|tjkr|d  }tjd| jd}|d }|r||}nd| j }||| n|tjkr|d d }n|d }t|d|d}|jdd}|s/||dkr/||dkr/|d
 d  |d|7  < qNnd }d|vr;||d< ||||d qNqG||dtt|t| |rht !| t"||dd| j d|fg d}t#|D ]\}}|d }|d sd|j }n	|d }||}|j}|d
 }t$t%|d }|d|}|d|	}||dt|t|d t|d t|d t|d t&|t&dt'|t'| |d7 }|dkr|st !|t"||dd|j d|fg qnt(|||}t !||dd|j d|fg |j)}qnd S )Nr   r   r   r   r   r   )r  r   encoderinfor   r/  r   )r   r   r   r   r   r   F)
alpha_only)r/  r   r_  s   acTLr   r.  r   )*r_  r  r   r"   r&   r+   r,   	itertoolschainr   Iteratorr  r   rE  r  r   listr|   r(   r   r'   r   r9  r:  r;  cropr6  r   subtract_modulogetbboxrY   rU  r   _saverY  	enumerateintroundo16r   r]  r   )r/  r@   r~   r$  r   append_imagesr   r   r   r   rc  	im_framesframe_countim_seqim_framer_  previousprev_disposal
prev_blendbase_imr2  r   deltar   r'  
frame_datar;  frame_durationframe_disposalframe_blendfdat_chunksr)   r)   r*   _write_multiple_framesA  s   







9
$






r}  c                 C   s   t | ||dd d S )NT)save_all)ri  )r/  r@   filenamer)   r)   r*   	_save_all  r[  r  Fc           $   
   C   s  |rI| j d| jd}t }| j dg }|rt|}nt| g|}|D ]}	t|	D ]}
||
j	 q/q(dD ]}||v rC nq;|
 }n| j	}|dkrd| j v r`td| j d > d}n| jruttt| j d d dd}nd}|d	kr|d
krd}n	|dkrd
}nd}| d| }| j dd| j dd| j dd| j ddf| _zt| \}}W n ty } zd| d}t||d }~ww |t ||dt| jd t| jd |ddd g d}| j d| jd}|rd}|d t| }||d| |d | j d}|rbg d }|jD ]B}|d d
 \}}||v r;|| |||| q||v rH|||| q|dd
  r`|d
d }|s`|||| q| j	dkr|d }| jd!d | }t||k r|d7 }t||k s}||d"| | j d#| jd#d }|s|dkr| j	dkr|}t|t r||d$|d |  nztdtd%|}d&| d }||d$|d |  na| j	d'v rtdtd(|}||d$t!| nJ| j	d!kr|\}} }!||d$t!|t!|  t!|!  n.d#| j v rd)}t|n!| j	dkr5| j" d*kr5| jd*d+}|}||d$|d |  | j d,}"|"rZ||d-tt#|"d d. d/ tt#|"d d. d/ d0 |rd1d2g}|jD ]}|d d
 \}}||v r~|| |||| qd| j d3}#|#rt|#t$j%r|#&d4}#|#'d5r|#d6d  }#||d7|# |rt(| ||||| nt)*| t+||d8d9| j d|fg |r|jD ]#}|d d
 \}}|dd
  r|d
d }|r|||| q||d:d t,|d;r|-  d S d S )<Nr   rn  )r   r   r   r   bitsr      r   r   r   r   ;optimizeFcompress_levelr^  compress_type
dictionaryr   zcannot write mode z as PNGs   IHDRr   r   )s   cHRMs   gAMAs   sBIT   sRGBs   tIMEr   s   ICC Profiler   s   iCCPr  pnginfo)s   sPLTr   r   r   r   s   PLTEr   s   tRNS      r   i  z%cannot use transparency for this moder   Ar   s   pHYsr   g      ?   s   bKGDs   hISTr   r   r   r    s   eXIfr   r   rk   flush).r_  r  r   setrb  rc  r   rd  r   r  rG   rA  r  maxr   getdataencoderconfig	_OUTMODESKeyErrorrl   rT  r
  rU  r;  r.   r   remover{   r  r/  
getpaletter   r   rm  getpalettemoderk  r   Exiftobytes
startswithr}  r   ri  rY  hasattrr  )$r/  r@   r  r~   r~  r   modesrn  rc  rq  rr  r  colorsr  r$  ri   r7   r{   iccnamer:   r   chunks_multiple_allowed
info_chunkrP   r}   palette_byte_numberpalette_bytesr   alpha_bytesalpharedgreenbluer   r   r)   r)   r*   ri    s&  
$







"



$
ri  c                 K   sD   G dd d}dd }| }z|| _ t| |d| W | ` |jS | ` w )z4Return a list of PNG chunks representing this image.c                   @   s    e Zd Zg Zdd Zdd ZdS )zgetchunks.<locals>.collectorc                 S   s   d S r?   r)   rZ  r)   r)   r*   rT    rU   z"getchunks.<locals>.collector.writec                 S   s   | j | d S r?   )r:   rY   )rC   r~   r)   r)   r*   rY     r=   z#getchunks.<locals>.collector.appendN)r#   r$   r%   r:   rT  rY   r)   r)   r)   r*   	collector  s    r  c                 W   s0   d |}tt|t|}| |||f d S )Nr   )rS  rU  r<   rY   rV  r)   r)   r*   rY     s   
zgetchunks.<locals>.appendN)r_  ri  r:   )r/  paramsr  rY   r@   r)   r)   r*   	getchunks  s   	r  z.pngz.apngz	image/png)r   )=rb  loggingrere   r   r.   enumr   r   r   r   r   r   r   _binaryr	   r   r
   rK   r   r   rm  r   rU  	getLoggerr#   r^   compiler   rL   r
  r   r   	SAFEBLOCKr1   r   r"   r+   r8   r<   r>   rr   rq   rz   r   r  r  r  rW  rY  r]  r}  r  ri  r  register_openrN  register_saveregister_save_allregister_extensionsregister_mimer)   r)   r)   r*   <module>   s   !


	YT  [  U  G