)EjHddlmZddlZddlZddlZddlZddlZddlZddlm Z ddl m Z ddl m Z mZmZddlmZmZmZmZmZddlmZdd lmZdd lmZdd lmZdd lmZdd l m!Z!ddl"m#Z#dZ$e$rddl%m&Z&ddl m'Z'm(Z(ddlm)Z)ej*e+Z,ej-dj.Z/dZ0dddddddddddd d!d"d#d$Z1ej-d%Z2ej3Z4 d&e4zZ5 Gd'd(e Z6Gd)d*e Z7dvd.Z8dwdxd2Z9Gd3d4Z:Gd5d6e;Z<Gd7d8Z=Gd9d:eZ>Gd;d22I Moo r7dataseedintc2tj||dzS)Nl)rAcrc32)rKrLs r8_crc32rPs :dD ! !J ..r7c`eZdZddZddZddZdd Zd d Zd!dZd"dZ d#dZ d#dZ d$d%dZ dS)& ChunkStreamfp IO[bytes]r?Nonec"||_g|_dSN)rSqueue)selfrSs r8__init__zChunkStream.__init__s$&:< r7tuple[bytes, int, int]cd}|jJ|jr8|j\}}}|j|nL|jd}|dd}|j}t |}t|s.tj s"dt|d}t||||fS)z.Fetch a new chunk. Returns header information.Nr)r(zbroken PNG file (chunk )) rSrXpopseekreadtelli32is_cidr LOAD_TRUNCATED_IMAGESrepr SyntaxError)rYcidposlengthr=rIs r8r`zChunkStream.readsw""" : #z~~// Cf GLL     QAABB%C',,..CVVFc{{ '2 '<S <<<!#&&&Cr7c|SrWr6rYs r8 __enter__zChunkStream.__enter__ r7argsobjectc.|dSrW)close)rYrns r8__exit__zChunkStream.__exit__s r7c"dx|_|_dSrW)rXrSrks r8rqzChunkStream.closes## TWWWr7rgr>rhrMricR|jJ|j|||fdSrW)rXappendrYrgrhris r8pushzChunkStream.pushs3z%%% 3V,-----r7ctd|||t|d|d||S)z"Call the appropriate chunk handlerzSTREAM %r %s %schunk_ascii)loggerdebuggetattrdecodervs r8callzChunkStream.callsN  &S&999rhrMrirMr?rU)rgr>rhrMrirMr?r>)rgr>rKr>r?rU)r)rr>r?r) r0r1r2rZr`rlrrrqrwrrrrr6r7r8rRrRs====    *$$$$....JJJJ ***** r7rRcDeZdZUdZded<ded<e d d d ZdS) iTXtzq Subclass of string to allow iTXt chunks to look like strings while keeping their extra information zstr | bytes | NonelangtkeyNtextstr str | Noner?cXt||}||_||_|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 )r__new__rr)clsrrrrYs r8rz iTXt.__new__ s*{{3%%   r7)NN)rrrrrrr?r)r0r1r2__doc____annotations__ staticmethodrr6r7r8rrs` DH    \   r7rc@eZdZdZddZddd Z dddZ dddZdS)PngInfoz< PNG chunk container (for use with save(pnginfo=)) r?rUcg|_dSrW)chunksrks r8rZzPngInfo.__init__!s 79 r7Frgr>rK after_idatboolc@|j|||fdS)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 N)rru)rYrgrKrs r8addz PngInfo.add$s' Cz233333r7key str | bytesvaluerrzipc*t|ts|dd}t|ts|dd}t|ts|dd}t|ts|dd}|r<|d|dz|zdz|zdzt j|zdS|d|dz|zdz|zdz|zdS) 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-1strictutf-8iTXtssN) isinstancer>encoderrAcompress)rYrrrrrs r8add_itxtzPngInfo.add_itxt0s)$#u%% 2**Y11C%'' 4LL(33E$&& 2;;w11D$&& 2;;w11D  U HHk!D(5047%?$-PUBVBVV      HHWcIo4ur UnicodeErrorrrAr)rYrrrs r8add_textzPngInfo.add_textSs@ eT " " ==#j4 ##j4 # ! %'' : : Y99 : : :}}S%S}99999 :#u%% 2**Y11C  3 HHWcGmdmE.B.BB C C C C C HHWcEkE1 2 2 2 2 2s"A99"BBNrF)rgr>rKr>rrr?rU)rrF) rrrrrrrrrrr?rU)rrrrrrr?rU)r0r1r2rrZrrrr6r7r8rrs :::: 4 4 4 4 4  !U!U!U!U!UHHM!3!3!3!3!3!3!3r7rc.eZdZUded<ded<ded<dS) _RewindStatez dict[str | tuple[int, int], Any]infozlist[ImageFile._Tile]tilez int | Noneseq_numNr0r1r2rr6r7r8rr{s6****r7rceZdZd!fd Zd"dZd#d Zd$d Zd$d Zd%dZd%dZ d&dZ d&dZ d%dZ d%dZ d%dZd%dZd%dZd%dZd%dZd%dZd%dZd%dZd%dZd%dZd%d ZxZS)' PngStreamrSrTr?rUct|i|_i|_d|_d|_g|_d|_d|_d|_ d|_ tigd|_ d|_ dS)Nrrrr)superrZim_infoim_textim_sizeim_modeim_tile im_paletteim_custom_mimetype im_n_frames_seq_numr rewind_state text_memory)rYrS __class__s r8rZzPngStream.__init__s :< .0   .0 48.2'+$( (R66r7c|SrWr6rks r8rlzPngStream.__enter__rmr7chunklenrMcz|xj|z c_|jtkrd|jd}t|dS)Nz%Too much memory used in text chunks: z>MAX_TEXT_MEMORY)rMAX_TEXT_MEMORYrF)rYrrIs r8check_text_memoryzPngStream.check_text_memorysY H$  o - -6#666 S// ! . -r7ctt|j|j|j|_dSrW)rrcopyrrrrks r8 save_rewindzPngStream.save_rewinds5( L     L M  r7c|jj|_|jj|_|jj|_dSrW)rrrrrrrrrks r8rewindzPngStream.rewinds9(-2244 (- )1 r7rhrir>c|jJtj|j|}|d}td|d|||dz}td||dkrd|d}t | t||dzd}n2#t$rtj rd}nYntj $rd}YnwxYw||j d <|S) NrziCCP profile name %rr zCompression method %srUnknown compression method z in iCCP chunkr' icc_profile) rSr rfindr{r|rfrJrFrdrArr)rYrhrir=i comp_methodrIrs r8 chunk_iCCPzPngStream.chunk_iCCPs$w"""  & 1 1 FF5MM +QrrU333Ah  ,k::: !  K KKKCc"" " /!a%'' ;;KK   . "  z   KKK &1 ]#sB99C(C('C(c|jJtj|j|}|dkrtjr|Sd}t |t |dt |df|_ t|d|df\|_|_ n#t$rYnwxYw|dr d|j d <|d rd }t||S) N zTruncated IHDR chunkrr(r) r interlace zunknown filter category) rSr rrdrFrbr_MODESr im_rawmodeKeyErrorrrfrYrhrir=rIs r8 chunk_IHDRzPngStream.chunk_IHDRsw"""  & 1 1 B;;. (CS// !1ayy#a))+  ,2AaD!A$<,@ )DL$//    D  R5 *()DL % R5 #+Cc"" "s/(B B%$B%rcd|jvr)tjd|jd||jg}n6|j d|jd<tjdd|jz||jg}||_||_d}t|)NbboxrT default_imagerzimage data found) rr _Tilerrrrim_idatEOFError)rYrhrirrIs r8 chunk_IDATzPngStream.chunk_IDATs T\ ! !OE4<+?doVVWDD+04 _-OE6DL+@#tWWXD   smmr7c$d}t|)Nzend of PNG image)r)rYrhrirIs r8 chunk_IENDzPngStream.chunk_IENDs smmr7ct|jJtj|j|}|jdkr d|f|_|S)Nr!r )rSr rrrrYrhrir=s r8 chunk_PLTEzPngStream.chunk_PLTEsAw"""  & 1 1 <3  #QhDOr7c |jJtj|j|}|jdkrKt|r&|d}|dkr ||jd<n||jd<n|jdkrt|rdnd|jd<nb|jdvrt||jd<nA|jdkr6t|t|d t|d f|jd<|S) Nr!rr transparencyr)rrr r'r() rSr rr_simple_palettematchrri16)rYrhrir=rs r8 chunk_tRNSzPngStream.chunk_tRNSsw"""  & 1 1 <3  $$Q'' 1FF5MM6634DL001 ^,, \S 25a&&+?33aDL ( ( \] * *+.q66DL ( ( \U " "+.q663q!99c!Qii+GDL (r7c|jJtj|j|}t|dz |jd<|S)Nj@gamma)rSr rrbrrs r8 chunk_gAMAzPngStream.chunk_gAMA s@w"""  & 1 1 #A 1 Wr7c|jJtj|j|}tjdt |dzd|}t d|D|jd<|S)N>r(Ic3 K|] }|dz V dS)rNr6).0elts r8 z'PngStream.chunk_cHRM..s&,P,PS8^,P,P,P,P,P,Pr7 chromaticity)rSr rrunpacklentupler)rYrhrir=raw_valss r8 chunk_cHRMzPngStream.chunk_cHRMsuw"""  & 1 1=!3SVVq[!3!3!3Q77',,P,Px,P,P,P'P'P ^$r7c|jJtj|j|}|dkrtjr|Sd}t ||d|jd<|S)Nr zTruncated sRGB chunkrsrgb)rSr rrdrFrrs r8 chunk_sRGBzPngStream.chunk_sRGBsew"""  & 1 1 A::. (CS// ! t Vr7c@|jJtj|j|}|dkrtjr|Sd}t |t |dt |d}}|d}|dkr|dz|dzf}||jd<n|dkr ||f|jd <|S) NrzTruncated pHYs chunkrr(r)r F%u?dpiaspect)rSr rrdrFrbr) rYrhrir=rIpxpyunitrs r8 chunk_pHYszPngStream.chunk_pHYs.sw"""  & 1 1 A::. (CS// !QC1IIBt 199v+rF{*C"%DL   QYY%'VDL "r7c|jJtj|j|} |dd\}}n#t$r|}d}YnwxYw|rj|dd}|dd}|dkr|n||j|<||j|<|t||S)Nrr r7rrreplacesexif) rSr rsplitrFr~rrrr)rYrhrir=kvk_strv_strs r8 chunk_tEXtzPngStream.chunk_tEXt@sw"""  & 1 1 775!$$DAqq   AAAA   /HHY11EHHY 22E'(G||!!DL "'DL   " "3u:: . . .s?AAcX|jJtj|j|} |dd\}}n#t$r|}d}YnwxYw|r |d}nd}|dkrd|d}t | t |dd}n2#t$rtjrd}nYntj $rd}YnwxYw|rb| dd}| dd } | x|j |<|j |<| t| |S) Nrr r7rrz in zTXt chunkrrr#)rSr rr$rFrfrJrdrArr~rrrr) rYrhrir=r%r&rrIr'r(s r8 chunk_zTXtzPngStream.chunk_zTXtTsw"""  & 1 1 775!$$DAqq   AAAA   A$KKK !  K KKKCc"" " %ae,,AA   . z   AAA   /HHY11EHHY 22E8= =DL $,u"5  " "3u:: . . .s'?AA<BC0CCc|jJtj|j|x}} |dd\}}n#t$r|cYSwxYwt |dkr|S|d|d|dd}}} |dd\}} } n#t$r|cYSwxYw|dkrJ|dkrB t | } n3#t$rtjr|cYStj $r|cYSwxYw|S|dkr | |j d< | dd} | d d} | d d} | d d}n#t$r|cYSwxYwt|| | x|j | <|j| <|t ||S) Nrr r'rsXML:com.adobe.xmpxmprrr)rSr rr$rFrrJrdrArrr~rrrr)rYrhrirr=r%cfcmrtkr&r'lang_strtk_strr(s r8 chunk_iTXtzPngStream.chunk_iTXtws0w"""$TWf555A 775!$$DAqq   HHH  q66A::HaD!A$!""B ''%++KD"aa   HHH  77Qww-a00AA! 6 zHHH $ $ $"#DL  HHY11E{{7H55HYYw11FHHWh//EE   HHH 59&4Q4QQ Udl51 s5zz***sNA AAB B-,B-=C C;'C;:C;AE** E98E9cf|jJtj|j|}d|z|jd<|S)NExifexif)rSr rrrs r8 chunk_eXIfzPngStream.chunk_eXIfs:w"""  & 1 1.2 Vr7c|jJtj|j|}|dkrtjr|Sd}t ||jd|_t jd|St|}|dks|dkrt jd|S||_t|d|j d<d|_ |S) Nr)z"APNG contains truncated acTL chunkz4Invalid APNG, will use default PNG image if possiblerlr(loopz image/apng) rSr rrdrFrwarningswarnrbrr)rYrhrir=rIn_framess r8 chunk_acTLzPngStream.chunk_acTLsw"""  & 1 1 A::. 6CS// !   '#D  MP Q Q QHq66 q==Hz11 MP Q Q QH#"1ayy V".r7c|jJtj|j|}|dkrtjr|Sd}t |t |}|j|dks|j|j|dz krd}t|||_t |dt |d}}t |dt |d } }|j\} } ||z| ks | |z| krd }t||| ||z| |zf|j d <t|d t|d } } | dkrd} t| t| z dz|j d<|d|j d<|d|j d<|S)Nz"APNG contains truncated fcTL chunkrr #APNG contains frame sequence errorsr(r)rr*zAPNG contains invalid framesrddurationdisposalblend) rSr rrdrFrbrrfrrrfloat)rYrhrir=rIseqwidthheightrrim_wim_h delay_num delay_dens r8 chunk_fcTLzPngStream.chunk_fcTLsw"""  & 1 1 B;;. 6CS// !!ff M !cQhh M %$-37*B*B7Cc"" " Aq 3q!99vQSBZZB\ d :  V d 2 20Cc"" " "BU BK@ V"1bzz3q"::9 >>I#(#3#3eI6F6F#F#M Z #$R5 Z !" Wr7ch|jJ|dkr9tjrtj|j|}|Sd}t |tj|jd}t |}|j|dz krd}t|||_||dz|dz S)Nr(z"APNG contains truncated fDAT chunkr rA) rSr rdrrFrbrrfr)rYrhrir=rIrLs r8 chunk_fdATzPngStream.chunk_fdATsw""" A::. (&996CS// !  ! , ,!ff =C!G # #7Cc"" " sQw 333r7r)r?r)rrMr?rUr)rhrMrirMr?r>)rhrMrirMr?r)r0r1r2rZrlrrrrrrrrrr rrr!r)r+r4r8r>rSrU __classcell__rs@r8rrs"""""    2222 8*    ."$(!!!!F))))V*<44444444r7rprefixrc6|tSrW) startswith_MAGIC)rXs r8_acceptr\s   V $ $$r7ceZdZdZdZddZeddZdfd Zdd Z dddZ ddZ ddZ d dZ ddZd!dZd"fd ZxZS)# PngImageFilePNGzPortable network graphicsr?rUc|jJt|jdsd}t||j|_d|_g|_t|j|_ |j\}}} |j |||}n#t$rYnt$rrt d|||tj|j|}|ddr|j||fYnwxYw|j|||jj|_|jj|_|jj|_d|_|jj|_|jj|_|jjpd|_|j dd |_!|jj"r)|jj"\}}tGj$|||_%|d kr |d z |_&n||_&|jjvd |_'|j(|j&|_)|j*|_+|j!r|xjdz c_|,d|jdk|_-dS) Nr)znot a PNG filerT%r %s %s (unknown)r r'rFfdATr().rSr\r`rf_fp_PngImageFile__frameprivate_chunksrpngrrAttributeErrorr{r|r rislowerrurr_moder_sizerr_textrrrcustom_mimetyperr=getrrr rawpalette_PngImageFile__prepare_idat!_close_exclusive_fp_after_loadingr_PngImageFile__rewind_idatra_PngImageFile__rewind_seek is_animated)rYrIrgrhrir=rawmoderKs r8_openzPngImageFile._opensw"""tw||A'' #"Cc"" "7 VX%.tw%7%7 ! $x}} Cf 9HMM#sF33   ! 9 9 9 13VDDD(&99qs8##%%9'..Qx888  9 HLLa ! !2X% X% H$ 37 H$ #x:,1 !Y]]?EBB 8  ; H/MGT'+GT::DL '>>"(1*D  "(D  8  +5:D 2 H " " "!%!4D  HMMOODM! # " JJqMMM=1,sB11 D8=A8D87D8dict[str, str | iTXt]c|j[|jr$|j}||jdz ||jr|||jJ|jS)Nr )rkrurdr_r=load)rYframes r8rzPngImageFile.textAsy :  -  $-!+,,, IIKKK ! %   z%%%zr7cJ|jd}t||j|jdddz |jJ|j|jtdS)zVerify PNG fileNz)verify must be called directly after openrr'r))rS RuntimeErrorr_rrfrrqr)rYrIrs r8rzPngImageFile.verifyQs 7?=Cs## #  TYq\!_q()))x###   r7r{rMc^||sdS||jkr|dd|j} t|jdz|dzD]}||dS#t$r,}||d}t ||d}~wwxYw)NrTr zno more images in APNG file) _seek_checkrdrtrangerr_)rYr{ last_framefrrIs r8r_zPngImageFile.seekas&&  F 4<   JJq$   \  '4>7C"3--''>>"/7)#..."&K :HMM#sF3333)E:::g~~! &"28D/!E(&99999%:::LL!5sCHHH(&99999:; :B!DL(DI"immJ77DO IMM'22DM!Y]]622N9 $5smm#  TESD  = T_8L%L%L&4DO ?h2 2 2} M#}1133 #zz$,8KLL  M M_ 6 6 6 :??49di@@DL::dlD4GHHDLLL7 6s7H::II J&& L02L0L0-AL0/L0c|jSrW)rdrks r8razPngImageFile.tells |r7c|jdr|jdz|_|j|_t j|dS)z"internal: prepare to read PNG filer)r N)rrm decoderconfigrp_PngImageFile__idatr load_preparerks r8rzPngImageFile.load_preparesQ 9== % % ;!%!3d!:D ) ((.....r7 read_bytesr>c(|jJ|jJ|jdkr|jd|j\}}}|dvr|j|||dS|dkr9 |j|||n#t $rYnwxYw|dz |_n||_|jdk|dkr|j}nt||j}|j|z |_|j|S)zinternal: read more image dataNrr()IDATsDDATrbr7rb)rfrSrr`rwrrmin)rYrrgrhris r8 load_readzPngImageFile.load_reads2x###w"""kQ GLLOOO#x}} Cf555 c3///sg~~HMM#sF3333D$qj $ %kQ* ??JJZ55JkJ. w||J'''s>B B('B(c|jJ|jJ|jdkr|j|j |jd |j\}}}n#tjt f$rYnAwxYw|dkrn5|dkr,|jr%d|_|j |||n |j |||n#t$rYnt$rP|dkr|dz} tj|j|n&#t$r}tjrYd}~Yn|d}~wwxYwYnt"$rst$d|||tj|j|}|d d r|j||dfYnwxYw|jj|_|js"|jd|_dS|jr0|jt8jkr||j|j }|jj!d kr+d |j"vr"|#d |j"d }n|jj!dkrkd |j"vrb|j"d }tI|tJr|&|n*tI|tNr|(||)d }|j*||j ||j|_dSdSdS)z%internal: finished reading image dataNrTr(rrrbrar r'r rr&r!)+rfrSrr`rrrfrurprwrrrr rrrdrgr{r|rhrerurrkrqrrr:r<rrrrrconvert_transparentrr>putpalettealphasrMputpalettealphaconvertr) rYrgrhrirr=updatedmaskts r8load_endzPngImageFile.load_endsx###w""" ;!   GLL % % %" ? GLLOOO #'8==?? S&&L+.    g~~D$4&'# c3/// ? c3////%    '>>aKF (&9999    6   :9 " ? ? ? 13VDDD(&99qs8##%%?'..Q~>>>  ?=" ?FX%  ( HNN   DHHH} (%-!?!?**TWd.ABB7<5((^ty-H-H"66 . 9DDw|s**~/J/J In5%a//7#44Q7777'3//7#33A666"??622D ##GT-@$GGG- ( (!?!?saA77BBC,, G 8G  D('G ( E 2 E>G EE  G A9G  G dict[int, Any] | Nonecd|jvr|d|jvr d|jvrdS|S)Nr7zRaw profile type exif)rrzgetexif_get_merged_dictrks r8_getexifzPngImageFile._getexifBsU  " " IIKKK  " "'>di'O'O4||~~..000r7 Image.Exifc~d|jvr|tS)Nr7)rrzrr)rYrs r8rzPngImageFile.getexifIs1  " " IIKKKww   r7r)r?rx)r{rMr?rUr)r{rMrrr?rU)r?rM)rrMr?r>)r?r)r?r)r0r1r2formatformat_descriptionrwpropertyrrr_rtrarrrrrrVrWs@r8r^r^s= F4B-B-B-B-H   X  ' ' ' 'bIbIbIbIbIH////!(!(!(!(F=(=(=(=(~1111!!!!!!!!!!r7r^)rr)L;1rr)rr)rr)rr)r%rr)rr)r"r)r#rr)r$rr)r!rr)r rr)r&r)rrrrrr%r rrr"r#r$r!r r&rSrTrgrUc<d|}|tt||z||t |t |}|t|dS)z'Write a PNG chunk (including CRC field)r7N)joinwriteo32rrP)rSrgrK byte_datars r8putchunkrgs}IHHSY 3 &'''HHY F3KK ( (CHHSXXr7ceZdZd dZd d Zd S)_idatrSrTchunkCallable[..., None]r?rUc"||_||_dSrW)rSr)rYrSrs r8rZz_idat.__init__us r7rKr>c>||jd|dS)Nr)rrSrYrKs r8rz _idat.writeys  47GT*****r7N)rSrTrrr?rUrKr>r?rUr0r1r2rZrr6r7r8rrrs<++++++r7rceZdZdd Zdd Zd S)_fdatrSrTrrrrMr?rUc0||_||_||_dSrW)rSrr)rYrSrrs r8rZz_fdat.__init__s  r7rKr>c||jdt|j||xjdz c_dS)Nrbr )rrSrrrs r8rz _fdat.writes: 47GS%6%6===  r7N)rSrTrrrrMr?rUrrr6r7r8rr}s< r7rr Image.Image encoderinfodict[str, Any]c|dd|dd|dd|ddf|_dS)NoptimizeFcompress_level compress_type dictionaryr7)rm encoderconfig)rrs r8_apply_encoderinforsW E**("--,, c** Br7c.eZdZUded<ded<ded<dS)_Framerrz tuple[int, int, int, int] | NonerrrNrr6r7r8rrs3OOO****r7rrrrrrvrImage.Image | None append_imageslist[Image.Image]c|jd}|jd|jdd}|jd|jdtj} |jd|jdt j} |rtj|} ntj|g|} g} d} | D]}tj |D]}|j |kr| }n| |}|j }t|tt fr || |d<n|d|jvr|jd|d<t| tt fr | | |d<t| tt fr | | |d<| dz } | r| d}|jd}|jd}|tjkrt%| dkr tj}|tjkr|j }t*jd |jd }|j}|r||}n d |jz}|||n%|tjkr| d j}n|j}t9j| d | d }|d }|sS||dkr:||dkr!d|vr|jdxx|dz cc<nd}| tA|||ؐt%| dkr|s | djS||dtCt%| tC||r|j |kr|n| |}tE||jtGj$|tKtLtNtQ||tGj)dd |jzd|gd}tU| D]f\}}|j}|js d |jz}n|j}||}|j}|j}|dd}tW|dz ,d}|j-dkrd}t]||d| } |d| }!||dtC|tC|dtC|dtC|dtC|dt_|j-t_|j0tc| tc|! |dz }tE||j|dkrd|sbtGj$|tKtLtNtQ||tGj)dd |jzd|gte|||}"tGj$|tKtLtN|"tGj)dd |jzd|g|"j3}hdS)NrFr:rrHrJr rr'r&)rrrrrF) alpha_onlysacTLrrEzcannot write durationr)4rrmrr/r3r:r; itertoolschainrIteratorrrrrlistrr5rr4rr rrrrcroprr subtract_modulogetbboxrurrrr _saverrr>rr enumeraterlimit_denominator numeratorrFo16 denominatorrrr)#rrSrrrvrrrFr:rHrJr im_frames frame_countim_seqim_framerprevious prev_disposal prev_blendbase_imrrdelta default_imrr{ frame_datarframe_durationdelayrIframe_disposal frame_blend fdat_chunkss# r8_write_multiple_framesrs~!!*--H >  fbgkk&!&<&< = =D~!!*bgkk*hFV.W.WXXH N  w GU_(M(M N NE5 ..m44 IK3B3B%.v662 B2 BH}$$#==??#++D11.--//K(T5M22 D*2;*? J''!jHM&A&A*2- *C J'(T5M22 @*2;*? J'%$// :',['9 G$ 1 K! $R= ( 4 8 8 D D %155g>>  H$888S^^a=O=O$,$:M H$:::&k..00G#joofbg|LLG#=D0"),,t"4"4%/MM'40000"h&:::'m.GG&kG"2$$V,,goof.E.E}}}66%)D)DDD"koog&>&>>>"k11(444 J8OO444   VHdK@@ A A A Ae2 Bh 9~~=| E  C NN D  7d??RR 40@0@ :r~666  EE"e,, - - _UFRW$4a A A B   G&y11/*/*z= +HM)DD?D}}T**H} , $Q77$.//AA%HH ?U " ")CS// !$X>>!oogu55     LL QLL QLL QLL QLL  ! " " ~   {OO  1 8R^444 A::m: ORYb% 0 011(>7KKL      E733K ORY ,,(>7KKL    ")GG 4r7filenamerc,t|||ddS)NT)save_all)r)rrSrs r8 _save_allr,s "b(T******r7rc )|r|jd|jd}t}t)|jdg}t j|g|D]M}t j|D]6} || j )| j 7NdD]} | |vrn | } t)fdtdD} n|j } |j } | } g} |jr|pg} | dkrd|jvrt!d|jdzd }n8|jr/t#t!t%| d zd d}nd }|d kr|dkrd}n |d krd}nd }| d |z } t&| \}}}n(#t($r}d| d}t+||d}~wwxYw| dkrt-ddd |t0||dt3| dt3| d||ddd gd}|jd|jdx}r>d}|dzt5j|z}||d||d|jdx}rgd}|jD]}|dd\}}||vr#||||||6||vr||||H|ddr*t%|d ko|d}|s |||||j dkrT|d z}t?| d|}t%||kr|dz }t%||k||d||jd |jd } | |j dkr|}!tA| t>r||d!| d|!ntA| tBr=t#dt!d"| } d#| zdz}"||d!|"d|!nd$}tE||j d%vritA| tBr:t#dt!d&| } ||d!tG| n=d'|j d(}tE||j d)krtA| tHtfsd*}tE|t%| d krd+}tE|| \}#}$}%||d!tG|#tG|$ztG|%zn|jd d,}t+|nZ|j dkrO|j%&d-kr2|j%d-d.}"|}!||d!|"d|!|jd/x}&r[||d0t3tC|&dd1z d2zt3tC|&dd1z d2zd3|rAd4d5g}|jD]5}|dd\}}||vr"||||||6|jd6x}'r[tA|'tNj(r|')d7}'|'*d8r |'d9d}'||d:|'|}(|rtW|||| |||}(|(rutY|(|jt[j.|(t_t`t>tc||t[j2d;d<|(j zd|g|r]|jD]U}|dd\}}|ddr*t%|d ko|d}|r ||||V||d=d>tg|d?r|4dSdS)@Nrr)r&r r!c3PK|]tfdDV dS)c3(K|] }|V dSrWr6)r frame_sizers r8rz"_save...Is'??:A??????r7N)max)rrsizess @r8rz_save..IsARRAS?????????RRRRRRr7r'r!bitsr r+r*r(;zcannot write mode z as PNGr zSaving I mode images as PNGr) stacklevelsIHDRrr)scHRMscICPsgAMAssBITsRGBstIMErs ICC ProfilersiCCPr pnginfo)ssPLTrrrsPLTErstRNSrz.transparency for P must be an integer or bytes)rrr rrztransparency for z must be an integerr z*transparency for RGB must be list or tuplez'transparency for RGB must have length 3z%cannot use transparency for this moder&ArspHYsrg?rsbKGDshISTr7r)r6r,seXIfrrrr7flush)5rrmrsetrrrrrrrr^rrro getpaletterrr _OUTMODESrrrrr[rrArremoverrhr>rrMrFrrrgetpalettemoder ExiftobytesrZrrr rrrrrhasattrr)*rrSrrrrmodesrrrrroutmoderocolorsr rv bit_depth color_typerrIriccnamerKrchunks_multiple_allowed info_chunkrgrpalette_byte_number palette_bytesr alpha_bytesalpharedgreenbluerr7 single_imrs* @r8rr0s ** RW[[99  **?B?? ordM:: ) )F)26:: ) ) (-((( (-(((( ))  Du}}99;;DRRRRqRRRRRwwGG z(--//'R s{{ R^ # #bnV44c::FFz SW!2C88!<< R<<{{1 z4zz !G")27);&JJ """04000cll!"#~~/BBBB HHV E  DG  DG       D C CFn   M0J0JKKKs g~ c 2 22 b'4     g~!!),,,t )"F"F"F+ ) )J"2A2ICf}} c"""b#t$$$$///b#t$$$$QqS!!## ) __1Cjm !)E"c4((( w#~~$qjg&:':&:;<< -  #666 U "M-  #666 b'=)))>%%nbgkk.6Q6QRRL 7c>> K,.. &b'<  #=>>>>L#.. &"1c#|&<&<== ,.6b'5+#67777F oo% W/ / /,,, &"1c%&>&>?? b'3|#4#45555F"'FFF oo% W  lT5M:: FB oo%\""a''? oo%#/ UDb'3s88c%jj#83t99#DEEEE ^   / / ;:C#,,  < CBE0022f<<  --  b'5+.///n  '''s     CFVOc)** + + CFVOc)** + +      %7#+ % %J"2A2ICf}} c"""b#t$$$~!!&)))t! dEJ ' ' #<<??D ??? + + 8D b'4   $&I * E4-   9bn555  EE"e,, - - _UFY^$;Q H H I    )+ ) )J"2A2IC1Q3x!! ) __1Cjm )E"c4((( E"gsr7  sG%% H /HH paramsr list[tuple[bytes, bytes, bytes]]c ddlm}gd fd }|} ||_t||d ||`n#|`wxYwS) z4Return a list of PNG chunks representing this image.r)BytesIOrSrTrgr>rKr?rUcd|}tt|t|}|||fdS)Nr7)rrrPru)rSrgrKrrrs r8ruzgetchunks..appendsNHHTNN &F3KK0011 sIs+,,,,,r7rrSrTrgr>rKr>r?rU)ior.rr)rr+r.rurSrs @r8 getchunksr2 s F------ B b"b&!!! NNBN Ms7;z.pngz.apngz image/png)r=r>r?r>)r)rKr>rLrMr?rM)rXr>r?rr0)rrrrr?rU)rrrSrTrrrrrvrrrrrr?r)rrrSrTrrr?rU) rrrSrTrrrrrrr?rU)rrr+rr?r,)R __future__rrloggingrerr;rAenumr fractionsrtypingrrrrr r r r r_binaryrrrrbrrrrr _deprecater_utilr TYPE_CHECKINGcollections.abcrrrr getLoggerr0r{compilerrcr[rr SAFEBLOCKrDrr/r:rJrPrRrrrrrr\r^rrrrrrrrrr2 register_openr register_saveregister_save_allregister_extensions register_mimer6r7r8rFsB#"""""  ''''''''''GGGGGGGGGGGGGG!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  (((((($$$$$$$$  8 $ $ L ! ! '                !+  2"*011$ ~%w*     G   /////[[[[[[[[|36Y3Y3Y3Y3Y3Y3Y3Y3@: i4i4i4i4i4 i4i4i4` %%%%T!T!T!T!T!9&T!T!T!x ! $ $ $ " $ ' ( $ $ $ $ &!   (++++++++             Z   PPPPf++++"* TTTTTv2L'w???L'/// +Y777,-/@AAAL'55555r7