
    e                       d dl mZ 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j4                  e      Z ej:                  d      j<                  ZdZ ddddddddddddddddZ! ej:                  d      Z"ejF                  Z$	 de$z  Z%	  G d d e	      Z& G d! d"e	      Z'd# Z(dKd$Z) G d% d&      Z* G d' d(e+      Z, G d) d*      Z- G d+ d,e*      Z.d- Z/ G d. d/ej                        Z0d0d1d2d3d4d5d6d6d6d7d8d9d:d;d<d=Z1d> Z2 G d? d@      Z3 G dA dB      Z4dC Z5dD Z6e2dEfdFZ7dG Z8 ejr                  e0jt                  e0e/        ejv                  e0jt                  e7        ejx                  e0jt                  e6        ejz                  e0jt                  dHdIg        ej|                  e0jt                  dJ       y)L    )annotationsN)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                      e Zd ZdZ	 dZ	 dZy)Disposalr   r   r   N)__name__
__module____qualname__OP_NONEOP_BACKGROUNDOP_PREVIOUS     4/usr/lib/python3/dist-packages/PIL/PngImagePlugin.pyr%   r%   c   s$    G M
 Kr-   r%   c                      e Zd ZdZ	 dZy)Blendr   r   N)r&   r'   r(   	OP_SOURCEOP_OVERr,   r-   r.   r0   r0   x   s    I
 Gr-   r0   c                    t        j                         }|j                  | t              }|j                  rd}t        |      |S )NzDecompressed Data Too Large)zlibdecompressobj
decompressMAX_TEXT_CHUNKunconsumed_tail
ValueError)sdobj	plaintextmsgs       r.   _safe_zlib_decompressr>      s>    D>2I+or-   c                4    t        j                  | |      dz  S )Nl    )r4   crc32)dataseeds     r.   _crc32rC      s    ::dD!J..r-   c                  J    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zdd
Zy)ChunkStreamc                     || _         g | _        y N)fpqueue)selfrH   s     r.   __init__zChunkStream.__init__   s    
r-   c                   d}| j                   r:| j                   j                         \  }}}| j                  j                  |       nE| j                  j	                  d      }|dd }| j                  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 ))rI   poprH   seekreadtelli32is_cidr   LOAD_TRUNCATED_IMAGESreprSyntaxError)rJ   cidposlengthr:   r=   s         r.   rP   zChunkStream.read   s    ::#zz~~/CfGGLLQAAB%C'',,.CVFc{22/S	{!<!#&&Cr-   c                    | S rG   r,   rJ   s    r.   	__enter__zChunkStream.__enter__   s    r-   c                $    | j                          y rG   )close)rJ   argss     r.   __exit__zChunkStream.__exit__   s    

r-   c                     d x| _         | _        y rG   )rI   rH   r[   s    r.   r^   zChunkStream.close   s    ##
TWr-   c                @    | j                   j                  |||f       y rG   )rI   appendrJ   rW   rX   rY   s       r.   pushzChunkStream.push   s    

3V,-r-   c                |    t         j                  d|||        t        | d|j                  d      z         ||      S )z"Call the appropriate chunk handlerzSTREAM %r %s %schunk_ascii)loggerdebuggetattrdecoderd   s       r.   callzChunkStream.call   s;     	&S&9<wtX

7(;;<S&IIr-   c                ~   t         j                  r|d   dz	  dz  r| j                  ||       y	 t        |t        |            }t	        | j
                  j                  d            }||k7  rdt        |       d}t        |      y# t        j                  $ r }dt        |       d}t        |      |d}~ww xY w)	zRead and verify checksumr      r   Nr   z(broken PNG file (bad header checksum in rM   z(broken PNG file (incomplete checksum in )r   rT   crc_skiprC   rR   rH   rP   rU   rV   structerror)rJ   rW   rA   crc1crc2r=   es          r.   crczChunkStream.crc   s     **A!aMM#t$	*$s,Dtww||A'Dt|@c1M!#&&  || 	*<T#YKqICc")	*s   AB	 	B<B77B<c                :    | j                   j                  d       y)zRead checksumr   N)rH   rP   )rJ   rW   rA   s      r.   rp   zChunkStream.crc_skip   s     	Qr-   c                   g }	 	 | j                         \  }}}||k(  r	 |S | j	                  |t        j                  | j                  |             |j                  |       _# t        j                  $ r}d}t        |      |d }~ww xY w)Nztruncated PNG file)	rP   rq   rr   OSErrorrv   r   
_safe_readrH   rc   )rJ   endchunkcidsrW   rX   rY   ru   r=   s           r.   verifyzChunkStream.verify   s     *#'99; S&
 h  HHS)..tww?@KK  << **cl)*s   A# #B	6BB	N)   IEND)r&   r'   r(   rK   rP   r\   r`   r^   re   rm   rv   rp   r}   r,   r-   r.   rE   rE      s5     ($.J*(
