
    grh٤                       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	 d dl
mZmZmZmZmZ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 ddlm Z  dZ!e!rddlm"Z" ddl#m$Z$  G d de      Z%e%jL                  Z'd.dZ( G d dej(                        Z)ddddZ*d/dZ+ee,e-e.e/   ej.                  f   Z0	 	 	 	 	 	 	 	 d0dZ1	 	 	 	 	 	 	 	 d1dZ2	 	 	 	 	 	 d2dZ3 G d de      Z4	 	 	 	 	 	 	 	 d3dZ5d4dZ6	 d5	 	 	 	 	 	 	 	 	 d6dZ7d7d Z8	 	 	 	 	 	 	 	 	 	 d8d!Z9d4d"Z:dZ;d9d#Z<d:d$Z=d;d%Z>d<d&Z?	 	 	 	 	 	 d=d'Z@d>d(ZA	 	 	 	 	 	 	 	 	 	 d?d)ZB	 d@	 	 	 	 	 	 	 dAd*ZC	 dB	 	 	 	 	 	 	 dCd+ZD ej                  e)j                  e)e(        ej                  e)j                  e7        ej                  e)j                  e6        ej                  e)j                  d,        ej                  e)j                  d-       y)D    )annotationsN)IntEnum)cached_property)IOAnyLiteral
NamedTupleUnioncast   )Image
ImageChops	ImageFile	ImageMathImageOpsImagePaletteImageSequence)i16le)o8)o16le)DeferredErrorF)_imaging)Bufferc                      e Zd ZdZdZdZdZy)LoadingStrategyz.. versionadded:: 9.1.0r   r      N)__name__
__module____qualname____doc__RGB_AFTER_FIRST RGB_AFTER_DIFFERENT_PALETTE_ONLY
RGB_ALWAYS     e/var/www/html/ai-insurance-compliance-backend/venv/lib/python3.12/site-packages/PIL/GifImagePlugin.pyr   r   8   s    !O'($Jr%   r   c                $    | j                  d      S )N)s   GIF87as   GIF89a)
startswith)prefixs    r&   _acceptr*   G   s    344r%   c                       e Zd ZdZdZdZdZddZddZddZ	e
dd       Zedd	       Zdd
ZdddZd fdZddZddZ xZS )GifImageFileGIFzCompuserve GIFFNc                    | j                   j                  d      }|r#|d   r| j                   j                  |d         S y )Nr   r   )fpread)selfss     r&   datazGifImageFile.dataW   s6    GGLLO177<<!%%r%   c                    t        dt        |      d      D ]*  }|dz  ||   cxk(  r||dz      cxk(  r||dz      k(  r' y  y y)Nr      r   r   TF)rangelen)r1   pis      r&   _is_palette_neededzGifImageFile._is_palette_needed]   sX    q#a&!$ 	AFad:aAh:!AE(: ;	 r%   c                F   | j                   j                  d      }t        |      sd}t        |      |d d | j                  d<   t        |d      t        |d      f| _        |d   }|dz  dz   }|d	z  re|d
   | j                  d<   | j                   j                  d|z        }| j                  |      r$t        j                  d|      }|x| _
        | _        | j                   | _        | j                   j                         | _        d | _        | j!                  d       y )N   znot a GIF file   version   
      r         
backgroundr5   RGBr   )r/   r0   r*   SyntaxErrorinfoi16_sizer:   r   rawglobal_palettepalette_fptell_GifImageFile__rewind	_n_frames_seek)r1   r2   msgflagsbitsr8   s         r&   _openzGifImageFile._openc   s    GGLLqz"Cc"" !u		)AYAq	)
"	Q3;&'eDIIl#Q$Y'A&&q) $$UA.566#dl77%)

