
    RfS                    B   d dl m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mZmZ ddlmZ ddlmZ ddlmZ  G d	 d
e          Zej        Zd Z G d dej                  ZddddZd Zd Zd Zd Zd Z d Z!d(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)d#Z.d*d%Z/ e	j0        ej1        ee            e	j2        ej1        e"            e	j3        ej1        e!            e	j4        ej1        d&            e	j5        ej1        d'           dS )+    )annotationsN)IntEnum   )Image
ImageChops	ImageFile	ImageMathImageOpsImagePaletteImageSequence)i16le)o8)o16lec                      e Zd ZdZdZdZdZdS )LoadingStrategyz.. versionadded:: 9.1.0r   r      N)__name__
__module____qualname____doc__RGB_AFTER_FIRST RGB_AFTER_DIFFERENT_PALETTE_ONLY
RGB_ALWAYS     D/var/www/html/env/lib/python3.11/site-packages/PIL/GifImagePlugin.pyr   r   0   s$        !!O'($JJJr   r   c                    | d d         dv S )N   )s   GIF87as   GIF89ar   )prefixs    r   _acceptr    ?   s    "1":///r   c                       e Zd ZdZdZdZdZd Zd Zd Z	e
d             Ze
d	             Zd
 ZddZ fdZd Zd Z xZS )GifImageFileGIFzCompuserve GIFFNc                    | j                             d          }|r(|d         r | j                             |d                   S d S )Nr   r   )fpread)selfss     r   datazGifImageFile.dataO   sC    GLLOO 	&1 	&7<<!%%%tr   c                    t          dt          |          d          D ]6}|dz  ||         cxk    r||dz            cxk    r||dz            k    sn  dS 7dS )Nr      r   r   TF)rangelen)r'   pis      r   _is_palette_neededzGifImageFile._is_palette_neededU   sy    q#a&&!$$ 	 	AFad::::aAh::::!AE(::::tt ;ur   c                   | j                             d          }t          |          sd}t          |          |d d         | j        d<   t          |d          t          |d          f| _        g | _        |d         }|dz  dz   }|d	z  re|d
         | j        d<   | j                             d|z            }|                     |          r#t          j
        d|          }|x| _        | _        | j         | _        | j                                         | _        d | _        d | _        |                     d           d S )N   znot a GIF filer   version   
      r         
backgroundr+   RGBr   )r%   r&   r    SyntaxErrorinfoi16_sizetiler0   r   rawglobal_palettepalette_fptell_GifImageFile__rewind	_n_frames_is_animated_seek)r'   r(   msgflagsbitsr.   s         r   _openzGifImageFile._open[   s)   GLLqzz 	#"Cc""" !u	)AYYAq		)
	"	Q3; 	7&'eDIl#Q$Y''A&&q)) 7 $UA..566#dl7 

1r   c                $   | j         |                                 }	 	 |                     |                                 dz   d           ,# t          $ r |                                 dz   | _         Y nw xY w|                     |           | j         S )NTr   F)rF   rD   rH   EOFErrorseekr'   currents     r   n_frameszGifImageFile.n_framesw   s    >!iikkG17JJtyy{{Q6667 1 1 1!%q1IIg~s   -A
 
&A32A3c                    | j         | j        | j        dk    | _         ni|                                 }|rd| _         nK	 |                     dd           d| _         n# t          $ r
 d| _         Y nw xY w|                     |           | j         S )Nr   TF)rG   rF   rD   rH   rN   rO   rP   s     r   is_animatedzGifImageFile.is_animated   s    $~)$(Na$7!!))++ 	'(,D%%2

1e,,,,0))# 2 2 2,1)))2 IIg&&&  s   A A10A1c                j   |                      |          sd S || j        k     rd | _        |                     d           | j        }t	          | j        dz   |dz             D ]Q}	 |                     |           # t
          $ r,}|                     |           d}t          |          |d }~ww xY wd S )Nr   r   no more images in GIF file)_seek_check_GifImageFile__frameimrH   r,   rN   rO   )r'   frame
last_frameferI   s         r   rO   zGifImageFile.seek   s    && 	F4<DGJJqMMM\
t|a'33 	+ 	+A+