r-   rE   c                  "    e Zd ZdZedd       Zy)iTXtzq
    Subclass of string to allow iTXt chunks to look like strings while
    keeping their extra information

    Nc                N    t         j                  | |      }||_        ||_        |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textr   r   rJ   s        r.   r   ziTXt.__new__   s'     {{3%		r-   )NN)r&   r'   r(   __doc__staticmethodr   r,   r-   r.   r   r      s      r-   r   c                  .    e Zd ZdZd ZddZddZddZy)	PngInfoz<
    PNG chunk container (for use with save(pnginfo=))

    c                    g | _         y rG   )chunksr[   s    r.   rK   zPngInfo.__init__  s	    r-   c                z    ||g}|r|j                  d       | j                  j                  t        |             y)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)rc   r   tuple)rJ   rW   rA   
after_idatchunks        r.   addzPngInfo.add  s2     dLL5<(r-   c                   t        |t              s|j                  dd      }t        |t              s|j                  dd      }t        |t              s|j                  dd      }t        |t              s|j                  dd      }|r8| j                  d|dz   |z   dz   |z   dz   t	        j
                  |      z          y| j                  d|dz   |z   dz   |z   dz   |z          y)	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   r4   compress)rJ   keyvaluer   r   zips         r.   add_itxtzPngInfo.add_itxt  s     #u%**Y1C%'LL(3E$&;;w1D$&;;w1DHHk!D(5047%?$--PUBVV
 HHWcIo4u<tCeKeSTr-   c                   t        |t              r*| j                  |||j                  |j                  |      S t        |t
              s	 |j                  dd      }t        |t
              s|j                  dd      }|r,| j                  d|dz   t        j                  |      z          y| j                  d|dz   |z          y# t        $ r | j                  |||      cY S w xY w)	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   r   r   r   r   r   r   UnicodeErrorr   r4   r   )rJ   r   r   r   s       r.   add_textzPngInfo.add_text:  s     eT"==eUZZ=MM %':Y9 #u%**Y1CHHWcGmdmmE.BBCHHWcEkE12   :}}S%S}99:s   C C'&C'NF) r   F)r&   r'   r(   r   rK   r   r   r   r,   r-   r.   r   r     s    
)U83r-   r   c                       e Zd Z fdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z xZS )	PngStreamc                    t         |   |       i | _        i | _        d| _        d | _        d | _        d | _        d | _        d | _	        d | _
        d | _        d| _        y )Nr   r   r   )superrK   im_infoim_textim_sizeim_modeim_tile
im_paletteim_custom_mimetypeim_n_frames_seq_numrewind_statetext_memory)rJ   rH   	__class__s     r.   rK   zPngStream.__init__[  sc     "& r-   c                    | xj                   |z  c_         | j                   t        kD  rd| j                    d}t        |      y )Nz%Too much memory used in text chunks: z>MAX_TEXT_MEMORY)r   MAX_TEXT_MEMORYr9   )rJ   chunklenr=   s      r.   check_text_memoryzPngStream.check_text_memoryl  sN    H$o-7##$$46  S/! .r-   c                r    | j                   j                         | j                  | j                  d| _        y )N)infotileseq_num)r   copyr   r   r   r[   s    r.   save_rewindzPngStream.save_rewindu  s*    LL%%'LL}}
r-   c                |    | j                   d   | _        | j                   d   | _        | j                   d   | _        y )Nr   r   r   )r   r   r   r   r[   s    r.   rewindzPngStream.rewind|  s8    ((0((0)))4r-   c                   t        j                  | j                  |      }|j                  d      }t        j                  d|d |        t        j                  d||          ||   }|dk7  rd| d}t        |      	 t        ||dz   d        }|| j                  d<   |S # t        $ r t         j                  rd }n Y 0t        j                  $ r d }Y Fw xY w)	Nr   ziCCP profile name %rzCompression method %sr   Unknown compression method z in iCCP chunkr   icc_profile)r   rz   rH   findri   rj   rV   r>   r9   rT   r4   rr   r   )rJ   rX   rY   r:   icomp_methodr=   r   s           r.   
chunk_iCCPzPngStream.chunk_iCCP  s      &1 FF5M+QrU3,ad3d!/}NKCc""	/!a%'
;K '2]#  	.."  zz 	K	s    B" "CCCc                p   t        j                  | j                  |      }|dk  rt         j                  r|S d}t	        |      t        |d      t        |d      f| _        	 t        |d   |d   f   \  | _        | _	        |d   rd| j                  d	<   |d
   rd}t        |      |S # t        $ r Y 3w xY w)N   zTruncated IHDR chunkr   r   r   	      r   	interlace   zunknown filter category)r   rz   rH   rT   r9   rR   r   _MODESr   