1r%   c                   | j                   6| j                         }	 	 | j                  | j                         dz   d       $| j                   S # t        $ r | j                         dz   | _         Y nw xY w| j	                  |       E)Nr   FrP   rN   rQ   EOFErrorseek)r1   currents     r&   n_frameszGifImageFile.n_frames}   sw    >>!iikG1JJtyy{Q6 
 ~~  1!%q1IIgs   %A !A32A3c                    | j                   | j                   dk7  S | j                         }|ry	 | j                  dd       d}| j	                  |       |S # t        $ r d}Y  w xY w)Nr   TFrW   )r1   rZ   is_animateds      r&   r]   zGifImageFile.is_animated   sn    >>%>>Q&&))+	 JJq% K 			'	  	 K	 s   A A%$A%c                T   | j                  |      sy || j                  k  rd | _        | j                  d       | j                  }t	        | j                  dz   |dz         D ]  }	 | j                  |        y # t
        $ r$}| j                  |       d}t        |      |d }~ww xY w)Nr   r   no more images in GIF file)_seek_check_GifImageFile__frame_imrQ   r6   rX   rY   )r1   frame
last_frameferR   s         r&   rY   zGifImageFile.seek   s    &4<<DHJJqM\\
t||a'3 	+A+

1	+  +		*%2sm*+s   &A::	B'B""B'c                    t         j                  t              r j                  j                  |dk(  r]d _        d  _        d _         j                  j                   j                         d _	        d j                  v r, j                  d= n j                  r|r j                          | j                  dz   k7  rd| }t        |       j                   _         j                  rN j                  j                   j                          j                         r	  j                         rd _         j                  j!                  d      }|r|dk(  rd}t#        |      d }i }d }d }d }		 |s j                  j!                  d      }|r|dk(  rn|dk(  rP j                  j!                  d      } j                         }
|d   d	k(  r7|
5|
d   }|dz  r|
d
   }t%        |
d      dz  |d<   d|z  }|dz	  }|r| _	        n|d   dk(  r9d}|
r||
z  } j                         }
|
rd|v r|dxx   d|z   z  cc<   n||d<   d }|d   dk(  rx|dk(  rs|
q|
 j                  j'                         f|d<   |
j)                  d      rA j                         }
|
r/t+        |
      d
k\  r!|
d   dk(  rt%        |
d       j                  d<    j                         r	  j                         rny|dk(  rs j                  j!                  d      }t%        |d      t%        |d      }}|t%        |d      z   |t%        |d      z   }}| j,                  d   kD  s| j,                  d   kD  rX|rVt/        | j,                  d         t/        | j,                  d         f _        t3        j4                   j0                         ||||f}	|d   }|dz  dk7  }|dz  rP|dz  dz   } j                  j!                  d
|z        } j7                  |      rt9        j:                  d|      }nd} j                  j!                  d      d   } j                  j'                          _        nd }|d }t#        |      | _        |sy g  _         j
                  r0 j<                  j?                   j
                   j@                         ||n jB                   _"        | _#        |dk(  r{ jD                  r+tH        tJ        jL                  k(  r|d!nd _'        nd" _'        nd# _'        |r	| _(        n jB                  rdd$l)m)}  | jB                         _(        nd  _(        n jT                  d"k(  rtH        tJ        jV                  k7  s|rd% j                  v rw j<                  jY                   j                  d%   d        j<                  j[                  d!t2        j\                  j^                         _        d! _'         j                  d%= n@d _'         j<                  j[                  dt2        j\                  j^                         _        d, fd&}d  _        |	 _          j@                  r j                  dk\  r	  j                  dk(  rǉ j@                  \  }}}}||z
  ||z
  f}t3        j4                  |       d"} j                  ja                  d%|      }| jT                  d'v rBd!} ||      d(z   }n4 j                  ja                  d)d      } jT                  d'v r
d} ||      }t2        jb                  je                  |||       _        n jf                  , ji                   j<                   j@                         _        nw|u j@                  \  }}}}||z
  ||z
  f}t3        j4                  |       d"}|} jT                  d'v rd!} ||      d(z   }t2        jb                  je                  |||       _        |od}|<|dk(  r'tH        tJ        jL                  k7  r | j                  d%<   n jT                  d'vr|}tm        jn                  d*f j                  ||f      g _        |ja                  d      r|d    j                  d<   d+D ]5  }||v r||    j                  |<   | j                  v s) j                  |= 7 y # tj        $ r Y w xY w)-Nr   commentr   zcannot seek to frame    ;r_      !   r5   r@   duration   r      r%      
   	extension   NETSCAPE2.0loop   ,	      r=   r?   @   rB   rA   rE   Fzimage not found in GIF frameRGBAPL)copytransparencyc           	        j                   ru| dz  dz   t        j                   j                        kD  rd} t        t        t
        t
        t
        f   t	        j                   j                  | dz  | dz  dz                S | | | fS )Nr5   r   )_frame_paletter7   rL   r   tupleint)colorr1   s    r&   _rgbz GifImageFile._seek.<locals>._rgb]  s    ""19q=3t':':'B'B#CCE#sC-($--55eai%!)a-PQ 
 ue,,r%   rE   ry   )r   rD   gif)rm   rr   )r   r   returnztuple[int, int, int])8