1 + + +		*%%%2smm*+	+ 	+s   $A::
B0'B++B0Tc                n    |dk    rMd _         d  _        d _         j                             j                   d _        d j        v r j        d= n j        r|r 	                                 | j        dz   k    rd| }t          |           j         _         j         rO j                             j                                                     r	                                  d _          j                            d          }|r|dk    rd}t          |          d }i }d }d }d }		 |s j                            d          }|r|dk    rn|d	k    rx j                            d          }                                 }
|d         d
k    r?|
d         }|dz  r|
d         }t          |
d          dz  |d<   d|z  }|dz	  }|r| _        n|d         dk    r?d}|
r||
z  }                                 }
|
d|v r|dxx         d|z   z  cc<   n||d<   d }|d         dk    r}|dk    rw|
 j                                        f|d<   |
d d         dk    rK                                 }
t#          |
          dk    r$|
d         dk    rt          |
d           j        d<                                    r	                                  n|dk    r j                            d          }t          |d          t          |d          }}|t          |d          z   |t          |d          z   }}| j        d         k    s| j        d         k    rV|rTt'          | j        d                   t'          | j        d                   f _        t+          j         j                   ||||f}	|d         }|dz  dk    }|dz  rR|dz  dz   } j                            d|z            }                     |          rt1          j        d |          }nd!} j                            d          d         } j                                         _         nd }5|d"}t          |          | _        |sd S g  _         j        r% j                             j         j                   ||n j         _        | _        |dk    r^ j        r)t@          tB          j"        k    r|d#nd  _#        nd$ _#        nd% _#        |s j        rdd&l$m$}  | j                  }| _%        n͉ j&        d$k    rt@          tB          j'        k    s|rd  _(        d' j        v re j        )                     j        d'         d            j        *                    d#t*          j+        j,                   _        d# _#         j        d'= n6d  _#         j        *                    d t*          j+        j,                   _         fd(}|	 _        	  j        dk     r	d  _        nb j        dk    r j        \  }}}}||z
  ||z
  f}t+          j        |           d$} j        -                    d'|          }| j&        d)v rd#} ||          d*z   }n1 j        -                    d+d          } j&        d)v rd } ||          }t*          j.        /                    |||           _        n j        & 0                     j         j                   _        no|m j        \  }}}}||z
  ||z
  f}t+          j        |           d$}|} j&        d)v rd#} ||          d*z   }t*          j.        /                    |||           _        n# tb          $ r Y nw xY w|Md}|1|dk    r t@          tB          j"        k    r
| j        d'<   n j&        d)vr|}d,||||f j         |||ffg _        |-                    d          r|d          j        d<   d-D ](}||v r||          j        |<   | j        v r j        |= )d S ).Nr   commentr   zcannot seek to frame    ;rV   T   !   r+   r5   duration   r      r      
   	extensionr8      NETSCAPE2.0loop   ,	      r   r4   @   r7   r6   r:   Fzimage not found in GIF frameRGBAPL)copytransparencyc                    j         rP| dz  dz   t          j         j                  k    rd} t          j         j        | dz  | dz  dz                      } n| | | f} | S )Nr+   r   )_frame_paletter-   rB   tuple)colorr'   s    r   _rgbz GifImageFile._seek.<locals>._rgbT  sq    " .19q=3t':'B#C#CCCEd19%!)eaiRSm:STUUu-Lr   r:   rp   )r   r9   gif)rd   ri   )2_GifImageFile__offsetdisposerX   rC   rO   rE   disposal_methodr<   r?   load