im_rawmode	Exceptionr   rV   rJ   rX   rY   r:   r=   s        r.   
chunk_IHDRzPngStream.chunk_IHDR  s      &1B;..(CS/!1ay#a)+	,2AaD!A$<,@)DL$/ R5()DLL%R5+Cc""  		s   #B) )	B54B5c                   d| j                   v rd| j                   d   || j                  fg}n9| j                  d| j                   d<   dd| j                  z   || j                  fg}|| _        || _        d}t        |      )Nbboxr   Tdefault_imager   zimage data found)r   r   r   r   r   im_idatEOFError)rJ   rX   rY   r   r=   s        r.   
chunk_IDATzPngStream.chunk_IDAT  s    T\\!DLL0#tGHD+04_-FT\\13HID smr-   c                    d}t        |      )Nzend of PNG image)r   )rJ   rX   rY   r=   s       r.   
chunk_IENDzPngStream.chunk_IEND  s     smr-   c                v    t        j                  | j                  |      }| j                  dk(  r	d|f| _        |S )Nr   r   )r   rz   rH   r   r   rJ   rX   rY   r:   s       r.   
chunk_PLTEzPngStream.chunk_PLTE  s4      &1<<3#QhDOr-   c                   t        j                  | j                  |      }| j                  dk(  rMt        j                  |      r'|j                  d      }|dk\  r || j                  d<   |S || j                  d<   |S | j                  dv rt        |      | j                  d<   |S | j                  dk(  r/t        |      t        |d      t        |d      f| j                  d<   |S )	Nr   r   r   transparencyr   r   r   r   r   r   )	r   rz   rH   r   _simple_palettematchr   r   i16)rJ   rX   rY   r:   r   s        r.   
chunk_tRNSzPngStream.chunk_tRNS  s      &1<<3$$Q' FF5M634DLL0  01^,
 	 \\_,+.q6DLL(  \\U"+.q63q!9c!Qi+GDLL(r-   c                |    t        j                  | j                  |      }t        |      dz  | j                  d<   |S )N     j@gamma)r   rz   rH   rR   r   r   s       r.   
chunk_gAMAzPngStream.chunk_gAMA  s4      &1 #A 1Wr-   c                    t        j                  | j                  |      }t        j                  dt        |      dz  z  |      }t        d |D              | j                  d<   |S )Nz>%dIr   c              3  &   K   | ]	  }|d z    yw)r   Nr,   ).0elts     r.   	<genexpr>z'PngStream.chunk_cHRM.<locals>.<genexpr>  s     ,PS8^,Ps   chromaticity)r   rz   rH   rq   unpacklenr   r   )rJ   rX   rY   r:   raw_valss        r.   
chunk_cHRMzPngStream.chunk_cHRM  sU       &1==3q6Q;!7;',,Px,P'P^$r-   c                    t        j                  | j                  |      }|dk  rt         j                  r|S d}t	        |      |d   | j
                  d<   |S )Nr   zTruncated sRGB chunkr   srgb)r   rz   rH   rT   r9   r   r   s        r.   
chunk_sRGBzPngStream.chunk_sRGB  sU       &1A:..(CS/! tVr-   c                4   t        j                  | j                  |      }|dk  rt         j                  r|S d}t	        |      t        |d      t        |d      }}|d   }|dk(  r|dz  |dz  f}|| j                  d<   |S |dk(  r||f| j                  d	<   |S )
Nr   zTruncated pHYs chunkr   r   r   r   
F%u?dpiaspect)r   rz   rH   rT   r9   rR   r   )	rJ   rX   rY   r:   r=   pxpyunitr   s	            r.   
chunk_pHYszPngStream.chunk_pHYs  s      &1A:..(CS/!QC1IBt19v+rF{*C"%DLL  QY%'VDLL"r-   c                b   t        j                  | j                  |      }	 |j                  dd      \  }}|rc|j                  dd      }|j                  dd      }|dk(  r|n|| j                  |<   || j                  |<   | j                  t        |             |S # t        $ r |}d}Y vw xY w)Nr   r   r-   r   r   replaceexif)
r   rz   rH   splitr9   rl   r   r   r   r   )rJ   rX   rY   r:   kvv_strs          r.   
chunk_tEXtzPngStream.chunk_tEXt  s      &1	775!$DAq
 H-AHHY	2E#$;aEDLLO#DLLO""3u:.  	AA	s   B B.-B.c                $   t        j                  | j                  |      }	 |j                  dd      \  }}|r|d   }nd}|dk7  rd| d}t        |      	 t        |dd        }|r\|j                  dd      }|j                  dd	      }|x| j                  |<   | j                  |<   | j                  t        |             |S # t        $ r |}d}Y w xY w# t        $ r t         j                  rd}n Y t        j                  $ r d}Y w xY w)
Nr   r   r-   r   r   z in zTXt chunkr   r   r  )r   rz   rH   r  r9   rV   r>   rT   r4   rr   rl   r   r   r   r   )rJ   rX   rY   r:   r  r  r   r=   s           r.   
chunk_zTXtzPngStream.chunk_zTXt  s$     &1	775!$DAq A$KK!/}NKCc""	%ae,A H-AI.A011DLLOdll1o""3q6*7  	AA	  	..  zz 	A	s)   C C CCD8DDc                   t        j                  | j                  |      x}}	 |j                  dd      \  }}t        |      dk  r|S |d   |d   |dd  }}}	 |j                  dd      \  }}	}
|dk7  r|dk(  r	 t        |
      }