isinstancerM   r   ex_GifImageFile__offsetdisposera   rY   rO   disposal_methodrG   tileload
ValueErrorr/   r3   r0   rX   rH   rN   r(   r7   sizemaxrI   r   _decompression_bomb_checkr:   r   rJ   impastedispose_extentrK   r   _frame_transparencyLOADING_STRATEGYr   r#   _moderL   r|   moder"   putpalettealphaconvertDitherFLOYDSTEINBERGgetcorefillrb   _cropAttributeErrorr   _Tile)r1   rc   update_imagerR   r2   rL   rG   frame_transparency	interlaceframe_dispose_extentblockrS   dispose_bitsri   x0y0x1y1rT   r8   r|   r   dispose_sizedispose_moder   r}   ks   `                          r&   rQ   zGifImageFile._seek   s$   dhh.((++A:DM8<DLDLHHMM$--(#$D DII%IIi( yy\		DLL1$$)%1CS/!((==GGLL'))+ ))+DMGGLLOAI.C3-EI!!	#GGLLOT	d GGLLO		Q43;5#4 "!HEqy-21X*'*5!}r'9D$ $.#5L#/1#4L#
 0<,qTS[ "G  5( $		   !D(Y57?:*1YAqTS[UaZE4E ).tww||~(=D%''7 $		 SZ1_qQ03E1DIIf-iik iik d GGLLO QC1IBc!Qic!QiB1%diil):!$R1!6B		!8M!MDJ33DJJ?')2r2~$!"RZA-	3;!AI?DQ$Y/A..q1"."2"25!"<"' ww||Aq) $As v 0C3-	<<GGMM$,,(;(;<)0)<g$BUBU#5 A:""#'A'AA+=+IuDJ!$DJ 
&$$%#D$7$78#yyC$(X(XX%2//		.0I1M"&''//&%,,:U:U"V%+
 IIn5%*
"&''//%9T9T"U		- @T4#7#71#<*''1, &*%8%8NBB$&GR"W#5L33LA $'L IIMM.:LME(997+1L$(K$$6E $		lA >997+0L$(KE#(::??<u#UDL xx+'+zz$''4;N;N'O+7)-)<)<BB(*Rb'977E'* 2997+1L$();$<t$CE',zz(,(  L!-A:'?+E+EE4F		.1YYo5#5LR$MM9l3	DI 88I#'	?DIIi * 	!ADy#Aw		!diiIIaL		!- " s   	Fc 	c)(c)c                8   | j                   rdnd}d | _        | j                  dk(  rG| j                  t        j
                  j                  || j                  | j                        | _        n| j                  dv r| j                  | _        | j                   rtt        j
                  j                  d| j                  | j                  xs d      | _         | j                  j                  dg| j                   j                           nd | _        | j                  s| j                  | j                  | j                  j                  k7  rt        j
                  j                  | j                  j                  | j                        }| j                   r+ |j                  dg| j                   j                           |j                  | j                  d| j                  j                  z          || _        || _        d | _         t        | A          y )Nrz   r{   r   r   rE   r   r   )r   _prev_imra   r   r   r   r   r   r   r   