ValueErrorr%   r)   r&   rN   r=   rD   r-   sizemaxr>   r   _decompression_bomb_checkr0   r   r@   rY   pastedispose_extentrA   rv   _frame_transparencyLOADING_STRATEGYr   r   _moders   rB   moder   pyaccessputpalettealphaconvertDitherFLOYDSTEINBERGgetcorefill_cropAttributeError)r'   rZ   update_imagerI   r(   rB   r<   frame_transparency	interlaceframe_dispose_extentblockrJ   dispose_bitsr`   x0y0x1y1rK   r.   rs   ry   dispose_sizedispose_moderx   rt   ks   `                          r   rH   zGifImageFile._seek   s	   A::DMDLDLHMM$-(((#$D DI%%Ii( y \ 		DL1$$$1%11CS//!(= 	GLL'''))++  ))++ DMGLLOO 	 AII.C3--!	#Y	 $GLLOO UT		d GLLOO		Q43;; "!HEqy 6-21X*'*5!}}r'9D$ $.#5L#/1#4L# <
 0<,qTS[[ "G   ,5( $		   , !D((Y57?:*1YAqTS[[UaZZ ).tw||~~(=D%SbSz^33 $		u::??uQx1}}03E1DIf-iikk  iikk  d GLLOO QC1IIBc!Qiic!QiiB1%%dil):):):!$R1!6!6B	!8M8M!MDJ3DJ???')2r2~$!"RZA-	3; (!AI?DQ$Y//A..q11 ("."25!"<"<"' w||Aq) $AsY	v 0C3-- 	F	< 	=GMM$,(;<<<)0)<gg$BU#5 A::" !#'AAA+=+IuDJJ!$DJJ 
 4t2 4%%%%%%$t233"DLLyC$(XXX Y %)DM%22//	.0I1MMM"&'//&%,:U"V"V%+
 In55%*
"&'//%9T"U"U	 	 	 	 	 3+	#a''#%** "&!4BB "Rb1/===  #	n6HII$yO33'- $Ud 2 IMM,::EyO33', $U$z|\5QQ 7&#'::dgt7J#K#KDLL'3%)%8NBB$&GR"W#5L3LAAA#&L.EyO33'- $%7 8 84 ?#(:??<u#U#UDL 	 	 	D	  L!-A::'?+EEE4F	.1Yo55#5L R$M9l3	DI 88I 	3#'	?DIi * 	! 	!ADyy#Aw	!diIaL		! 	!s   E6^ 
^^c                   | j         rdnd}d | _        | j        dk    r8| j        0t          j                            || j        | j                  | _        n|| j	        dv rs| j        | _        | j         rYt          j                            d| j        | j        pd          | _         | j        j
        | j                                           nd | _        || _        d | _         t                                                       d S )Nrq   rr   r   rz   )rv   _prev_imrX   r   r   r   r   r   rY   r   
putpalettegetdatar   superload_prepare)r'   	temp_mode	__class__s     r   r   zGifImageFile.load_prepare  s    .7CCC	<1'3*//ty$*B  Y/)) GDM" *//#ty$:R:WVWXX""D$7$?$?$A$ABBB
"r   c                
   | j         dk    r| j        dk    rt          t          j        k    rj| j        (| j                            | j        d           d| _        nd| _        | j        	                    | j        t          j        j                  | _        d S | j        sd S | j        ;| j                            | j        d           | j        	                    d          }n| j        	                    d          }|                     || j                  }| j        | _        | j        j        | _        |j        dk    r#| j                            || j        |           d S | j                            || j                   d S )Nr   rq   rp   r:   )rX   r   r   r   r   r   rY   r   r   r   r   r   r   r   r   r   r   )r'   frame_ims     r   load_endzGifImageFile.load_end  sS   <1yC$48R$R$R+7G++D,DaHHH!'DJJ!&DJ'//$)U\5PQQF} 	F#/G##D$<a@@@wv..HHwu--H::h(;<<-W\
=F""GMM(D$7BBBBBGMM(D$788888r   c                    | j         S N)rX   )r'   s    r   rD   zGifImageFile.tell  s
    |r   )T)r   r   r   formatformat_description!_close_exclusive_fp_after_loadingrA   r)   r0   rL   propertyrR   rT   rO   rH   r   r   rD   __classcell__)r   s   @r   r"   r"   H   s        F)(-%N      8 	 	 X	 ! ! X!$+ + + |! |! |! |!|    (9 9 94      r   r"   rr   rq   )1rr   rq   c                   | j         t          v r|                                  | S t          j        | j                   dk    ro|                     dt          j        j                  } | j        j         dk    r7| j        j	        D ]*}|d         dk    r| j        j	        |         | j
        d<    n+| S |                     d          S )	a  
    Takes an image (or frame), returns an image in a mode that is appropriate
    for saving in a Gif.

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

    :param im: Image object
    :returns: Image object
    r:   rq   rB   rp   r+   r   rt   rr   )r   RAWMODEr   r   getmodebaser   PaletteADAPTIVErB   colorsr<   )rY   rgbas     r   _normalize_moder     s     