n|S 	 |j                  dd      }|j                  dd      }|	j                  dd      }	|
j                  dd      }
t        |
||	      x| j                  |<   | j                  |<   | j                  t        |
             |S # t        $ r |cY S w xY w# t        $ r |cY S w xY w# t        $ r t         j                  r|cY S  t        j                  $ r |cY S w xY w# t        $ r |cY S w xY w)Nr   r   r   r   r   r   r   )r   rz   rH   r  r9   r   r>   rT   r4   rr   rl   r   r   r   r   r   )rJ   rX   rY   rr:   r  cfcmr   tkr  s              r.   
chunk_iTXtzPngStream.chunk_iTXtA  s   $$TWWf55A	775!$DAq q6A:HaD!A$!"B	''%+KD"a 7Qw-a0A 	H-A;;w1D7H-B(+A -1D",==Q$,,q/s1v&C  	H	  	H	 "  66 zz H  	H	sN   D D' :D8 	AE0 D$#D$'D54D58E-E-,E-0E>=E>c                j    t        j                  | j                  |      }d|z   | j                  d<   |S )N   Exif  r  )r   rz   rH   r   r   s       r.   
chunk_eXIfzPngStream.chunk_eXIfi  s0      &1.2Vr-   c                   t        j                  | j                  |      }|dk  rt         j                  r|S d}t	        |      | j
                  d | _        t        j                  d       |S t        |      }|dk(  s|dkD  rt        j                  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   rz   rH   rT   r9   r   warningswarnrR   r   r   )rJ   rX   rY   r:   r=   n_framess         r.   
chunk_acTLzPngStream.chunk_acTLo  s      &1A:..6CS/!'#DMMPQHq6q=Hz1MMPQH#"1ayV".r-   c                   t        j                  | j                  |      }|dk  rt         j                  r|S d}t	        |      t        |      }| j                  |dk7  s| j                  | j                  |dz
  k7  rd}t        |      || _        t        |d      t        |d      }}t        |d      t        |d	      }	}| j                  \  }
}||z   |
kD  s|	|z   |kD  rd
}t        |      ||	||z   |	|z   f| j                  d<   t        |d      t        |d      }}|dk(  rd}t        |      t        |      z  dz  | 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   rz   rH   rT   r9   rR   r   rV   r   r   r   float)rJ   rX   rY   r:   r=   seqwidthheightr   r   im_wim_h	delay_num	delay_dens                 r.   
chunk_fcTLzPngStream.chunk_fcTL  sn     &1B;..6CS/!!fMM!cQhMM%$--37*B7Cc""Aq	3q!9vQSBZB\\
d:Vd 20Cc"" "BU
BK@V"1bz3q":9	>I#(#3eI6F#F#MZ #$R5Z  !"Wr-   c                \   |dk  r?t         j                  r"t        j                  | j                  |      }|S d}t	        |      t        j                  | j                  d      }t        |      }| j                  |dz
  k7  rd}t        |      || _        | j                  |dz   |dz
        S )Nr   z"APNG contains truncated fDAT chunkr   r  )	r   rT   rz   rH   r9   rR   r   rV   r   )rJ   rX   rY   r:   r=   r)  s         r.   
chunk_fdATzPngStream.chunk_fdAT  s    A:..((&96CS/!  !,!f==C!G#7Cc""sQw
33r-   )r&   r'   r(   rK   r   r   r   r   r   r   r   r   r   r   r   r   r  r
  r  r  r  r  r0  r2  __classcell__r   s   @r.   r   r   Z  sn    ""
5
6(( "& D&P(:4r-   r   c                    | d d t         k(  S )Nr   )_MAGIC)prefixs    r.   _acceptr8    s    "1:r-   c                  t     e Zd ZdZdZd Zed        Zd Zd Z	ddZ
d Zd	 Zd
 Zd Zd Z fdZd Z xZS )PngImageFilePNGzPortable network graphicsc                F   t        | j                  j                  d            sd}t        |      | j                  | _        d| _        g | _        t        | j                        | _        	 | j                  j                         \  }}}	 | j                  j                  |||      }| j                  j%                  ||       Y# t        $ r Y nvt        $ rk t        j                  d|||       t        j                  | j                  |      }|dd j!                         r| j                  j#                  ||f       Y w xY w| j                  j&                  | _        | j                  j*                  | _        | j                  j.                  | _        d | _        | j                  j4                  | _        | j                  j8                  | _        | j                  j<                  xs d| _        | j0                  jA                  dd      | _!        | j                  jD                  r4| j                  jD                  \  }}tG        jH                  ||      | _%        |d	k(  r|d
z
  | _&        n|| _&        | j                  j<                  d| _'        | j                  jQ                          | jL                  | _)        | j                  jU                         | _+        | jB                  r| xj>                  dz  c_        | jY                  d       | j>                  dkD  | _-        y )Nr   znot a PNG filer   %r %s %s (unknown)r   r   r   F   fdATr   ).r8  rH   rP   rV   _fp_PngImageFile__frameprivate_chunksr   pngrm   r   AttributeErrorri   rj   r   rz   islowerrc   rv   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_idatrQ   _PngImageFile__rewind_seekis_animated)rJ   r=   rW   rX   rY   r:   rawmoderA   s           r.   _openzPngImageFile._open  sf   tww||A'"Cc""77
 !TWW%  $xx}}Cf9HHMM#sF3 HHLLa !   ! 913VD((&9q8##%''..Qx8	9 XX%%