putpalettegetdatarb   r   r   superload_prepare)r1   	temp_modeexpanded_im	__class__s      r&   r   zGifImageFile.load_prepare  s   ..CC	<<1''3**//tyy$*B*B YY/) GGDM""**//#tyy$:R:R:WVWX"""5I4+>+>+F+F+HI}}!5$))tww||:S**//$'',,		BK""&&&uMt/B/B/J/J/LMdggv'<=!DG
"r%   c                D   | j                   dk(  r| j                  dk(  rt        t        j                  k(  r| j
                  .| j                  j                  | j
                  d       d| _        nd| _        | j                  j                  | j                  t        j                  j                        | _        y | j                  sy | j                  | j                  j                  k7  r| j
                  +t        j                  j!                  d| j                        }nft        j                  j!                  d| j                        }|j#                  dd| j                  j%                                |j                  d      }|j'                  | j                  d| j                  j                  z          || _        | j                  J | j
                  x| j                  dk(  r'| j                  j)                  d| j
                        }n]| j                  j                  | j
                  d       | j                  j                  d      }n| j                  j                  d      }| j*                  J | j-                  || j*                        }| j                  | _        | j                  j                  | _        |j                  dv r(| j                  j'                  || j*                  |       y | j                  j'                  || j*                         y )	Nr   rz   ry   rE   r   r{   LA)r   ry   )ra   r   r   r   r#   r   r   r   r   r   r   r   r   r   r   r   r   r   
getpaletter   convert_transparentr   r   )r1   r   frame_ims      r&   load_endzGifImageFile.load_end  s:   <<1yyC$48R8R$R++7GG++D,D,DaH!'DJ!&DJ''//$))U\\5P5PQ}}99***''3#jjoofdii@#jjooc499=&&ueTWW5G5G5IJ)11%8dmmVdmm6H6H-HI'DM==,,,##/yyC7766tT=U=UV''(@(@!D77??62wwu-H""...::h(;(;<--WW\\
==N*GGMM(D$7$7BGGMM(D$7$78r%   c                    | j                   S N)ra   )r1   s    r&   rN   zGifImageFile.tell  s    ||r%   )r   zbytes | None)r8   bytesr   bool)r   None)r   r   )r   r   )rc   r   r   r   )T)rc   r   r   r   r   r   )r   r   r   formatformat_description!_close_exclusive_fp_after_loadingrK   r3   r:   rU   propertyr[   r   r]   rY   rQ   r   r   rN   __classcell__)r   s   @r&   r,   r,   P   sl    F)(-%N4 	 	  "+ C!J6(9Tr%   r,   r{   rz   )1r{   rz   c                   | j                   t        v r| j                          | S t        j                  | j                         dk(  r| j                  dt        j                  j                        } | j                  J | j                  j                   dk(  rL| j                  j                  D ]3  }|d   dk(  s| j                  j                  |   | j                  d<    | S  | S | j                  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
    rE   rz   rL   ry   r5   r   r}   r{   )r   RAWMODEr   r   getmodebaser   PaletteADAPTIVErL   colorsrG   )r   rgbas     r&   _normalize_moder      s     
ww'
		!U*ZZU]]%;%;Z<zz%%%::??f$

)) 7a<.0jj.?.?.EBGGN+		 	::c?r%   c                H   d}|rXt        |t        t        t        f      rt        |dd       }t        |t        j                        rt        |j
                        }| j                  dk(  r#|sZ| j                  d      }|J t        |      }n9|st        d t        d      D              }t	        j                  d|      | _        |J |rg }| j
                  J t        dt        |      d      D ]O  }t        |||dz          }| j
                  j                  j                  |      }||v rd}|j                  |       Q t        |      D ],  \  }}|	t        t        |            D ]  }	|	|vs|	||<    , . g }