w'
				!!U**ZZU]%;Z<<:?f$$
)  7a<<.0j.?.EBGN+E   	::c??r   c                <   d}|rgt          |t          t          t          f          rt          |dd                   }t          |t          j                  rt          |j                  }| j        dk    r%|s"| j                            d          dd         }nC|s&t          d t          d          D                       }t	          j        d|          | _        |rg }t          dt          |          d          D ]V}t          |||dz                      }| j        j                            |          }||v rd}|                    |           Wt          |          D ]1\  }}|*t          t          |                    D ]}||vr|||<    n2|                     |          } nat#          | |          }|O|                     ||          } d	|v r3	 |                    |d	                   |d	<   n# t&          $ r |d	= Y nw xY w| S || j        _        | S )
at  
    Normalizes the palette for image.
      - Sets the palette to the incoming palette, if provided.
      - Ensures that there's a palette for L mode images
      - Optimizes the palette if necessary/desired.

    :param im: Image object
    :param palette: bytes object containing the source palette, or ....
    :param info: encoderinfo
    :returns: Image object
    Ni   rq   r:   c              3      K   | ]	}|d z  V  
dS )r+   Nr   ).0r/   s     r   	<genexpr>z%_normalize_palette.<locals>.<genexpr>  s&      &B&B!qAv&B&B&B&B&B&Br   r   r   r+   rt   )
isinstancebytes	bytearraylistr   rB   r   rY   
getpaletter,   r-   rw   r   r   append	enumerateremap_palette_get_optimizeindexr   )	rY   rB   r<   source_paletteused_palette_colorsr/   source_colorr   js	            r   _normalize_paletter     s}    N 8gy$788 	6&wtt}55Ng|899 	8&w77N	w#~~ 	;U--e44TcT:N 	C&&B&BuSzz&B&B&BBBN!.unMMM
  q#n--q11 	. 	.A AE	!:;;LJ%)),77E+++&&u----!"566 	 	HAu}s#67788  A 33312+A. 4 122+B55*!!"5~FFB%%-+>+D+D^,, ,D(( " - - -^,,,-I'BJIs   G; ;H
Hc           	     *   t          |           }|j                                        D ] \  }}| j                            ||           !t          ||| j                  }t          || j                  D ]}|                    |           d}t          |           r|dz  }t          || d|           dt          |           f|_
        t          j        ||dd| j        z   dt          |j                 fg           |                    d           d S )Nr   ro   r   r   r4   r{       )r   r<   itemsencoderinfo