XX%%
HH$$	
HH$$	#xx::,,1!YY]]?EB88 HH//MGT'++GT:DL'>"(1*D"(D88+5:D2HH  "!%!4!4D HHMMODM!!"JJqM==1,s   C 	EA0EEc                    | j                   c| j                  r*| j                  }| j                  | j                  dz
         | j                          | j                  r| j                         | j                   S )Nr   )rG  rQ  r@  rO   r  load)rJ   frames     r.   r   zPngImageFile.text  s_     :: 		$--!+,IIK		% zzr-   c                T   | j                   d}t        |      | j                   j                  | j                  d   d   dz
         | j                  j                          | j                  j                          | j                  r| j                   j                          d| _         y)zVerify PNG fileNz)verify must be called directly after openr   r   r   )rH   RuntimeErrorrO   r   rB  r}   r^   _exclusive_fp)rJ   r=   s     r.   r}   zPngImageFile.verify  sy     77?=Cs## 	TYYq\!_q()GGMMOr-   c                H   | j                  |      sy || j                  k  r| j                  dd       | j                  }t        | j                  dz   |dz         D ]  }	 | j                  |        y # t        $ r$}| j                  |       d}t	        |      |d }~ww xY w)Nr   Tr   zno more images in APNG file)_seek_checkr@  rP  ranger   rO   )rJ   rV  
last_framefru   r=   s         r.   rO   zPngImageFile.seek#  s    &4<<JJq$\\
t||a'3 	+A+

1	+  +		*%3sm*+s    A44	B!=BB!c                ^
   |dk(  rK|r| j                   j                  | j                         | j                  j	                          | j
                  | _        d | _        | j                  rd | _        | j                  j                  | _
        | j                  j                  | _        | j                   | _        d | _        d | _        | j                  j!                  dd      | _        | j                  j!                  d      | _        | j                  j!                  d      | _        | j                  j!                  d      | _        d| _        n_|| j*                  dz   k7  rd| }t-        |      | j/                          | j                  r0| j                  j1                  | j                  | j(                         | j                  j3                         | _        | j                   | _        | j                  r1t5        j6                  | j                  | j                         d| _        d}	 | j                  j9                  d
       	 | j                  j9                         \  }}}|dk(  rd}tA        |      |dk(  r|rd}t?        |      d	}	 | j                  jC                  |||       | j                  2| j$                  tL        jN                  k(  rtL        jP                  | _        | j$                  tL        jN                  k(  rK| j                  j3                         | _        | jS                  | j                  | j(                        | _        y | j$                  tL        jP                  k(  retT        jV                  jY                  | jZ                  | j\                        | _        | jS                  | j                  | j(                        | _        y d | _        y # t:        j<                  t>        f$ r Y nw xY w# tD        $ r Y nt@        $ r9 |dk(  r|d
z  }|r	|| _        Y njt5        j6                  | j                  |       Y tF        $ r< tH        jK                  d|||       t5        j6                  | j                  |       Y w xY w|| _        | j                  j                  | _        | j                  j!                  d      | _        | j                  j!                  d      | _        | j                  j!                  d      | _        | j                  rqd}tA        |      )Nr   r   Fr%  r'  r   r   zcannot seek to frame Tr   r~   zNo more images in APNG file   fcTLzAPNG missing frame datar>  r=  zimage not found in APNG frame)/r?  rO   rO  rB  r   rN  rL  impyaccessr   r   r   r   rH   _prev_imdisposerI  r   
dispose_opblend_opdispose_extentr@  r9   rU  paster   r   rz   rP   rq   rr   rV   r   rm   UnicodeDecodeErrorrC  ri   rj   r%   r+   r*   _cropr   corefillmodesize)rJ   rV  r   r=   frame_startrW   rX   rY   s           r.   rP  zPngImageFile._seek2  s   A:dmm,!&*&8&8#==$(DM HH,,	 HH,,	(( DMDL!%!FD"iimmJ7DO IIMM'2DM"&))--"7DDLq((-eW5 o% IIK||dllD,?,?@ GGLLNDMhhDG ""$$TWWd.A.AB&'#KQ'+xx}}$Cf '>7C"3-''>"7)#.."&K:HHMM#sF3' X == T__8L8L%L&44DO??h222==--/DL::dllD4G4GHDL__ 6 66 ::??499dii@DL::dllD4G4GHDLDLc k2  *  :g~!&28D/!((&9% :LL!5sCH((&9: !DL((DI"iimmJ7DO IIMM'2DM"&))--"7D995sm#s7   O! P  !O=<O= 	RR( RA RRc                    | j                   S rG   )r@  r[   s    r.   rQ   zPngImageFile.tell  s    ||r-   c                    | j                   j                  d      r| j                  dz   | _        | j                  | _        t
        j
                  j                  |        y)z"internal: prepare to read PNG filer   )r   N)r   rI  decoderconfigrL  _PngImageFile__idatr   load_preparer[   s    r.   rt  zPngImageFile.load_prepare  sH     99==%!%!3!3d!:D))((.r-   c                ,   | j                   dk(  r| j                  j                  d       | j                  j                         \  }}}|dvr| j                  j	                  |||       y|dk(  r)	 | j                  j                  |||       |dz
  | _         n|| _         | j                   dk(  r|dk  r| j                   }nt        || j                         }| j                   |z
  | _         | j                  j                  |      S # t        $ r Y w xY w)zinternal: read more image datar   r   )   IDATs   DDATr>  r-   r>  )rs  rH   rP   rB  re   rm   r   min)rJ   