|D ]  }|J |
j                  |        | j                  |
      } n@t!        | |      }|2| j                  ||      } d	|v r	 |j#                  |d	         |d	<   | S | S | j
                  J || j
                  _        | S # t$        $ r |d	= Y | S w xY w)
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   rz   c              3  &   K   | ]	  }|d z    yw)r5   Nr$   ).0r9   s     r&   	<genexpr>z%_normalize_palette.<locals>.<genexpr>:  s     &B!qAv&Bs   rE   r   r   r5   r}   )r   r   	bytearraylistr   rL   r   r   r6   r7   r   r   r   append	enumerateremap_palette_get_optimizeindexr   )r   rL   rG   source_palette
im_paletteused_palette_colorsr9   source_colorr   jdest_mapoptimized_palette_colorss               r&   _normalize_paletter     s`    Ngy$78&wt}5Ng|889&w7N	ww#~t,J)))&z2N&&BuSz&BBN!..unM
%%%02zz%%%q#n-q1 	.A AE!:;LJJ%%)),7E++&&u-	. ""56 	HAu}s#678 A 3312+A.	 !( 	#E$$$OOE"	# h'#0T#: #/!!":NKB%-+C+I+I^,,D(
 I2I::!!!'BJJI " -^,I-s   H H! H!c                \   t        |       }|j                  j                         D ]2  \  }}t        |t              s| j
                  j                  ||       4 t        ||| j
                        }t        || j
                        D ]  }|j                  |        d}t        |       r|dz  }t        || d|       dt        |       f|_        t        j                  ||t        j                  dd| j                   z   dt"        |j$                           g       |j                  d       y )Nr   rx   r   r?   r       )r   rG   itemsr   strencoderinfo
setdefaultr   _get_global_headerwriteget_interlace_write_local_headerencoderconfigr   _saver   r   r   r   )r   r/   rL   im_outr   vr2   rS   s           r&   _write_single_framer   d  s   
 R F!!# ,1aNN%%a+,  @F7 
 ER
B.}R01FOOY__UFRWW,<aAUVW HHUOr%   c                2   | |fD cg c]/  }|j                   rt        |j                   j                         nd1 }}|d   |d   k7  r"|j                  d      }| j                  d      } t        j                  ||       }||j                  d      fS c c}w )Nr%   r   r   ry   F)
alpha_only)rL   r   r   r   subtract_modulogetbbox)base_imim_framer   palette_bytesdeltas        r&   _getbboxr     s     ELXCV=?RZZbjj  !S8M  Q=++##F+//&)&&x9E%--5-111s   4Bc                  ,    e Zd ZU ded<   ded<   ded<   y)_FrameImage.Imager   z tuple[int, int, int, int] | Nonebboxdict[str, Any]r   N)r   r   r   __annotations__r$   r%   r&   r   r     s    O
**r%   r   c           	        | j                   j                  d      }| j                   j                  d| j                  j                  d            }g }d }d}d }t        j                  | g| j                   j                  dg             D ]  }	t        j                  |	      D ]  }
t        |
j                               }
|dk(  rU|
j                  j                         D ]8  \  }}|dk(  rt        |t              s| j                   j                  ||       : | j                   j                         }d|
j                  v r|j                  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|r~t!        ||
      \  }}|s0|j                  d      r|d   j                   dxx   |d   z  cc<   x|d   j                   j                  d      dk(  r| j                   j                  d| j                  j                  d            }|y|ft#        |
|      }t%        j&                  d	|
j(                  |      }|d   j*                  j,                  }|J |j/                  ||j0                         t!        ||
      d   }nnd
|
j(                  z   }n]|j                  d      rK|
j0                  dk7  r;d|vr-|
j,                  J 	 |
j,                  j3                  |
      |d<   d|v r|
j                         }t%        j&                  d	|j(                  |d         }|j0                  dk(  r1|j7                         \  }}}}t9        j:                  d ||||      }nh|j0                  d	k(  rAt%        j&                  d|j(                        }|j=                  |j?                                |}t9        j:                  d |      }|jA                  |tC        jD                  |             nd }|
}|jG                  tI        |xs |
||               tK        |      dk(  r.d| j                   v r|d   j                   d   | j                   d<   y|D ]  }|j*                  }
|jL                  s/tO        |
|j                         D ]  }|jQ                  |        d
}nW|sd|j                   d<   |jL                  d
|
j(                  z   k7  r|
jS                  |jL                        }
|jL                  d d }tU        ||
||j                           y# t4        $ r Y 8w xY w)Nrm   disposalr   append_imagesr}   r   rh   r   rz   r   optimizer   ry   c                t     | d    | d    | d    | d   | d   | d         | d         | d         dz  d      S )	Nr   r   rgbarq   r   r$   argss    r&   <lambda>z(_write_multiple_frames.<locals>.<lambda>  sd    _T)_$/DK(3U,7DKS	49,MtTWy)* )-S		%& '*%* %(	." r%   )r
  r  r  r  r{   c                &     | d   | d   dz  d      S )Nr   r   rq   r   r$   r  s    r&   r  z(_write_multiple_frames.<locals>.<lambda>  s    _T)_T$Z#=Ms-S r%   )r   )maskFTinclude_color_table)+r   r   rG   	itertoolschainr   Iteratorr   r|   r   r   r   r   r   r   r   r   _get_backgroundr   newr   r   rL   r   r   _new_color_indexr   splitr   lambda_evalputdatar   r   r   invertr   r   r7   r  r   r   crop_write_frame_data)r   r/   rL   rm   r  	im_framesprevious_imframe_countbackground_im
imSequencer   r   r   r   
diff_framer   r  r   rD   first_paletter   r
  r  r  r  r  delta_l
frame_datar2   offsets                                 r&   _write_multiple_framesr*    s     ~~!!*-H~~!!*bggkk*.EFH I&*KKMoordBNN,>,>PR,ST ]P
%..z: \	PH&x}}7Ha$MM//1 8DAqN* !!S)11!Q7	8 ..--/K.&&~x}}^7TU)(G[IH(T5M2*2;*?J'!jHMM&A*2--
*CJ'(T5M2*2;*?J'1KJ[&{H=t"z2!"11*=ZAXX=R=,,00<A NN..&N(CE ((0)85)IJ,1IIc8==*,UM,5aLOO,C,CM#0#<<#<)44]MDVDVW'x@C%5 __Z0X]]c5I%[8'//;;;! ( 0 0 A A( K (7
 &4%-]]_
$yyejj+n:UV ::/).JAq!Q#,#8#8	!" #$"#"#"#$D"  %zzS0*/))C*D ' @(/#,#8#8 S#($D #((HOOD4I(J"KVJ$:(D+NOy\	P]P~ 9~')21)A)A*)MBNN:& H
=='*2H2HI F @D
&&'<=&8=="88#==9__Ra(F"h
0F0FGH  }  * ! !s   2U<<	V	V	c                "    t        | ||d       y )NT)save_all)r   )r   r/   filenames      r&   	_save_allr.    s    	"b(T*r%   c                x   d| j                   v sd| j                  v r6| j                   j                  d| j                  j                  d            }nd }| j                   j                  dd       |rt	        | ||      st        | ||       |j                  d       t        |d      r|j                          y y )NrL   r  Trj   flush)	r   rG   r   r   r*  r   r   hasattrr0  )r   r/   r-  r,  rL   s        r&   r   r     s     BNN"i277&:..$$YI0FG
!!*d31"b'BBG,HHTNr7

 r%   c                r    | j                   j                  dd      }t        | j                        dk  rd}|S )Nr   r      r   )r   r   minr   )r   r   s     r&   r   r   ,  s5    "";2I 277|b	r%   c                   	 |j                   d   }d|j                   v rt        |j                   d   dz        }nd}t        |j                   j                  dd            }||dk7  s|rk|dnd}||dz  z  }| j	                  dt        d	      z   t        d
      z   t        |      z   t        |      z   t        |xs d      z   t        d      z          |j                   j                  d      }|r"t        |      }	t        |	      }
|
r
|dz  }||
z  }| j	                  dt        |d         z   t        |d         z   t        |j                  d         z   t        |j                  d         z   t        |      z          |r
r| j	                  t        	             | j	                  t        d             y # t        $ r d }Y w xY w)Nr}   rm   r@   r   r  r   r   rk   rl   rw   r  rB   ru   r?   )r   KeyErrorr   r   r   r   o16_get_palette_bytes_get_color_table_sizer   _get_header_palette)r/   r   r)  rS   r}   rm   r  packed_flagr  r   color_table_sizes              r&   r   r   6  s   ~~n5 R^^#r~~j1B672>>%%j!45H8q=H'3ax1}$
ge o (m	
 "#$ e	
 ..,,-BC*2.0?CKE,,EHH
fQi.	
fQi.	 bggaj/	 bggaj/		
 U)	 /
$]34HHRUOU  s   F; ;G
	G
c                @   | j                         }	 t        |d      5 }| j                  dk7  r)t        j                  d|g|t        j
                         ndd|g}dg}t        j                  |t        j                  t        j
                        }t        j                  ||j                  |t        j
                        }|j                  J |j                  j                          |j                         }	|	rt        j                  |	|      |j                         }	|	rt        j                  |	|      d d d        	 t        j                  |       y # 1 sw Y    xY w# t        $ r Y y w xY w# 	 t        j                  |       w # t        $ r Y w w xY wxY w)NwbrE   ppmtogif)stdoutstderrppmquant256)stdinr@  rA  )_dumpopenr   
subprocess
check_callDEVNULLPopenPIPEr@  closewaitCalledProcessErrorosunlinkOSError)
r   r/   r-  tempfilere   	quant_cmd	togif_cmd
quant_proc
togif_procretcodes
             r&   _save_netpbmrX  h  sy    xxzH$(D! 	LQww%%%*1Z=O=O (9	'L	'--jooj>P>P
 (--$++%--	
 "((444!!'')$//+$77KK$//+$77KK=	L@	IIhC	L 	LD  			IIh 		sY   E6 DE<E6 E' E$ E6 '	E32E36F8FF	FFFFc                d   | j                   dv r!|r|j                  d      rt        xs | j                   dk(  }|s| j                  | j                  z  dk  rg }t        | j                               D ]  \  }}|s	|j                  |        |st        |      t        |      k\  r|S | j                  J t        | j                  j                        t        j                  | j                  j                         z  }d|dz
  j                         z  }t        |      |dz  k  r|dkD  r|S y)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
    )rz   r{   r  r{   i   Nr   r   )r   r   _FORCE_OPTIMIZEwidthheightr   	histogramr   r   r7   rL   r   getmodebands
bit_length)r   rG   optimiser   r9   countnum_palette_colorscurrent_palette_sizes           r&   r   r     s     
ww*$((:*> #4bggnrxx"))+i7"$%blln5 25'..q12 323s;N7OO**::)))!$RZZ%7%7!8E<N<N

= " $%);a)?(K(K(M#M  '(,@A,EE(1,**r%   c                    | syt        |       dk  ryt        j                  t        j                  t        |       dz  d            dz
  S )Nr   rv   r   r5   r   )r7   mathceillog)r   s    r&   r9  r9    sA    	]	a	yy#m"4"91=>BBr%   c                v    t        |       }d|z  t        |       dz  z
  }|dkD  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   r5   r   )r9  r7   r   )r   r<  actual_target_size_diffs      r&   r:  r:    sR     -];  !$44M8Ja8OO"A%<<<r%   c                    | j                   syt        | j                   j                         | j                   j                  dk(  r/dj                  fdt	        t              dz        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%   ry   c              3  :   K   | ]  }|d z  |d z  dz      yw)rw   r5   Nr$   )r   r9   rL   s     r&   r   z%_get_palette_bytes.<locals>.<genexpr>  s$     X!71q51q5195Xs   r5   )rL   r   r   joinr6   r7   )r   rL   s    @r&   r8  r8    s[     ::BJJ&&'G	zz& ((XuS\UVEV?WXXNr%   c                    d}|r?t        |t              r-| j                  J 	 | j                  j                  ||       }|S |}|S # t        $ r}t        |      dvr Y d }~|S d }~ww xY w)Nr   )z$cannot allocate more than 256 colorsz/cannot add non-opaque RGBA color to RGB palette)r   r   rL   getcolorr   r   )r   info_backgroundrD   rf   s       r&   r  r    s     Jou- ::)))
ZZ00"E
  )J  q6 "   s   A 	A(A##A(c                   d}| j                   j                  d      dk(  s9|r9d|v s3|j                  d      "|j                  d      s|j                  d      rd}t        | |j                  d            }t        |       }t	        |      }d	|z   t        | j                  d
         z   t        | j                  d         z   t        |dz         t        |      t        d
      z   t        |      g}|j                  d      _|j                  dt        d      z   t        d      z   dz   t        d      z   t        d      z   t        |d         z   t        d
      z          |j                  d      rdt        d      z   }|d   }t        |t              r|j                         }t        d
t        |      d      D ]$  }	||	|	dz    }
|t        t        |
            |
z   z  }& |t        d
      z  }|j                  |       |S )z2Return a list of strings representing a GIF headers   87ar>   s   89ar}   rt   rm   ri   rD   s   GIFr   r   rB   rk   rq   rC   rs   r5   ro   )rG   r   r  r8  r9  r7  r   r   r:  r   r   r   encoder6   r7   )r   rG   r>   rD   r   r<  headercomment_blockri   r9   subblocks              r&   r   r     s    G	ww{{9'd"xx+xx
#xx	"  TXXl%;<J&r*M,]; 	
	
bggaj/	 bggaj/	 	c!"
:AM*F xx#gf  e	
 e $v,  e		
 xx	r#wy/gs#nn&Gq#g,, 	:Aq1s7+HRH.99M	: 	Am$Mr%   c                    	 ||_         t        | ||d       t        j                  || t        j                  dd|j
                  z   dt        |j                           g       | j                  d       |` y # |` w xY w)Nr   r   r   r   )	r   r   r   r   r   r   r   r   r   )r/   r   r)  paramss       r&   r  r  R  sr    !% 	B&!4__UFX]]$:Awx}}?UVW	
 	 H s   A2A7 7A;c                    |i }t        | |      }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)

    rD   )r   rG   r   rL   r   r   )r   rL   rG   r   im_modrr  s         r&   	getheaderry  m  s}     |'D14LBGG$;WW\2\GT2FBJIIBED)F&&&r%   c                    ddl m}  G d d|      }| j                           |       }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

    r   )BytesIOc                      e Zd Zg ZddZy)getdata.<locals>.Collectorc                N    | j                   j                  |       t        |      S r   )r3   r   r7   )r1   r3   s     r&   r   z getdata.<locals>.Collector.write  s    IIT"t9r%   N)r3   r   r   r   )r   r   r   r3   r   r$   r%   r&   	Collectorr}    s    	r%   r  )ior{  r   r  r3   )r   r)  rv  r{  r  r/   s         r&   r   r     s<    & G  GGI	Bb"ff-77Nr%   z.gifz	image/gif)r)   r   r   r   )r   r  r   r  )r   r  rL   _Palette | NonerG   r  r   r  )r   r  r/   	IO[bytes]rL   r  r   r   )r   r  r   r  r   z4tuple[Image.Image, tuple[int, int, int, int] | None])r   r  r/   r  rL   r  r   r   )r   r  r/   r  r-  str | bytesr   r   )F)