setdefaultr   _get_global_headerwriteget_interlace_write_local_headerencoderconfigr   _saver   r   r   )rY   r%   rB   im_outr   vr(   rJ   s           r   _write_single_framer   2  s   R  F!!## ( (1
!!!Q''''@@F77  
 ER 
B...}R001FOFB%"')91gfk>R!S TUUUHHUOOOOOr   c                    t          |          t          |           k    r*|                    d          }|                     d          } t          j        ||           }||                    d          fS )Nrp   F)
alpha_only)_get_palette_bytesr   r   subtract_modulogetbbox)base_imim_framedeltas      r   _getbboxr   G  sm    (##'9''B'BBB##F++//&))&x99E%--5-1111r   c           	     @
   | j                             d          }| j                             d| j                            d                    }g }d }d}d }t          j        | g| j                             dg                     D ]}	t          j        |	          D ]}
t          |
                                          }
|dk    rA|
j        	                                D ]'\  }}|dk    r| j         
                    ||           (| j                                         }d|
j        v r!|
                    d|
j        d                    t          |
||          }
t          |t          t          f          r||         |d<   n|d|
j        v r|
j        d         |d<   t          |t          t          f          r||         |d<   |dz  }d }|r\t          ||
          \  }}|s9|                    d          r"|d         d         dxx         |d         z  cc<   |                    d          d	k    r|| j                             d| j                            dd
                    }t!          |
|          }t#          j        d|
j        |          }|                    |d         d         j                   t          ||
          \  }}|                    d          rD|
j        dk    r8d|vr/	 |
j                            |
          |d<   n# t0          $ r Y nw xY wd|v r |
                                }t#          j        d|j        |d                   }|j        dk    r3|                                \  }}}}t5          j        d||||          }nd|j        dk    rCt#          j        d|j                  }|                    |                                           |}t5          j        d|          }|                    |t?          j         |                     nd }|
}|!                    |p|
||d           tE          |          dk    r'd| j         v r|d         d         d         | j         d<   d S |D ]}|d         }
|d         s1tG          |
|d                   D ]}|$                    |           d}n8|sd|d         d<   |
%                    |d                   }
|d         d d	         }tM          ||
||d                    dS )Nrd   disposalr   append_imagesrt   r   r_   r   r   )r   r   r   rq   rY   optimizer   rp   z-convert(max(max(max(r, g), b), a) * 255, '1'))rgbarr   zconvert(im * 255, '1')rY   )mask)rY   bboxr   r   r   Tinclude_color_table)'r   r   r<   	itertoolschainr   Iteratorr   rs   r   r   r   r   r   rw   r   _get_backgroundr   newr   r   rB   r   _new_color_indexr   splitr	   evalputdatar   r   r
   invertr   r-   r   r   crop_write_frame_data)rY   r%   rB   rd   r   	im_framesprevious_imframe_countbackground_im
imSequencer   r   r   r   
diff_framer   r   rx   r9   r   r   r   r   r   r   delta_l
frame_datar(   offsets                                r   _write_multiple_framesr	  O  s   ~!!*--H~!!*bgkk*.E.EFFHIKKMordBN,>,>PR,S,STT N N
%.z:: M	 M	H&x}}77Ha$M//11 4 4DAqN** N--a3333.--//K..&&~x}^7TUUU)(G[IIH(T5M22 D*2;*?J''!jHM&A&A*2-
*CJ'(T5M22 @*2;*?J'1KJ 3&{H==t "z22 !"m4Z@@@K&E @@@ ??:..!33$, " 2 2*BGKK	,R,R! ! &5Xu%E%E
(-	#x}j(Q(Q%001d1C1KLLL"*=("C"CKE4??:.. K8=C3G3G%[88! !) 0 A A( K K ( .   * ! ! ! D!%44%-]]__
$y+n2M    !://).JAq!Q#,> O"#"#"#"#$ $ $DD  %zS00*/)C*D*D ' @ @ @(/#,>2Ju#U#U#UD"((HOD4I4I(JJJ"K!-XtKXX   WM	^ 9~~'')21m)DZ)PBN:& K K
d#&! 	,'*]2KLL  FF  HCG
=)*?@}}Z%788H'+F"h
=0IJJJJ4s   7L
L"!L"c                ,    t          | ||d           d S )NT)save_all)r   )rY   r%   filenames      r   	_save_allr    s    	"b(T******r   Fc                   d| j         v s	d| j        v r4| j                             d| j                            d                    }nd }| j                             dd           |rt	          | ||          st          | ||           |                    d           t          |d          r|                                 d S d S )NrB   r   Tra   flush)	r   r<   r   r   r	  r   r   hasattrr  )rY   r%   r  r  rB   s        r   r   r     s    BN""i27&:&:.$$YI0F0FGG
!!*d333 -1"b'BB -BG,,,HHTNNNr7 





 r   c                p    | j                             dd          }t          | j                  dk     rd}|S )Nr   r      r   )r   r   minr   )rY   r   s     r   r   r     s9    "";22I 27||b	r   c                2   	 |j         d         }n# t          $ r d }Y nw xY wd|j         v rt          |j         d         dz            }nd}t          |j                             dd                    }||dk    s|r|dnd}||dz  z  }|                     dt          d	          z   t          d
          z   t          |          z   t          |          z   t          |pd          z   t          d          z              |j                             d          }|r*t          |          }	t          |	          }
|
r
|dz  }||
z  }|                     dt          |d                   z   t          |d                   z   t          |j	        d                   z   t          |j	        d                   z   t          |          z              |r$|
r"|                     t          |	                     |                     t          d                     d S )Nrt   rd   r5   r   r   r   r   rb   rc   rn   r   r7   rl   r4   )r   KeyErrorintr   r   r   o16r   _get_color_table_sizer   _get_header_palette)r%   rY   r  rJ   rt   rd   r   packed_flagr   palette_bytescolor_table_sizes              r   r   r     sH   ~n5    R^##r~j1B6772>%%j!4455H8q==H='3aax1}$
ggee oo (mm	
 "##$ ee	
 	
 	
 .,,-BCC -*2..0?? 	-CKE,,EHH
fQi..	
fQi..	 bgaj//	 bgaj//		
 U))	    5/ 5
$]33444HHRUUOOOOOs    c                   |                                  }	 t          |d          5 }| j        dk    r$t          j        d|g|t          j                   ndd|g}dg}t          j        |t          j        t          j                  }t          j        ||j        |t          j                  }|j        	                                 |
                                }	|	rt          j        |	|          |
                                }	|	rt          j        |	|          d d d            n# 1 swxY w Y   	 t          j        |           d S # t          $ r Y d S w xY w# 	 t          j        |           w # t          $ r Y w w xY wxY w)Nwbr:   ppmtogif)stdoutstderrppmquant256)stdinr   r!  )_dumpopenr   
subprocess
check_callDEVNULLPopenPIPEr   closewaitCalledProcessErrorosunlinkOSError)
rY   r%   r  tempfiler\   	quant_cmd	togif_cmd
quant_proc
togif_procretcodes
             r   _save_netpbmr8    s    xxzzH#(D!! 	LQw%%*1Z=O     (9	'L	'-joj>P  
 (-$+%-	  
 !'')))$//++ L$7KKK$//++ L$7KKK;	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L 	L>	Ih 	 	 	DD		Ih 	 	 	D	se   E C9D+E +D//E 2D/3E 7E 
EEF E54F5
F?FFFc                T   | j         dv r|r|                    d          rt          p
| j         dk    }|s| j        | j        z  dk     rg }t          |                                           D ]\  }}|r|                    |           |s t          |          t          |          k    r|S t          | j
        j
                  t          j        | j
        j                   z  }d|dz
                                  z  }t          |          |dz  k    r|dk    r|S dS dS dS dS dS dS )aL  
    Palette optimization is a potentially expensive operation.

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

    :param im: Image object
    :param info: encoderinfo
    :returns: list of indexes of palette entries in use, or None
    )rq   rr   r   rr   i   r   r   N)r   r   _FORCE_OPTIMIZEwidthheightr   	histogramr   r   r-   rB   r   getmodebands
bit_length)rY   r<   optimiser   r/   countnum_palette_colorscurrent_palette_sizes           r   r   r   B  sj    
w*$((:*>*> #4bgn 	+rx")+i77"$%bllnn55 2 25 2'..q111 +3233s;N7O7OOO**!$RZ%7!8!8E<N
= = " $%);a)?(K(K(M(M#M  '((,@A,EEE(1,,**A  87  FE,,r   c                    | sdS t          |           dk     rdS t          j        t          j        t          |           dz  d                    dz
  S )Nr   rm   r   r+   r   )r-   mathceillog)r  s    r   r  r  p  sV     Cq	]		a		qy#m"4"4"91==>>BBr   c                    t          |           }d|z  t          |           dz  z
  }|dk    r| t          d          dz  |z  z  } | S )z
    Returns the palette, null padded to the next power of 2 (*3) bytes
    suitable for direct inclusion in the GIF header

    :param palette_bytes: Unpadded palette bytes, in RGBRGB form
    :returns: Null padded palette
    r   r+   r   )r  r-   r   )r  r  actual_target_size_diffs      r   r  r  z  s]     -];;  !$44M8J8Ja8OO""A%<<<r   c                ,    | j         r| j         j         ndS )z
    Gets the palette for inclusion in the gif header

    :param im: Image object
    :returns: Bytes, len<=768 suitable for inclusion in gif header
    r   r   r   s    r   r   r     s     "$42:4r   c                    d}|r]t          |t                    rF	 | j                            ||           }n+# t          $ r}t          |          dvr Y d }~n
d }~ww xY w|}|S )Nr   )z$cannot allocate more than 256 colorsz/cannot add non-opaque RGBA color to RGB palette)r   rw   rB   getcolorr   str)rY   info_backgroundr9   r]   s       r   r   r     s    J )ou-- 	)
Z00"EE

   q66 "        )Js   7 
AAAc                   d}| j                             d          dk    sE|rEd|v s?|                    d          *|                    d          s|                    d          rd}t          | |                    d	                    }t          |           }t	          |          }d
|z   t          | j        d                   z   t          | j        d                   z   t          |dz             t          |          t          d          z   t          |          g}|                    d          ~|	                    dt          d          z   t          d          z   dz   t          d          z   t          d          z   t          |d                   z   t          d          z              |                    d          rdt          d          z   }|d         }t          |t                    r|                                }t          dt          |          d          D ]1}	||	|	dz            }
|t          t          |
                    |
z   z  }2|t          d          z  }|	                    |           |S )z2Return a list of strings representing a GIF headers   87ar3   s   89art   rk   Nrd   r`   r9   s   GIFr   r   r7   rb   rh   r8   rj   r+   rf   )r<   r   r   r   r  r  r   r   r  r   r   rM  encoder,   r-   )rY   r<   r3   r9   r  r  headercomment_blockr`   r/   subblocks              r   r   r     s    G	w{{9'' ( d""xx+xx
## ,xx	"" ,
  TXXl%;%;<<J&r**M,];; 	
	
bgaj//	 bgaj//	 	c!""
:AM**F xx#ggff  ee	
 ee $v,  ee		
 		
 		
 xx	 %r#wwy/gs## 	'nn&&Gq#g,,,, 	: 	:Aq1s7{+HRH..99MMAm$$$Mr   c           	         	 ||_         t          | ||d           t          j        || dd|j        z   dt
          |j                 fg           |                     d           |` d S # |` w xY w)Nr   r{   r   r   )r   r   r   r   r   r   r   r   )r%   r   r  paramss       r   r   r     s    !% 	B&!444bE6HM#91ghm>TUV	
 	
 	
 	   H     s   A!A' 'A+c                    t          | |          }|i }d|vrd| j        v r| j        d         |d<   t          | ||          }|j        | _        |j        | _        t          | |          }||fS )a  
    Legacy Method to get Gif data from image.

    Warning:: May modify image data.

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

    Nr9   )r   r<   r   rB   rY   r   )rY   rB   r<   r   im_modrQ  s         r   	getheaderrX    s     (D11|4LBG$;$;W\2\GT22FBJIBED))F&&&r   r   c                     G d d          }|                                    |            }t          || ||           |j        S )a  
    Legacy Method

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

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

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

    c                      e Zd Zg Zd ZdS )getdata.<locals>.Collectorc                :    | j                             |           d S r   )r)   r   )r'   r)   s     r   r   z getdata.<locals>.Collector.write0  s    IT"""""r   N)r   r   r   r)   r   r   r   r   	Collectorr[  -  s(        	# 	# 	# 	# 	#r   r]  )r   r   r)   )rY   r  rU  r]  r%   s        r   r   r     s_    $# # # # # # # # GGIII	Bb"ff---7Nr   z.gifz	image/gif)F)NN)r   )6
__future__r   r   rE  r/  r'  enumr    r   r   r   r	   r
   r   r   _binaryr   r=   r   r   r  r   r   r   r    r"   r   r   r   r   r   r	  r  r   r   r   r8  r:  r   r  r  r   r   r   r   rX  r   register_openr   register_saveregister_save_allregister_extensionregister_mimer   r   r   <module>rg     s4  4 # " " " " "      				                            " ! ! ! ! !       ! ! ! ! ! !    g    #2 0 0 0K K K K K9& K K Kd #C
(
(  29 9 9x  *2 2 2m m m`+ + +   "  - - -`, , ,b ++ ++ ++\C C C  $5 5 5  .; ; ;|! ! !(' ' ' '8   H  L'w ? ? ?  L' / / /  +Y 7 7 7  ,f 5 5 5  L' 5 5 5 5 5r   