read_bytesrW   rX   rY   s        r.   	load_readzPngImageFile.load_read  s     kkQ GGLLO#xx}}Cf55c3/g~HHMM#sF3 %qj$% kkQ* ?JZ5JkkJ.ww||J''   s   1D 	DDc                   | j                   dk7  r%| j                  j                  | j                          	 | j                  j                  d       	 | j                  j                         \  }}}|dk(  rnU|dk(  r1| j                  r%d| _        | j                  j                  |||       n	 | j                  j                  |||       | j                  j*                  | _        | j                  s"| j                  j/                          d
| _        y
| j0                  r| j2                  t4        j6                  k(  r| j9                  | j:                  | j<                        }| j:                  j>                  dk(  r.d| j@                  v r |jC                  d| j@                  d         }n|jE                  d      }| j0                  jG                  || j<                  |       | j0                  | _        | jH                  rd
| _$        y
y
y
y
# t        j
                  t        f$ r Y [w xY w# t        $ r Y kt        $ r. |dk(  r|dz  }t        j                  | j                  |       Y t        $ rm t         j#                  d|||       t        j                  | j                  |      }|dd	 j%                         r| j&                  j)                  ||df       Y w xY w)z%internal: finished reading image datar   Tr   r~   r`  r>  r=  r   r   Nr   r   r   )%rs  rH   rP   rB  rq   rr   rV   rQ  rL  re   rm   ri  r   r   rz   rC  ri   rj   rD  rA  rc   r   rG  r^   rc  rf  r0   r2   rj  ra  rg  rm  r   convert_transparentconvertrh  rb  )rJ   rW   rX   rY   r:   updatedmasks          r.   load_endzPngImageFile.load_end  sM   ;;!GGLL%GGLLO#'88==? S& g~D$4$4&'#c3/?c3/# : XX%%
HHNNDH}}%--!?**TWWd.A.AB77<<5(^tyy-H"66		. 9D #??62D##GT-@-@$G--==$(DM ! "@}; LL+.  &  6'>aKF$$TWWf5! ?13VD((&9q8##%''..Q~>	?s1   H
 -H* 
H'&H'*	K 62K +A1K K c                    d| j                   vr| j                          d| j                   vrd| j                   vry | j                         j                         S )Nr  zRaw profile type exif)r   rU  getexif_get_merged_dictr[   s    r.   _getexifzPngImageFile._getexif  sG    "IIK"'>dii'O||~..00r-   c                \    d| j                   vr| j                          t        |          S )Nr  )r   rU  r   r  )rJ   r   s    r.   r  zPngImageFile.getexif  s%    "IIKw  r-   c                ^    d| j                   v r| j                  | 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   _getxmpr[   s    r.   getxmpzPngImageFile.getxmp  s7     #dii/ LL#678	
 	
r-   r   )r&   r'   r(   formatformat_descriptionrS  propertyr   r}   rO   rP  rQ   rt  ry  r  r  r  r  r3  r4  s   @r.   r:  r:    s_    F4A-F  "+\ |/(B1)f1!
r-   r:  )r       )L;1r  )r   s    )r   s    )r   s    )r   s   )r   s    )r   s   )r   s   )r   s   )r   s   )r   s   )r   s   )r   r  r   r   r   r   r   zI;16r   r   r   r   r   r   r   c                    dj                  |      }| j                  t        t        |            |z          | j                  |       t	        |t	        |            }| j                  t        |             y)z'Write a PNG chunk (including CRC field)r-   N)joinwriteo32r   rC   rH   rW   rA   rv   s       r.   putchunkr  "  sU     88D>DHHST^c!"HHTN
vc{
#CHHSXr-   c                      e Zd Zd Zd Zy)_idatc                     || _         || _        y rG   )rH   r   )rJ   rH   r   s      r.   rK   z_idat.__init__0  s    
r-   c                >    | j                  | j                  d|       y )Nrv  )r   rH   rJ   rA   s     r.   r  z_idat.write4  s    

477GT*r-   Nr&   r'   r(   rK   r  r,   r-   r.   r  r  -  s    +r-   r  c                      e Zd Zd Zd Zy)_fdatc                .    || _         || _        || _        y rG   )rH   r   r   )rJ   rH   r   r   s       r.   rK   z_fdat.__init__;  s    
r-   c                    | j                  | j                  dt        | j                        |       | xj                  dz  c_        y )Nr>  r   )r   rH   r  r   r  s     r.   r  z_fdat.write@  s/    