r   r  r/   r  r-  r  r,  r   r   r   )r   r  r   r   )
r/   r  r   r  r)  tuple[int, int]rS   r   r   r   )r   r  rG   r  r   zlist[int] | None)r   r   r   r   )r   r   r   r   )r   r  r   r   )r   r  ro  z=int | tuple[int, int, int] | tuple[int, int, int, int] | Noner   r   )r   r  rG   r  r   list[bytes])
r/   r  r   r  r)  r  rv  r  r   r   )NN)r   r  rL   r  rG   zdict[str, Any] | Noner   z$tuple[list[bytes], list[int] | None])r   )r   r  r)  r  rv  r   r   r  )K
__future__r   r  re  rO  rG  enumr   	functoolsr   typingr   r   r   r	   r
   r    r   r   r   r   r   r   r   _binaryr   rH   r   r   r7  _utilr   TYPE_CHECKINGr   _typingr   r   r!   r   r*   r,   r   r   r   r   r   r   _Paletter   r   r   r   r*  r.  r   r   r   rX  rZ  r   r9  r:  r8  r  r   r  ry  r   register_openr   register_saveregister_save_allregister_extensionregister_mimer$   r%   r&   <module>r     s  4 #   	   % < <   "  !  g  #22 5f9&& fZ #C
(4 	49l.G.GGHDD-D5CDDN  
	8
2
2$/
29
2 Z  "-<	D+
 MR".9EI	&//"/,;/DG/	/d-d -`C$ R 	6;|!!! ! 	!
 
!8 UY''-'<Q')'> 06"","AD""P   L''w ?   L'' /   ++Y 7   ,,f 5   L'' 5r%   