477GS%6=r-   Nr  r,   r-   r.   r  r  8  s    
r-   r  c                   | j                   j                  d| j                  j                  dd            }| j                   j                  d| j                  j                  dd            }| j                   j                  d| j                  j                  dt        j                              }| j                   j                  d| j                  j                  dt
        j                              }	|rt        j                  |      }
nt        j                  | g|      }
g }d}|
D ]  }t        j                  |      D ]m  }|j                  |k(  r|j                         }n|j                  |      }| j                   j                         }t        |t        t         f      r||   |d<   t        |t        t         f      r||   |d<   t        |	t        t         f      r|	|   |d<   |dz  }|r|d   }|d   j                  d      }|d   j                  d      }|t        j"                  k(  rt%        |      d	k  rt        j&                  }|t        j&                  k(  ry|d
   j                         }t(        j*                  j-                  d| j.                  d      }|d   }|r|j1                  |      }nd| j.                  z   }|j3                  ||       n!|t        j"                  k(  r	|d   d
   }n|d
   }t5        j6                  |j                  d      |j                  d            }|j9                  d      }|sL||j                  d      k(  r8||j                  d      k(  r$|d   dxx   |j                  d|      z  cc<   Nd }d|vr||d<   |j;                  |||d       p  t%        |      dk(  r
|s|d   d
   S  ||dt=        t%        |            t=        |             |rS| j                  |k7  r| j                  |      } t?        j@                  | tC        ||      dd| j.                  z   d|fg       d}tE        |      D ]t  \  }}|d
   }|d   sd|j.                  z   }n|d   }|j1                  |      }|j.                  }|d   }tG        tI        |d               }|j                  d|      }|j                  d|	      } ||dt=        |      t=        |d         t=        |d         t=        |d         t=        |d         tK        |      tK        d      tM        |      tM        |             |dz  }|dk(  r7|s5t?        j@                  |tC        ||      dd|j.                  z   d|fg       3tO        |||      }t?        j@                  ||dd|j.                  z   d|fg       |jP                  }w y )Nr#  r   r  r%  r'  r   encoderinfor   ra  r   )r   r   r   r   r   r   F)
alpha_only)ra  r   r  s   acTLr   r`  r"  ))r  rI  r   r%   r)   r0   r1   	itertoolschainr
   Iteratorrm  r   r|  r   listr   r+   r   r*   r   rk  rl  rn  croprh  r   subtract_modulogetbboxrc   r  r   _saver  	enumerateintroundo16r   r  r   )ra  rH   r   rR  r   append_imagesr#  r  r%  r'  r  	im_framesframe_countim_seqim_framer  previousprev_disposal
prev_blendbase_imrd  r   deltar   rV  
frame_datarn  frame_durationframe_disposalframe_blendfdat_chunkss                                  r.   _write_multiple_framesr  E  sR   ~~!!*bggkk*a.HIH>>fbggkk&!&<=D~~!!*bggkk*hFVFV.WXHNNwGU__(MNE.m4IK 4Y%..v6 3	YH}}'#==?#++G4..--/K(T5M2*2;*?J'(T5M2*2;*?J'%$/',['9G$1K$R= ( 7 ; ;J G%m488A
 H$8$88S^a=O$,$:$:M H$:$::&tn113G#jjoofbgg|LG#F+D"),,t"4%/MM'40"h&:&::'mD1G&tnG"22$$V,goof.E }}}6%)DD"koog&>>]+J7;??"H< 7 ,*2J'Hd;WXg3	Y4Yl 9~=|D!! 

C	ND		 77gG$BE"e,v7GG/T.UVG&y1 **zd#&!HMM)Df%D}}T*H}} /U;z#:;<$X>!oogu5LQLQLQLQLI~{O	
 	1A:mOOb% (--/G<=  E73KOO(--/G<=
 "))GU**r-   c                "    t        | ||d       y )NT)save_all)r  )ra  rH   filenames      r.   	_save_allr    s    	"b(T*r-   Fc                    |r| j                   j                  d| j                  j                  d            }t               }| j                   j                  dg       }t	        j
                  | g|      D ]7  }t        j                  |      D ]  }	|j                  |	j                          9 dD ]  }
|
|v s n |j                         }
n| j                  }
|
dk(  rd| j                   v rt        d| j                   d   z  d      }nL| j                  r>t        t        t        | j                  j                         d         dz  d      d      }nd}|d	k  r|d
k  rd}n
|dk  rd
}nd}|
 d| }
| j                   j                  dd      | j                   j                  dd      | j                   j                  dd      | j                   j                  dd      f| _        	 t"        |
   \  }}
|j)                  t*                ||dt-        | j.                  d         t-        | j.                  d         |
ddd       g d}| j                   j                  d| j                  j                  d            }|r8d}|dz   t1        j2                  |      z   } ||d|       |j5                  d       | j                   j                  d      }|rrg d }|j6                  D ]_  }|d d
 \  }}||v r|j5                  |        ||||       +||v r ||||       :|dd
 j9                         sN|d
d }|rV ||||       a | j                  dk(  rOdz  }| j:                  j=                  d!      d | }t        |      |k  r|dz  }t        |      |k  r ||d"|       | j                   j                  d#| j                  j                  d#d             }|s|dk(  r| j                  dk(  rM}t?        |t@              r ||d$|d |        nt        dt        d%|            }d&|z  dz   } ||d$|d |        n| j                  d'v r*t        dt        d(|            } ||d$tC        |             n| j                  d!k(  r2|\  }}}  ||d$tC        |      tC        |      z   tC        |       z          nrd#| j                   v rdd)}t'        |      | j                  dk(  rH| j:                  jE                         d*k(  r+| j:                  j=                  d*d+      }} ||d$|d |        | j                   j                  d,      }!|!rB ||d-t-        tG        |!d   d.z  d/z               t-        tG        |!d   d.z  d/z               d0       |r=d1d2g}|j6                  D ]*  }|d d
 \  }}||v s|j5                  |        ||||       , | j                   j                  d3      }"|"rKt?        |"tH        jJ                        r|"jM                  d4      }"|"jO                  d5      r|"d6d  }" ||d7|"       |rtQ        | |||      } | r3tS        jT                  | tW        ||      d8d9| j.                  z   d|fg       |r?|j6                  D ]0  }|d d
 \  }}|dd
 j9                         s|d
d }|s' ||||       2  ||d:d       tY        |d;      r|j[                          y y # t$        $ r}d|
 d}t'        |      |d }~ww xY w)<Nr   r  )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   r~   flush).r  rI  r   setr  r  r
   r  r   rm  rN   rw  rK  maxr   getdataencoderconfig	_OUTMODESKeyErrorry   r  r6  r  rn  r4   r   remover   rD  ra  
getpaletter   r   r  getpalettemoder  r   Exiftobytes
startswithr  r   r  r  hasattrr  )#ra  rH   r  r   r  r   modesr  r  r  rm  colorsr  rR  ru   r=   r   iccnamerA   r   chunks_multiple_allowed
info_chunkrW   r   palette_byte_numberpalette_bytesr   alpha_bytesalpharedgreenbluer   r  s#                                      r.   r  r    s    **RWW[[9
 **?B?oordM: 	)F)226: )		(--()	) ) 	Du}	 99;Dwws{ R^^#bnnV44c:F zzSRZZ%7%7%9!%<!=!BCH!LR<{1V1TF#D 	:u-
+R0
?B/
<-	B"!$ HHV	
BGGAJBGGAJ	 ;F
..

]BGGKK,F
GC
 g~c 22b'4  	g>>i(D"F++ 	)J"2AICf}c"b#t$//b#t$Qq!!#'!_
!"c4(	) 
ww#~$qj((/0D1DE- #66U"M - #66b'=)>>%%nbggkk.RV6WXL|q(77c> K,.b'<#=>"1c#|&<=,.6b'5+#67WW'q#e\":;L"gs<01WW+C"gs3x#e*4s4y@A/ >cl"77c>bee224>EE$$VS1E K"gu\k23
..

U
#C
CFVOc)*+CFVOc)*+	
 7#++ 	%J"2AICf}c"b#t$		% >>f%DdEJJ'<<?D???+8Db'4 #E7M=
 
E"e,v7GG/T.UV++ 	)J"2AIC1Qx!'!_
"c4(	) 
"gsr7

 O  ""4&0cl!"s   '[ 	[=&[88[=c                     G d d      }d } |       }	 || _         t        | |d|       | ` |j                  S # | ` w xY w)z4Return a list of PNG chunks representing this image.c                      e Zd Zg Zd Zd Zy)getchunks.<locals>.collectorc                     y rG   r,   r  s     r.   r  z"getchunks.<locals>.collector.write  s    r-   c                :    | j                   j                  |       y rG   )rA   rc   )rJ   r   s     r.   rc   z#getchunks.<locals>.collector.append  s    IIU#r-   N)r&   r'   r(   rA   r  rc   r,   r-   r.   	collectorr    s    		$r-   r  c                    dj                  |      }t        t        |t        |                  }| j                  |||f       y )Nr-   )r  r  rC   rc   r  s       r.   rc   zgetchunks.<locals>.append  s7    xx~&vc{+,
		3c"#r-   N)r  r  rA   )ra  paramsr  rc   rH   s        r.   	getchunksr    sK    $ $$
 
Bb"dF#N77N Ns   9 =z.pngz.apngz	image/png)r   )?
__future__r   r  loggingrerq   r  r4   enumr   r   r   r   r   r	   r
   _binaryr   r   r   rR   r   r   r  r   r  	getLoggerr&   ri   compiler   rS   r6  r   r   	SAFEBLOCKr7   r   r%   r0   r>   rC   rE   r   r   r   r   r8  r:  r  r  r  r  r  r  r  r  register_openr  register_saveregister_save_allregister_extensionsregister_mimer,   r-   r.   <module>r     s.  B #   	     G G ! !  ! !			8	$	L	!	'	' 
 !+
2 "**01$$
 ~%w *G /V Vr3 ,M3 M3hS4 S4t
 L
9&& L
h
 
	
	"#	!!	(+ +
 
*D+ #+U }H>   L''w ?   L'' /   ++Y 7   ,--/@ A   L'' 5r-   