
    e+             #         d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	m
Z
 d dlmZ d dlmZmZ ddl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  ej<                  e      Z dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5d Z6d!Z7d"Z8d#Z9d$Z:d%Z;d&Z<d'Z=d(Z>d)Z?d*Z@d+ZAd,ZBd-ZCd.ZDd/ZEd0ZFd1ZGd2ZHd3ZId4ZJd5ZKd6ZLd7ZMd8ZNi dd9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYZOeOj                         D  ci c]  \  } }|| 
 c}} ZQi e%d dZddZd[fd\e&d dZddZd[fd\e%d dZd:dZd[fd]e&d dZd:dZd[fd]e%ddZddZd[fd^e&ddZddZd[fd^e%ddZd:dZd[fd_e&ddZd:dZd[fd_e%d dZdd`d[fdae&d dZdd`d[fdae%d dZd:d`d[fdbe&d dZd:d`d[fdbe%ddZdd`d[fdce&ddZdd`d[fdce%ddZd:d`d[fdde&ddZd:d`d[fdde%d dZdded[fdfi e&d dZdded[fdfe%d dZd:ded[fdge&d dZd:ded[fdge%ddZdded[fdhe&ddZdded[fdhe%ddZd:ded[fdie&ddZd:ded[fdie%d dZddjd[fdke&d dZddjd[fdke%d dZd:djd[fdle&d dZd:djd[fdle%ddZddjd[fdme&ddZddjd[fdme%dd`ddjd[fdme&dd`ddjd[fdme%ddZd:djd[fdne&ddZd:djd[fdni e%ddZddod[fdpe%d dZddqd[fdre%ddZddqd[fdre&ddZddqd[fdse%ddZd:dqd[fdte%dd`ddqd[fdue&dd`ddqd[fdve%d dwddxd[fdye&d dwddxd[fdze%ddZddxd[fd{e%dd`ddxd[fd|e&dd`ddxd[fd}e%ddwddxd[fdye&ddwddxd[fdze%ddZdd~d`fde&ddZdd~d`fde%d:dZddd[fdi e&d:dZddd[fde%d:dZd:dd[fde&d:dZd:dd[fde%d:dZddd[fde&d:dZddd[fde%d:dZdddfde&d:dZdddfde%d:dZdddfde&d:dZdddfde%d:dZdddfde&d:dZdddfde%d:dZdddZfde&d:dZdddZfde%d:dZdddfde&d:dZdddfde%d:dZdddfde&d:dZdddfdi e%d:dZddd`fde&d:dZddd`fde%d:dZdddfde&d:dZdddfde%d:dZdddfde&d:dZdddfde%d:dZdddfde&d:dZdddfde%d:dZddd[fde&d:dZddd[fde%d:dZddd[fde&d:dZddd[fde%d:dZdddfde&d:dZdddfde%d:dZdddZfde&d:dZdddZfde%d:dZddd`fdi e&d:dZddd`fde%d<dZddZd[fde&d<dZddZd[fde%d<dZd:dZd[fde&d<dZd:dZd[fde%d<dZdd`d[fde&d<dZdd`d[fde%d<dZd:d`d[fde&d<dZd:d`d[fde%d<dZdded[fde&d<dZdded[fde%d<dZd:ded[fde&d<dZd:ded[fde%d<dZddjd[fde&d<dZddjd[fde%d<dZdd~d`fde&d<dZdd~d`fde%d<dZd:djd[fde&d<dZd:djd[fde%d@dZddd[fde&d@dZddd[fde%d@dZdddfde&d@dZdddfde%d@dZdddfde&d@dZdddfde%d@dZddd[fde%dBdZddjd[fdme&dBdZddjd[fdme%dBdZddd[fde&dBdZddd[fde%dFdZddd[fde&dFdZddd[fdiZR eSd eRD              ZTg dZUd ZVd ZWd ZXi ZYi ZZ G d de      Z[ G d de
      Z\eYe\_Y        eZe\_Z         ej                         D ]:  \  Z]Z^e^j                  dd      Z^ e`e\de^z   eYe]   d           e`e\de^z   eZe]          < [Y[Z[][^ G d de\      ZaeaZb G d dej&                        Zci dde%dddZdfdde%dddjdfdde%ddd~d:fdde%d<ddjdfdde%d<dd~d:fdde%dd:dxdfdde%dddqdfdde%dd:dqdfdde%dd<dxdfdde%d:dddfdde%d:ddd fdde%d:ddd:fdde%d@dddfdde%dBdddfdde%dFdddfdde&dd:dxdfdde&dddqdfde&dd:dqdfde&dd<dxdfd֜Zddׄ Ze G d؄ d٫      Zfdڄ Zg ej                  ecj                  eceV        ej                  ecj                  ee        ej                  ecj                  eg        ej                  ecj                  ddg        ej                  ecj                  dݫ       yc c}} w )    )annotationsN)MutableMapping)Fraction)NumberRational   )ExifTagsImage	ImageFileImageOpsImagePaletteTiffTags)i16be)i32be)o8TYPESFT   s   IIs   MM   i  i  i  i  i
  i    i  i  i  i  i  i  i(  i-  i1  i2  i;  i=  i@  iB  iC  D  iE  iJ  iR  iS  i[  i  i  i  i  iI  is  ii  i  i  i  i  raw   
tiff_ccitt   group3   group4   tiff_lzw   	tiff_jpeg   jpeg   tiff_adobe_deflatei  tiff_raw_16i  packbitsi)  tiff_thunderscani  tiff_deflateit  tiff_sgilogiu  tiff_sgilog24im  lzmaiP  zstdiQ  webpr    )1z1;I)r2   z1;IR)r2   r2   )r2   z1;R)r   )LzL;2I)r3   zL;2IR)r3   zL;2)r3   zL;2R)r   )r3   zL;4I)r3   zL;4IR)r3   zL;4)r3   zL;4R)r%   )r3   zL;I)r3   zL;IR)r3   r3   )r3   zL;R)   )I;16zI;12)   )r5   r5   )I;16Br7   )r5   zI;16R)II;16S)r8   I;16BS)r   )    )FF;32F)r<   F;32BF)r8   zI;32N)r8   I;32S)r8   I;32BS)r%   r%   )LArA   )r%   r%   r%   )RGBrB   )rB   zRGB;R)r%   r%   r%   r%   )RGBArC   r   )RGBXrE   )r%   r%   r%   r%   r%   r   r   )rE   RGBXX)r%   r%   r%   r%   r%   r%   )r   r   r   )rE   RGBXXX)rC   RGBa)r   r   )rC   RGBaX)r   r   r   )rC   RGBaXX)r   r   )rC   RGBAX)r   r   r   )rC   RGBAXX)i  )r6   r6   r6   )rB   zRGB;16L)rB   zRGB;16B)r6   r6   r6   r6   )rC   zRGBA;16L)rC   zRGBA;16B)rE   zRGBX;16L)rE   zRGBX;16B)rC   zRGBa;16L)rC   zRGBa;16B)PzP;1)rN   zP;1R)rN   zP;2)rN   zP;2R)rN   zP;4)rN   zP;4R)rN   rN   )PArO   )rN   zP;R)CMYKrP   )rP   CMYKX)rP   CMYKXX)rP   zCMYK;16L)rB   rE   )LABrS   c              #  8   K   | ]  }t        |d            yw)r   N)len).0key_tps     5/usr/lib/python3/dist-packages/PIL/TiffImagePlugin.py	<genexpr>rY   
  s     AV#fQi.As   )   MM *   II* s   MM* s   II *s   MM +s   II+ c                    | d d t         v S Nr   )PREFIXESprefixs    rX   _acceptra     s    "1:!!    c                x    t        |       dkD  }t        |rd| z  n|       j                  |      }|r|d d d   S |S )Nr   )absIFDRationallimit_rational)valmax_valinvn_ds       rX   _limit_rationalrl     sA    
c(Q,C
a#g#
.
=
=g
FC3tt9$$rb   c                    t        |       }|j                  |j                  f}t        |      |k  rt	        | t        |            }t        |      |kD  rt        | } t	        | |      }|S N)r   	numeratordenominatorminrl   re   max)rh   ri   min_valfracrk   s        rX   _limit_signed_rationalru      sa    C=D
..$**
*C
3x'c3w<0
3x'nc7+Jrb   c                  .   e Zd ZdZ	 dZd)dZed        Zed        Zd Z	d Z
d Zd	 Zd
 Zd Zd Z	  ed      Z ed      Z ed      Z ed      Z ed      Z ed      Z ed      Z ed      Z ed      Z ed      Z ed      Z ed      Z ed      Z ed      Z ed      Z ed      Z ed      Z  ed      Z! ed      Z" ed       Z# ed!      Z$ ed"      Z% ed#      Z& ed$      Z' ed%      Z( ed&      Z) e*e+d'      r	 ed'      Z,y(y()*rf   zImplements a rational class where 0/0 is a legal value to match
    the in the wild use of exif rationals.

    e.g., DigitalZoomRatio - 0.00/0.00  indicates that no digital zoom was used
    )
_numerator_denominator_valc                   t        |t              r4|j                  | _        |j                  | _        |j                  | _        yt        |t              r#|j                  | _        |j                  | _        n|| _        || _        |dk(  rt        d      | _        y|dk(  rt        |      | _        yt        ||      | _        y)z
        :param value: either an integer numerator, a
        float/rational/other number, or an IFDRational
        :param denominator: Optional integer denominator
        Nr   nanr   )	
isinstancerf   ro   rw   rp   rx   ry   r   float)selfvaluerp   s      rX   __init__zIFDRational.__init__C  s     e[)#ooDO % 1 1D

DIeX&#ooDO % 1 1D#DO +D!eDIA DI 4DIrb   c                    | j                   S rn   )rw   r~   s    rX   ro   zIFDRational.numerator]  s    rb   c                    | j                   S rn   )rx   r   s    rX   rp   zIFDRational.denominatora  s       rb   c                    | j                   dk(  r| j                  | j                   fS | j                  j                  |      }|j                  |j                   fS )z

        :param max_denominator: Integer, the maximum denominator value
        :returns: Tuple of (numerator, denominator)
        r   )rp   ro   ry   limit_denominator)r~   max_denominatorfs      rX   rg   zIFDRational.limit_rationale  sN     q >>4#3#333II''8{{AMM))rb   c                >    t        t        | j                              S rn   )strr}   ry   r   s    rX   __repr__zIFDRational.__repr__r  s    5#$$rb   c                6    | j                   j                         S rn   )ry   __hash__r   s    rX   r   zIFDRational.__hash__u  s    yy!!##rb   c                    | j                   }t        |t              r|j                   }t        |t              rt        |      }||k(  S rn   )ry   r|   rf   r}   )r~   otherrh   s      rX   __eq__zIFDRational.__eq__x  s;    iie[)JJEeU#*Ce|rb   c                H    | j                   | j                  | j                  gS rn   )ry   rw   rx   r   s    rX   __getstate__zIFDRational.__getstate__  s    		4??D,=,=>>rb   c                f    t         j                  | d       |\  }}}|| _        || _        || _        y )Nr   )rf   r   ry   rw   rx   )r~   statery   rw   rx   s        rX   __setstate__zIFDRational.__setstate__  s4    T1%).&j,	$(rb   c                      fd}|S )Nc                6     t        | j                        | S rn   )getattrry   )r~   argsops     rX   delegatez'IFDRational._delegate.<locals>.delegate  s    )7499b)400rb   r1   )r   r   s   ` rX   	_delegatezIFDRational._delegate  s    	1 rb   __add____radd____sub____rsub____mul____rmul____truediv____rtruediv____floordiv____rfloordiv____mod____rmod____pow____rpow____pos____neg____abs__	__trunc____lt____gt____le____ge____bool____ceil__	__floor__	__round____int__Nr0   )-__name__
__module____qualname____doc__	__slots__r   propertyro   rp   rg   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   hasattrr   r   r1   rb   rX   rf   rf   5  s   
 7I54   ! !*%$?) 	"G$H	"G$H	"G$HM*K^,L^,Lo.M	"G$H	"G$H	"G	"G	"G+&Ix Fx Fx Fx F$H$H+&I+&Ix#I& $rb   rf   c                  ,   e Zd ZdZd;dZ ed       Z ed       Z ed       Zej                  d        Zd Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z e eeej8                  ddfej:                  ddfej<                  ddfej>                  ddfej@                  dd fejB                  d!d"fejD                  d#d$fejF                  ddfejH                  d%d&fg	              ed'd'      d<d(       Z% ed'      d)        Z& ed*d'      d<d+       Z' ed*      d,        Z( ed-d.      d<d/       Z) ed-      d0        Z* ed1d'      d<d2       Z+ ed1      d3        Z, ed4d.      d<d5       Z- ed4      d6        Z.d7 Z/d8 Z0d=d9Z1d: Z2y)>ImageFileDirectory_v2a  This class represents a TIFF tag directory.  To speed things up, we
    don't decode tags unless they're asked for.

    Exposes a dictionary interface of the tags in the directory::

        ifd = ImageFileDirectory_v2()
        ifd[key] = 'Some Data'
        ifd.tagtype[key] = TiffTags.ASCII
        print(ifd[key])
        'Some Data'

    Individual values are returned as the strings or numbers, sequences are
    returned as tuples of the values.

    The tiff metadata type of each item is stored in a dictionary of
    tag types in
    :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v2.tagtype`. The types
    are read from a tiff file, guessed from the type added, or added
    manually.

    Data Structures:

        * ``self.tagtype = {}``

          * Key: numerical TIFF tag number
          * Value: integer corresponding to the data type from
            :py:data:`.TiffTags.TYPES`

          .. versionadded:: 3.0.0

    'Internal' data structures:

        * ``self._tags_v2 = {}``

          * Key: numerical TIFF tag number
          * Value: decoded data, as tuple for multiple values

        * ``self._tagdata = {}``

          * Key: numerical TIFF tag number
          * Value: undecoded byte string from file

        * ``self._tags_v1 = {}``

          * Key: numerical TIFF tag number
          * Value: decoded data in the v1 format

    Tags will be found in the private attributes ``self._tagdata``, and in
    ``self._tags_v2`` once decoded.

    ``self.legacy_api`` is a value for internal use, and shouldn't be changed
    from outside code. In cooperation with
    :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`, if ``legacy_api``
    is true, then decoded tags will be populated into both ``_tags_v1`` and
    ``_tags_v2``. ``_tags_v2`` will be used if this IFD is used in the TIFF
    save routine. Tags should be read from ``_tags_v1`` if
    ``legacy_api == true``.

    Nc                   t        |      sdt        |       d}t        |      ||n|dd | _        | j                  t        k(  rd| _        n(| j                  t        k(  rd| _        nd}t        |      |d   dk(  | _        || _        i | _	        	 | j                          | j                  r| j                  d	|d
d       n| j                  d|dd       \  | _        d| _        y)a  Initialize an ImageFileDirectory.

        To construct an ImageFileDirectory from a real file, pass the 8-byte
        magic header to the constructor.  To only set the endianness, pass it
        as the 'prefix' keyword argument.

        :param ifh: One of the accepted magic headers (cf. PREFIXES); also sets
              endianness.
        :param prefix: Override the endianness of the file.
        znot a TIFF file (header z not valid)Nr   ><znot a TIFF IFD+   Qr%   r3   r   F)ra   reprSyntaxError_prefixMM_endianII_bigtiffgrouptagtypereset_unpacknext_legacy_api)r~   ifhr`   r   msgs        rX   r   zImageFileDirectory_v2.__init__  s     s|,T#YK{CCc""!'!3vRa<<2DL\\RDL"Cc""A"
'

*.--DLLc!"g&T\\#sSTSUw=W 	 !rb   c                    | j                   S rn   )r   r   s    rX   <lambda>zImageFileDirectory_v2.<lambda>  
    4<< rb   c                    | j                   S rn   )_offsetr   s    rX   r   zImageFileDirectory_v2.<lambda>  r   rb   c                    | j                   S rn   )r   r   s    rX   r   zImageFileDirectory_v2.<lambda>  s    t'7'7 rb   c                    d}t        |      )Nz"Not allowing setting of legacy api)	Exception)r~   r   r   s      rX   
legacy_apiz ImageFileDirectory_v2.legacy_api  s    2nrb   c                X    i | _         i | _        i | _        i | _        d | _        d | _        y rn   )_tags_v1_tags_v2_tagdatar   _nextr   r   s    rX   r   zImageFileDirectory_v2.reset  s,    
rb   c                *    t        t        |             S rn   )r   dictr   s    rX   __str__zImageFileDirectory_v2.__str__%  s    4:rb   c                    | j                         D ci c]0  \  }}t        j                  || j                        j                  |2 c}}S c c}}w )z
        :returns: dict of name|key: value

        Returns the complete tag dictionary, with named tags where possible.
        )itemsr   lookupr   name)r~   coder   s      rX   namedzImageFileDirectory_v2.named(  sH      $zz|
e OOD$**-22E9
 	
 
s   5Ac                j    t        t        | j                        t        | j                        z        S rn   )rU   setr   r   r   s    rX   __len__zImageFileDirectory_v2.__len__3  $    3t}}%DMM(::;;rb   c                   || j                   vrG| j                  |   }| j                  |   }| j                  |   \  }} || || j                        | |<   | j                   |   }| j                  rt        |t        t        f      s|f}|S rn   )r   r   r   _load_dispatchr   r|   tuplebytes)r~   tagdatatypsizehandlerrh   s          rX   __getitem__z!ImageFileDirectory_v2.__getitem__6  s    dmm#==%D,,s#C //4MD'dDOO<DImmC ??:cE5>#B&C
rb   c                >    || j                   v xs || j                  v S rn   )r   r   r~   r   s     rX   __contains__z"ImageFileDirectory_v2.__contains__A      dmm#;sdmm';;rb   c                >    | j                  ||| j                         y rn   )_setitemr   )r~   r   r   s      rX   __setitem__z!ImageFileDirectory_v2.__setitem__D  s    c5$//2rb   c           	       	 t         t        t        f}t        j                  || j
                        	t        ||      r|gn|}|| j                  vr؉	j                  r	j                  | j                  |<   nt        j                  | j                  |<   t        d |D              rAt        d |D              rt        j                  nt        j                  | j                  |<   nAt        d |D              rt        d |D              rt        j                  | j                  |<   nt        d |D              rt        j                  | j                  |<   nt        d |D              rt        j                  nt        j                   | j                  |<   nt        d |D              rt        j"                  | j                  |<   n_t        d |D              rt        j$                  | j                  |<   n/t        d	 |D              rt        j&                  | j                  |<   | j                  |   t        j                  k(  r2|D cg c]&  }t        |t              r|j)                  d
d      n|( }}nJ| j                  |   t        j                  k(  r*|D cg c]  }t        |t*              rt-        |      n|! }}| j                  |   t        j                  k(  xr t        |t.              }|st1        	fd|D              }|r| j2                  n| j4                  }|s	j6                  dk(  s<| j                  |   t        j&                  k(  s	j6                  Mt9        |      dk(  r?|s=|r2| j                  |   t        j                  t        j                  fv r|f}	 |\  ||<   y |||<   y c c}w c c}w # t:        $ r0 t=        j>                  d| dt9        |       d       |d   ||<   Y y w xY w)Nc              3  <   K   | ]  }t        |t                y wrn   )r|   rf   rV   vs     rX   rY   z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>R  s     Baz![1B   c              3  &   K   | ]	  }|d k\    ywr   Nr1   r  s     rX   rY   z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>U  s     6!qAv6   c              3  <   K   | ]  }t        |t                y wrn   )r|   intr  s     rX   rY   z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>X       <As+<r  c              3  <   K   | ]  }d |cxk  xr dk  nc   yw)r   r   Nr1   r  s     rX   rY   z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>Y  s     :a1>E>>:r  c              3  <   K   | ]  }d |cxk  xr dk  nc   yw)i i   Nr1   r  s     rX   rY   z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>[  s     BaX1E11Br  c              3  &   K   | ]	  }|d k\    ywr  r1   r  s     rX   rY   z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>`  s     ":a16":r  c              3  <   K   | ]  }t        |t                y wrn   )r|   r}   r  s     rX   rY   z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>c       >!Au->r  c              3  <   K   | ]  }t        |t                y wrn   )r|   r   r  s     rX   rY   z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>e  r
  r  c              3  <   K   | ]  }t        |t                y wrn   )r|   r   r  s     rX   rY   z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>g  r  r  asciireplacec              3  @   K   | ]  }j                  |        y wrn   )cvt_enum)rV   r   infos     rX   rY   z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>t  s     DE4==/Ds   r   zMetadata Warning, tag z had too many entries: z, expected 1r   ) r   r   r   r   r   r   r|   r   type	UNDEFINEDallRATIONALSIGNED_RATIONALSHORTSIGNED_SHORTLONGSIGNED_LONGDOUBLEASCIIBYTEencoder	  r}   r   r   r   r   lengthrU   
ValueErrorwarningswarn)
r~   r   r   r   	basetypesvaluesr  is_ifddestr  s
            @rX   r   zImageFileDirectory_v2._setitemG  sE   UC(	sDJJ/&ui8%edll"yy$(IIS!$,$6$6S!B6BB 6v66 !))%55 LL%
 <V<<:6::,4NNS)B6BB,4,A,AS)  #":6":: %MM!)!5!5 S)
 >v>>(0DLL%<V<<(0DLL%>v>>(0DLL%<< 2 22   1;1c0B),IF  \\#("3"33EKL*Q"4eAh!;LFLc"hmm3P
648PDVDDF *t}} [[A||C HMM1#Fq(8 dll3/!!((4  !&%c DIU
 M4  &,SE1H6{m<1 #1IS	&s   +N9!$N>+O 6O<;O<c                    | j                   j                  |d        | j                  j                  |d        | j                  j                  |d        y rn   )r   popr   r   r   s     rX   __delitem__z!ImageFileDirectory_v2.__delitem__  s>    #t$#t$#t$rb   c                j    t        t        | j                        t        | j                        z        S rn   )iterr   r   r   r   s    rX   __iter__zImageFileDirectory_v2.__iter__  $    C&T]]);;<<rb   c                H    t        j                  | j                  |z   |      S rn   )structunpackr   )r~   fmtr   s      rX   r   zImageFileDirectory_v2._unpack  s    }}T\\C/66rb   c                H    t        j                  | j                  |z   g| S rn   )r4  packr   )r~   r6  r)  s      rX   _packzImageFileDirectory_v2._pack  s    {{4<<#-777rb   c                      fd}|S )Nc                    ddl m} | j                  j                  d      r"| j                  dd  j	                  dd      |<   | ft
        <   | S )Nr   r   load_r   _ )r   r   r   
startswithr  r   )funcr   idxr   s     rX   	decoratorz9ImageFileDirectory_v2._register_loader.<locals>.decorator  sL    '}}''0!]]12.66sC@c
"&*N3Krb   r1   )rA  r   rB  s   `` rX   _register_loaderz&ImageFileDirectory_v2._register_loader  s    	 rb   c                      fd}|S )Nc                    | t         <   | S rn   )_write_dispatch)r@  rA  s    rX   rB  z9ImageFileDirectory_v2._register_writer.<locals>.decorator  s    #'OC Krb   r1   )rA  rB  s   ` rX   _register_writerz&ImageFileDirectory_v2._register_writer  s    	 rb   c                    ddl m} | \  }}|||<   t        j                  dz         dfd	ft        |<   fdt
        |<   y )Nr   r   =c                H    | j                  t        |      z    |      S rn   )r   rU   )r~   r   r   r6  r   s      rX   r   z7ImageFileDirectory_v2._register_basic.<locals>.<lambda>  s)    D	T 123%8$? rb   c                <     dj                   fd|D              S )Nrb   c              3  B   K   | ]  }j                  |        y wrn   )r9  )rV   r   r6  r~   s     rX   rY   zJImageFileDirectory_v2._register_basic.<locals>.<lambda>.<locals>.<genexpr>  s     @TZZU+@s   join)r~   r)  r6  s   ` rX   r   z7ImageFileDirectory_v2._register_basic.<locals>.<lambda>  s    HH@@@ rb   T)r   r   r4  calcsizer   rF  )idx_fmt_namer   rA  r   r6  r   s       @@rX   _register_basicz%ImageFileDirectory_v2._register_basic  sL    #%S$c
sSy)
s 
rb   Hshortr3   longbzsigned bytehzsigned shortlzsigned longr   r}   ddoubler   long8r   c                    |S rn   r1   r~   r   r   s      rX   	load_bytezImageFileDirectory_v2.load_byte      rb   c                t    t        |t              rt        |      }t        |t              rt        |f      }|S rn   )r|   rf   r	  r   r~   r   s     rX   
write_bytez ImageFileDirectory_v2.write_byte  s/    dK(t9DdC $>Drb   r   c                R    |j                  d      r|d d }|j                  dd      S )N    rd   zlatin-1r  )endswithdecoder]  s      rX   load_stringz!ImageFileDirectory_v2.load_string  s*    ==9D{{9i00rb   c                    t        |t              rt        |      }t        |t              s|j	                  dd      }|dz   S )Nr  r  rd  )r|   r	  r   r   r#  r~   r   s     rX   write_stringz"ImageFileDirectory_v2.write_string  s;     eS!JE%'LL)4Eu}rb   r   r%   c           
         | j                  t        |      dz   d|      }fdt        fdt        |d d d   |dd d         D              S )Nr   r3   c                (    r| |fS t        | |      S rn   rf   arV  r   s     rX   combinez4ImageFileDirectory_v2.load_rational.<locals>.combine      'Aq6>[A->>rb   c              3  6   K   | ]  \  }} ||        y wrn   r1   rV   numdenomrp  s      rX   rY   z6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>       VZS%WS%(V   r   r   r   rU   r   zipr~   r   r   valsrp  s     ` @rX   load_rationalz#ImageFileDirectory_v2.load_rational  U    ||s4yA~.a0$7	? V3tCaCy$qtRSt*;UVVVrb   c                8     dj                   fd|D              S )Nrb   c              3  X   K   | ]!  } j                   d gt        |d        # yw)2Ll    N)r9  rl   rV   rt   r~   s     rX   rY   z7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>  s-      
DHJDJJt?odI>?
s   '*rM  r~   r)  s   ` rX   write_rationalz$ImageFileDirectory_v2.write_rational  s!    xx 
LR
 
 	
rb   r#   c                    |S rn   r1   r]  s      rX   load_undefinedz$ImageFileDirectory_v2.load_undefined  r_  rb   c                \    t        |t              rt        |      j                  dd      }|S )Nr  r  )r|   r	  r   r#  ri  s     rX   write_undefinedz%ImageFileDirectory_v2.write_undefined  s'    eS!J%%gy9Erb   
   c           
         | j                  t        |      dz   d|      }fdt        fdt        |d d d   |dd d         D              S )Nr   rX  c                (    r| |fS t        | |      S rn   rm  rn  s     rX   rp  z;ImageFileDirectory_v2.load_signed_rational.<locals>.combine  rq  rb   c              3  6   K   | ]  \  }} ||        y wrn   r1   rs  s      rX   rY   z=ImageFileDirectory_v2.load_signed_rational.<locals>.<genexpr>  rv  rw  r   r   rx  rz  s     ` @rX   load_signed_rationalz*ImageFileDirectory_v2.load_signed_rational  r}  rb   c                8     dj                   fd|D              S )Nrb   c           	   3  Z   K   | ]"  } j                   d gt        |dd        $ yw)2lii   N)r9  ru   r  s     rX   rY   z>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>  s3      
 DJJtP4T9hOP
s   (+rM  r  s   ` rX   write_signed_rationalz+ImageFileDirectory_v2.write_signed_rational  s!    xx 

 
 	
rb   c                ~    |j                  |      }t        |      |k7  rd| dt        |       d}t        |      |S )Nz&Corrupt EXIF data.  Expecting to read  bytes but only got z. )readrU   OSError)r~   fpr   retr   s        rX   _ensure_readz"ImageFileDirectory_v2._ensure_read  sN    ggdms8t%%)F*>s3xjL  #,
rb   c           
     x   | j                          |j                         | _        	 | j                  r"| j	                  d| j                  |d            n!| j	                  d| j                  |d            d   }t        |      D ]   }| j                  r"| j	                  d| j                  |d            n!| j	                  d| j                  |d	            \  }}}}t        j                  || j                        j                  }t        j                  |d
      }	d| d| d|	 d| d	}
	 | j                  |   \  }}||z  }|| j                  rdndkD  rv|j                         }| j	                  | j                  rdnd|      \  }|
d| d| z  }
|j#                  |       t%        j&                  ||      }|j#                  |       n|d | }t)        |      |k7  r>t+        j,                  d| dt)        |       d|        t        j!                  |
       |st        j!                  |
       || j.                  |<   || j0                  |<   |
d|dkD  rd|z  n
t3        |      z   z  }
t        j!                  |
        | j                  r"| j	                  d| j                  |d            n!| j	                  d| j                  |d            \  | _        y # t        $ r t        j!                  d|
|       Y w xY w# t6        $ r(}
t+        j,                  t9        |
             Y d }
~
y d }
~
ww xY w)Nr   r%   rS  r   r   HHQ8s   HHL4sr4   unknownztag:  (
) - type: )z%s - unsupported type %sr   r3   z Tag Location: z - Data Location: z/Possibly corrupt EXIF data.  Expecting to read r  z. Skipping tag 
 - value: r;   <table: %d bytes>)r   tellr   r   r   r  ranger   r   r   r   r   getr   KeyErrorloggerdebugseekr   
_safe_readrU   r&  r'  r   r   r   r   r  r   )r~   r  	tag_countir   r   countr   tagnametypnamer   	unit_sizer   r   hereoffsets                   rX   loadzImageFileDirectory_v2.load&  s   

wwy=	 == S$"3"3B":;\\#t'8'8Q'?@	I
 9% ." }} LL$*;*;B*CDgt/@/@R/HI &S% #//#tzz:??))C3gYbZy3%qI)-)<)<S)A&Iw y(115779D $DMMSsD QIV_TF2DVHMMCGGFO$//D9DGGDM;Dt9$MM--1F2Fs4yk R)),/
 LL%LL%%)c"$'S!|26)'$.d  S!]."d == S$"3"3B":;\\#t'8'8Q'?@ TYG   LL!;S#FP  	MM#c(#	s=   DL .K! F L ! LL LL 	L9L44L9c                F   | j                  dt        | j                              }g }|t        |      z   t        | j                        dz  z   dz   }d }t        | j                  j	                               D ]\  \  }}|t
        k(  rt        |      }| j                  j                  |      }t        j                  d||t        |             |t        j                  k(  xr t        |t              }|r_| j                  dk(  rd}	nd}	t!        |	|      }
| j                  |   }|j	                         D ]
  \  }}||
|<    |
j#                  |      }n+t        |t$              r|n|f} | j&                  |   | g| }t        j(                  || j*                        j,                  }|rd	nt/        j                  |d
      }d| d| d| d| d	}|dt        |      dk\  rdt        |      z  n
t1        |      z   z  }t        j                  |       |rd}nH|t        j2                  t        j4                  t        j6                  fv rt        |      }nt        |      }t        |      dk  r(|j9                  ||||j;                  dd      df        |j9                  |||| j                  d|      |f       |t        |      dz   dz  dz  z  }_ |L||   \  }}}}}|rd}t=        |      | j                  d| j?                  d|      d   |z         }|||||f||<   |D ]L  \  }}}}}t        j                  d|||t        |      t        |             || j                  d||||      z  }N |dz  }|D ]!  \  }}}}}||z  }t        |      dz  s|dz  }# |S )NrS  r4   r   zTag %s, Type: %s, Value: %sr   s   II*    s   MM *   )r   ifdr  zsave: r  r  r  r  r6   r  r   rd  rb   r3   r   z&multistrip support not yet implementedr   z%s %s %s %s %sr  s       ) r9  rU   r   sortedr   STRIPOFFSETSr   r  r  r  r   r   r  r|   r   r   r   tobytesr   rF  r   r   r   r   r   r"  r!  r  appendljustNotImplementedErrorr   )r~   r  resultentriesstripoffsetsr   r   r   r*  r   r  r)  ifd_tag	ifd_valuer   r  r  r   r  s                      rX   r  zImageFileDirectory_v2.tobytesi  s   CT]]!34#f+%DMM(:R(??!C !!4!4!67 (	3JCl""7|,,""3'CLL6S$u+NHMM)Ej.EF<<3&7C7C+Cs;s+*0,,. -&GY#,CL-{{6*",UE":0t++C0??ooc4::6;;G%e599S)+DG7)2cU*WIRuAFC<36t9?#c$i/F C LL 8J8JKKD	F4yA~S%Au1EsKLS%C1H$OP3t9q=Q.22Q(	3V #+2<+@(CeUD>)#..JJsDLLe$<Q$?&$HIE$'eUD$@GL! -4 	B(CeUDLL)3UDKdTdjj#sE5AAF	B
 	+ -4 	 (CeUDdNF4y1}%	 
 rb   c                   |j                         dk(  r/|j                  | j                  | j                  ddd      z          |j                         }| j	                  |      }|j                  |       |t        |      z   S )Nr   HL*   r%   )r  writer   r9  r  rU   )r~   r  r  r  s       rX   savezImageFileDirectory_v2.save  se    779>HHT\\DJJtR$;;<f%
F##rb   )s   II*     NNrO  rD   )3r   r   r   r   r   r   r`   r  r   setterr   r   r   r   r   r   r   r   r.  r1  r   r9  rC  rG  rR  listmapr   r  r  SIGNED_BYTEr  r  FLOATr   IFDLONG8r^  rb  rg  rj  r|  r  r  r  r  r  r  r  r  r  r1   rb   rX   r   r     sT   :x!@ /0F/0F78J 	
<	<3N`%
=78	
  	g.V,%%sM:&&^<%%sM:g.#x0sF+g.
	
" a  a  a1 1
 a  aW W a
 

 a  a 
 b!W W b
 
AFKZ$rb   r   r>  r=  r<  write_c                       e Zd ZU dZ fdZ ed       Z ed       Zded<   	 e	d        Z
d Zd	 Zd
 Zd Zd Zd Z xZS )ImageFileDirectory_v1a  This class represents the **legacy** interface to a TIFF tag directory.

    Exposes a dictionary interface of the tags in the directory::

        ifd = ImageFileDirectory_v1()
        ifd[key] = 'Some Data'
        ifd.tagtype[key] = TiffTags.ASCII
        print(ifd[key])
        ('Some Data',)

    Also contains a dictionary of tag types as read from the tiff image file,
    :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v1.tagtype`.

    Values are returned as a tuple.

    ..  deprecated:: 3.0.0
    c                2    t        |   |i | d| _        y )NT)superr   r   )r~   r   kwargs	__class__s      rX   r   zImageFileDirectory_v1.__init__  s    $)&)rb   c                    | j                   S rn   )r   r   s    rX   r   zImageFileDirectory_v1.<lambda>  s
     rb   c                    | j                   S rn   )r   r   s    rX   r   zImageFileDirectory_v1.<lambda>  s
    DMM rb   r   r   c                     | |j                         }|j                  |_        |j                  |_        |j                  |_        |S )a2  Returns an
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`
        instance with the same data as is contained in the original
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`
        instance.

        :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`

        r_   )r`   r   r   r   )clsoriginalr  s      rX   from_v2zImageFileDirectory_v1.from_v2  s<     )((&&==
rb   c                    t        | j                        }t        | j                        |_        t        | j                        |_        t        | j
                        |_        |S )a2  Returns an
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`
        instance with the same data as is contained in the original
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`
        instance.

        :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`

        r_   )r   r`   r   r   r   r   )r~   r  s     rX   to_v2zImageFileDirectory_v1.to_v2  sG     $4;;7DMM*4<<(DMM*
rb   c                >    || j                   v xs || j                  v S rn   )r   r   r   s     rX   r   z"ImageFileDirectory_v1.__contains__  r   rb   c                j    t        t        | j                        t        | j                        z        S rn   )rU   r   r   r   r   s    rX   r   zImageFileDirectory_v1.__len__  r   rb   c                j    t        t        | j                        t        | j                        z        S rn   )r0  r   r   r   r   s    rX   r1  zImageFileDirectory_v1.__iter__  r2  rb   c                8    dD ]  }| j                  |||        y N)FT)r   )r~   r   r   r   s       rX   r   z!ImageFileDirectory_v1.__setitem__  s!    ' 	2JMM#uj1	2rb   c           	        || j                   vrR| j                  |   }| j                  |   }| j                  |   \  }}dD ]  }| j	                  | || ||      |        | j                   |   }t        |t        t        f      s|f}|S r  )r   r   r   r   r   r|   r   r   )r~   r   r   r   r   r   legacyrh   s           rX   r   z!ImageFileDirectory_v1.__getitem__  s    dmm#==%D,,s#C //4MD'' Hc74v#>GHmmC #u~.&C
rb   )r   r   r   r   r   r   tagstagdata__annotations__classmethodr  r  r   r   r1  r   r   __classcell__r  s   @rX   r  r    s_    $  ./D12G M! ""<<=2
rb   r  c                  |     e Zd ZdZdZdZd fd	Zd Zed        Z	d Z
d Zd	 Zd
 Zd Z fdZd Zd Zd Z xZS )TiffImageFileTIFFz
Adobe TIFFFc                F    d | _         	 d | _        	 t        |   ||       y rn   )tag_v2r   r  r   )r~   r  filenamer  s      rX   r   zTiffImageFile.__init__3  s&    5"X&rb   c                   | j                   j                  d      }|d   dk(  r|| j                   j                  d      z  }t        |      | _        d| _        | j                  j
                  x| _        | _        d| _        | j                   | _	        g | _
        d| _        t        j                  d       t        j                  d| j                         t        j                  dt        |             | j                  d	       y)
z#Open the first image in a TIFF filer%   r   r   Nrd   z*** TiffImageFile._open ***z- __first: %sz	- ifh: %sr   )r  r  r   r  r  r   _TiffImageFile__first_TiffImageFile__next_TiffImageFile__frame_fp
_frame_pos	_n_framesr  r  r   _seek)r~   r   s     rX   _openzTiffImageFile._open<  s     ggll1oq6R<477<<?"C+C0  &*[[%5%55t{7723_dll3[$s), 	

1rb   c                2   | j                   | j                         }| j                  t        | j                               | j                   /| j                  | j                         dz          | j                   /| j                  |       | j                   S )Nr   )r  r  r  rU   r  r  )r~   currents     rX   n_frameszTiffImageFile.n_framesW  sn    >>!iikGJJs4??+,..(

499;?+ ..(IIg~~rb   c                    | j                  |      sy| j                  |       t        j                  | j                         t        j
                  j                  | j                  | j                        | _        y)z%Select a given frame as current imageN)	_seek_checkr  r
   _decompression_bomb_checkr   corenewmodeim)r~   frames     rX   r  zTiffImageFile.seeka  sQ    &

5 	''		2**..DII6rb   c                2   | j                   | _        | j                  j                          t        | j                        |k  r| j
                  sd}t        |      t        j                  d|| j                  | j
                  | j                  j                                | j                  j                  | j
                         | j                  j                  | j
                         t        j                  d| j                  j                                | j                  j                  | j                         | j                  j                  | j                  v rd| _        n| j                  j                  | _        | j
                  dk(  r
|dz   | _        t        | j                        dk(  r| j
                  dk7  | _        | xj                  dz  c_	        t        | j                        |k  r| j                  j                  | j                  |          | j                  j                  | j                         | j#                          t$        j'                  | j                        x| _        | _        || _	        | j-                          y )Nzno more images in TIFF filez9Seeking to frame %s, on frame %s, __next %s, location: %szLoading tags, location: %sr   r   )r  r  r  rU   r  r  EOFErrorr  r  r  r  r  r  r  r   r  is_animated_reload_exifr  r  r   r  _setup)r~   r  r   s      rX   r  zTiffImageFile._seekl  s   (( 	$//"e+;;3sm#LLK GGLL%OO""4;;/LL5tww||~FKKTWW%{{4??2  "kk..{{a!&4??#q(#';;!#3 LLAL3 $//"e+4 	T__U+,!3;;DKKHH48rb   c                    | j                   S )zReturn the current frame number)r  r   s    rX   r  zTiffImageFile.tell  s    ||rb   c                n    t         | j                  v r"| j                  | j                  t                  S i S )z
        Returns a dictionary containing the XMP tags.
        Requires defusedxml to be installed.

        :returns: XMP tags in a dictionary.
        )XMPr  _getxmpr   s    rX   getxmpzTiffImageFile.getxmp  s,     251Ct||DKK,-KKrb   c                   i }| j                   j                  t        j                  j                        }|r|dd dk(  rt        |dd       }t        j                  |d   dz   dz        dz  }t        |d|z   d|z          }|d|z   d|z   |z    }d|i||<   |t        j                  d|z   |z   dz        dz  d }|dd dk(  r|S )	a5  
        Returns a dictionary of Photoshop "Image Resource Blocks".
        The keys are the image resource ID. For more information, see
        https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#50577409_pgfId-1037727

        :returns: Photoshop "Image Resource Blocks" in a dictionary.
        Nr   s   8BIMr!   r   r   r  r   )	r  r  r	   BaseImageResourcesi16mathceili32)r~   blocksrh   idnr   r   s          rX   get_photoshop_blocksz"TiffImageFile.get_photoshop_blocks  s     kkoohmm::;bq'W$Qq]IIs1vzQ./!33q1urAv./26BFTM2$d^r
$))R!Vd]a$781<>? bq'W$ rb   c                p    | j                   r| j                  r| j                         S t        |          S rn   )tileuse_load_libtiff_load_libtiffr  r  )r~   r  s    rX   r  zTiffImageFile.load  s-    99..%%''w|~rb   c                   | j                   s\d| _        | j                  j                          | j	                         }t
        j                  D ]  }||vr|j                  |        t        j                  | d       t        j                  j                  | j                  v r&| j                  t        j                  j                  = y y )NT)in_place)r  !_close_exclusive_fp_after_loadingr  r  getexifr   TAGS_V2_GROUPSget_ifdr   exif_transposer	   r  Orientationr  )r~   exifkeys      rX   load_endzTiffImageFile.load_end  s     59D2 GGLLN <<>D.. "d?S!"
 	t4==$$3HMM556 4rb   c                   t         j                   j                  |        | j                          t        | j                        dk(  sd}t        |      | j                  d   d   }t        | j                  d   d         }	 t        | j                  d      xr | j                  j                         }t        | j                  d      r| j                  j                          |r||d<   t        j                  | j                  d	t        |      | j                        }	 |j                  | j                   |       | j$                  xr | j&                   }t        | j                  d      rBt(        j+                  d       |j-                  | j                  j/                               \  }}	n|rGt(        j+                  d       |s| j                  j1                  d       |j-                  d      \  }}	n\t(        j+                  d       | j                  j1                  d       |j-                  | j                  j3                               \  }}	g | _        d| _        | j7                          |r!| j                  j9                          d| _        |	dk  rt        |	      t         j                   j                  |       S # t
        $ r d}Y w xY w# t"        $ r}d
}t        |      |d}~ww xY w)zWOverload method triggered when we detect a compressed tiff
        Calls out to libtiffr   zNot exactly one tiler   r   filenoflushFr   libtiffzCouldn't set the imageNgetvaluez5have getvalue. just sending in a string from getvaluez3have fileno, calling fileno version of the decoder.s   fpfpz+don't have fileno or getvalue. just reading)r
   r  load_preparerU   r  r  r  r   r  r'  r(  _getdecoderr  r   decoderconfigsetimager   r%  _exclusive_fpr  r  r  rf  r*  r  r  readonlyr%  close)
r~   r   extentsr   r  decodereclose_self_fpr  errs
             rX   r  zTiffImageFile._load_libtiff  sN    	499~"(C#, ))A,q/DIIaLO$

	(+@0@B tww( DG##IIy%+t/A/A
	&TWWg.
 **C43C3C/C477J' LLPQ^^DGG$4$4$67FAsLLNO Q^^G,FAs LLFGGGLLO^^DGGLLN3FAs	GGMMODG7#,{{%%q  	 B	  	&*C#,A%	&s+   A"K "K KK	K4!K//K4c                p   d| j                   v rd}t        |      t        | j                   j                  t        d         | _        | j                   j                  t        d      | _        | j                   j                  t        d      }| j
                  dk(  rd}| j                   j                  t        d      }t        j                  d       t        j                  d| j
                         t        j                  d	|       t        j                  d
| j                         t        j                  d|       t        j                  d| j                  j                  t                     t        | j                   j                  t                    }t        | j                   j                  t                     }||f| _        t        j                  d| j$                         | j                   j                  t&        d      }t)        |      dkD  r"t+        |      t-        |      cxk(  rdk(  rn nd}| j                   j                  t.        d      }| j                   j                  t0        d      }|dv rd}	n
|dk(  rd}	nd}	|	t)        |      z  }	t)        |      }
| j                   j                  t2        | j
                  dk(  r|dv rdnd      }|t4        kD  r#t        j7                  d|       d}t9        |      ||
k  r|d| }n||
kD  r
|
dk(  r||z  }t)        |      |k7  rd}t9        |      | j                   j:                  |||||f}t        j                  d|       	 t<        |   \  | _        }t        j                  d|       t        j                  d| jB                         | j
                  | jD                  d<   | j                   j                  tF        d      }| j                   j                  tH        d      }|r|r| j                   j                  tJ              }|dk(  r||f| jD                  d <   nS|dk(  r|d!z  |d!z  f| jD                  d <   n6|#||f| jD                  d <   ||f| jD                  d"<   n||f| jD                  d"<   dx}x}}g | _&        tN        xs | j
                  d#k7  | _(        | jP                  r|dk(  r5|dd dz   |dd z   }t        j                  d|       t<        |   \  | _        }|d$k(  rd%}d&|v r|jS                  d&d'      }d(|v r|jS                  d(d'      }|dk(  r | j
                  d)k(  r| j                  dk(  rd*}|| j
                  d+| j                   jT                  f}| jL                  jW                  d,dd||fd|f       ntX        | j                   v stZ        | j                   v rutX        | j                   v rC| j                   tX           }| j                   j                  t\        |      }| j$                  d   }nQ| j                   tZ           }| j                   j                  t^              }| j                   j                  t`              }|D ]  }||z   |kD  r|tc        |      z  d-z  }nd}|}| j                  dk(  r
||   }||	z  }|t        |      df}| jL                  jW                  | j
                  ||t-        ||z   |      t-        ||z   |      f||f       ||z   }|| j$                  d   k\  sd||z   }}|| j$                  d   k\  sdx}}|dz  } n"t        j                  d.       d}t9        |      td        | j                   v r | j                   td           | jD                  d/<   | jB                  d0v rW| j                   tf           D cg c]  }ti        |d1z         }}tk        jl                  d2d3jo                  |            | _8        yy# t@        $ r(}t        j                  d       d}t9        |      |d}~ww xY wc c}w )4z-Setup this image object based on current tagsi  z+Windows Media Photo files not yet supportedr   r   r"   r!   z*** Summary ***z- compression: %sz - photometric_interpretation: %sz- planar_configuration: %sz- fill_order: %sz- YCbCr subsampling: %sz
- size: %sr0   r1   )r   r!   r%   r   r   r   )r   r!   z.More samples per pixel than can be decoded: %sz#Invalid value for samples per pixelNzunknown data organizationzformat key: %sz- unsupported formatzunknown pixel modez- raw mode: %sz- pil mode: %scompressionr   dpigRQ@
resolutionr   r5   I;16Nz;16Bz;16Nz;16Lr$   rB   Fr)  r%   z- unsupported data organizationicc_profilerN   rO   r   RGB;Lrb   )9r  r  COMPRESSION_INFOr  COMPRESSION_compressionPLANAR_CONFIGURATION_planar_configurationPHOTOMETRIC_INTERPRETATION	FILLORDERr  r  r   YCBCRSUBSAMPLINGr	  
IMAGEWIDTHIMAGELENGTH_sizer   SAMPLEFORMATrU   rr   rq   BITSPERSAMPLEEXTRASAMPLESSAMPLESPERPIXELMAX_SAMPLESPERPIXELerrorr   r`   	OPEN_INFO_moder  r  r  X_RESOLUTIONY_RESOLUTIONRESOLUTION_UNITr  READ_LIBTIFFr  r  r  r  r  TILEOFFSETSROWSPERSTRIP	TILEWIDTH
TILELENGTHsum
ICCPROFILECOLORMAPr   r   r   rN  palette)r~   r   photo	fillorderxsizeysizesample_format	bps_tupleextra_tuple	bps_countbps_actual_countsamples_per_pixelr$  rawmoder4  xresyresresunitxylayerro  offsetsrW  wr  stridetile_rawmoderV  r]  s                                 rX   r  zTiffImageFile._setup&  sW    T[[ ?C#, -T[[__[!-LM%)[[__5I1%M"  :A> +EKKOOIq1	&'($*;*;<7?143M3MN'3.=M0NO DKKOOJ/0DKKOOK01E\
\499-d;}!c-&8C<N&SRS&S !MKKOOM48	kkoolB7IIaZIIS%%	y> KKOO""k1evoA1

 22LL@BS 8Cc""// ""4#45I!116F!6K "$55Iy>..-Cc"" KK
 	%s+	*"+C.DJ 	%w/%tyy1#'#4#4		- {{|Q/{{|Q/Dkkooo6G!|$($<		% A$(4K#=		% $($<		%  +/*		,'*.*		,' A	 , J0A0AU0J   A~"1gns12w.-s3 '0n#
G
 & ! !//&&9 !//&&9
 
%%/..!3 $++UDKK4F4FGAIIi!Qu)=q!DET[[(K4;;,Ft{{*++l3KKOOL%8IIaL ++k2KKOOI.KKOOJ/! #q55=Y/!3FF&--2#*5>Li'F!3v;2		  ))As1q5%0#a!eU2CD	 E		!$a!eqADIIaL( !	A
7#: LL:;-Cc"" $'+{{:'>DIIm$ 99#-1[[-BCr!s(|CGC'++GSXXg5FGDL $A  	*LL/0&Cc")	*B Ds   ._? <`3?	`0#`++`0)NN)r   r   r   formatformat_descriptionr  r   r  r   r  r  r  r  r  r  r  r%  r  r  r  r  s   @rX   r  r  .  se    F%(-%'6  	7'RL*
7*S&j^Hrb   r  r2   r3   rA   rN   rO   r8   r?   r5   r9   r<   r=   rB   rE   rC   rP   YCbCrrS   r@   r7   r:   r>   )r:   r>   c                V   	 t         | j                     \  }}}}}}t	        |      }| j
                  }| j                  }	 |d   }|d}n|dk(  rd}n|dk(  rd	}t        xs |dk7  }d
|t        <   | j                  d   |t        <   | j                  d
   |t        <   d|v r|d   }nCd|v r=|d   }t        |t               r*t#        j$                         }|j'                  |       |}ni }t(        j+                  dt-        |             t        |t.              r|j1                         }|D ]t  }t        |t"        j$                        r'|t2        j4                  v r|j7                  |      ||<   n|j                  |      ||<   	 |j8                  |   |j8                  |<   v t=        | d      rlt>        t@        tB        tD        tF        tH        fD ]I  }|| jJ                  v s| jJ                  |   ||<   | jJ                  j8                  |   |j8                  |<   K |j                  d| j                  j                  d            }|r	||tL        <   tN        dft@        dftB        dft@        dftB        dft>        dftP        dftR        dftT        dftV        dff
D ]  \  }}||v s||   ||<    |j                  d      }|r!d|t>        <   |d   |t@        <   |d
   |tB        <   |dk7  r)||tX        <   t[        |      d
k7  rt[        |      |t\        <   |	||t^        <   |d
k7  r	||t`        <   tb        |vr
||tb        <   n| j                  dv r|tb           dk(  r| j                  dk(  rj| je                         }|j'                         }tg        |jh                        D ]/  }tg        |jj                        D ]  }|||f   dk(  rdnd|||f<    1 |} ntm        jn                  |       } | j                  d v rs| jp                  js                  d!d"      }g }t[        |      d#z  }tg        d#      D ]0  }||||z  ||d
z   z   D cg c]  }|d$z  	 c}z  }|dgd$|z
  z  z  }2 ||tt        <   |t           |t           } }t[        |      ||d   z  d%z   d&z  z  }!tv        |vr[|rG|j                  d'tx              }"|!dk(  rd
nt{        |"|!z  |       }#|dk(  rt{        |#d%z   d&z  d&z  |       }#n| }#|#dk(  rd
}#|#|tv        <   |!dk(  rd
n|!|tv           z  }$| |tv           z   d
z
  |tv           z  }%|$d(k\  r!t2        j|                  |j8                  t~        <   |$f|%d
z
  z  |!| z  |$|%d
z
  z  z
  fz   |t~        <   t        tg        d|$|%z  |$            |t        <   t        j                  |d
      |t        <   | j                  d)k(  r6t        d*t        d+ij                         D ]  \  }&}'|j                  |&|'        t        t        t        t        g}(|rd,|v rG|d,   })t        |)t              r
|)dk  s|)d-kD  rd.}
t        |
      |dk7  rd/}
t        |
      |)|t        <   t(        j+                  d0       t(        j+                  d1t        |j                                      d}*t=        |d2      r5	 |j                  d       t        j                  |j                               }*i }+|(t        t~        t        t        t        gz  }(tX        |d   i},i }-t=        | d3      r| j                  j1                         }-i t        | di       |-}.t`        |.v r|.t`        = t        j                  |j                         |.j                               D ]  \  }&}'|&t2        j                  vrt        t"        j                  d4d5      s4|&|j8                  v r|j8                  |&   |+|&<   nGt        |'t        t        t        t         f      svt3        j                  |&      j                  }/|/r|/|+|&<   |&|,vs|&|(vst        |'t              r|'j                  d6d7      d8z   |,|&<   t        |'t              rt        |'      |,|&<   |'|,|&<    t`        |,v r(t[        |,t`                 d
k(  r|,t`           d   |,t`        <   t(        j+                  d9t        |,j                                      | j                  d:v rd;}t-        |,j                               }0|0j                          |||*||0|+f}1t#        j                  | j                  d<|1|      }	|	j                  | jp                  d=| j                  z          	 |	j                  d>      d
d  \  }2}3|*s|j                  |3       |2rn.|*r	 t        j                  |*       |2dk  rXd?|2 d@}
t        |
      |(D ]  }&||&=  |j                  |      }4t        j                  | |dd=| j                  z   |4||!d
ffg       dA|v r|| _k        y y # t        $ r!}	d| j                   d}
t        |
      |	d }	~	ww xY w# t        $ r1 | j                  j                  d      }t        |t              rd }Y 
"w xY w# t:        $ r Y 	Nw xY wc c}w # t        j                  $ r Y w xY w# t        $ r Y w xY w)BNzcannot write mode z as TIFFr_   r8  r   r"   r$   r*   r&   r   r   tiffinfor#  zTiffinfo Keys: %sr  r<  descriptionr:  x_resolutiony_resolutionresolution_unitsoftware	date_timeartist	copyrightr9  r   r0   )r2   r3   r2      r=  rB   r>  r   r   r#   r%   
strip_sizer   ru  )r   r   )r   r     r  r  r  qualityd   zInvalid quality settingz5quality setting only supported for 'jpeg' compressionzSaving using libtiff encoderz	Items: %sr'  r   libtiff_support_custom_tagsFr  r  rd  zConverted items: %s)r7   r5   r;  r)  rF   i @  zencoder error z when writing image file_debug_multipage)l	SAVE_INFOr  r  r  r   encoderinfoencoderconfigr  r  r|   r	  WRITE_LIBTIFFrB  r   rG  rH  r   r
   Exifr  r  r  r  r  r  r   r  r   r   r   r   rT  rR  rS  IPTC_NAA_CHUNKPHOTOSHOP_CHUNKr	  r  r[  IMAGEDESCRIPTIONSOFTWARE	DATE_TIMEARTIST	COPYRIGHTrK  rU   rM  rL  rJ  rD  copyr  heightwidthr   invertr   
getpaletter\  rW  
STRIP_SIZErq   r  STRIPBYTECOUNTSr   r  COMPRESSION_INFO_REVr@  rF  REFERENCEBLACKWHITEr   
setdefaultrX  rY  rV  TILEBYTECOUNTSr%  JPEGQUALITYr  r  osdupr'  ioUnsupportedOperationTRANSFERFUNCTIONSUBIFDr   r   	itertoolschainLIBTIFF_COREr  r}   r   r   r  r#  rf   sort_getencoderr.  r  r1  r  r   _saver  )5r   r  r  rh  r`   r^  rs  bitsextrar4  r   r  r  r  r8  r)  r  r#  r$  iccr   r9  inverted_impxrm  rl  lutcolormapcolorsr  r  rp  rW  rq  im_strip_sizerows_per_stripstrip_byte_countsstrips_per_imager   r   	blocklistr  r  typesatts
legacy_ifdsupplied_tagsr  r  ro  errcoder   r  s5                                                        rX   r  r  '  s
   "6?6H3e
  v
.C..K$$M!-0 		#		&*3{e3G !"CggajC
OwwqzC [ :&	;	6"dE"::<DIIdOD
LL$d4j1$-.zz| dEJJ'C83J3J,J||C(CHxx}CH	#||C0CKK r8 
 
	:C bii99S>C#%99#4#4S#9C 
	: //-])C
DC
J 
=)	|$	|$	~&	~&	+,	:	K 		K  )	T ;"4(CH) //%
 C
 OFLFLt|!Mt9>#&t9C !L{"L!,*/&'	J	3'A#Ba#G77c>'')K!!#B;--. ={001 =A$&q!tHOqBq!tH== B$B	ww+eeug.SQq 	-A#fqj6QU;K*LMQSMMHsV|,,H	- !Hz?C,qAY1tAw;?q01F3'OOL*EM"(A+Q3}7NPQ3RNf$!$~'9a&?1%Da!HNQN*L#q[fs<7H.HC--1c,6GGE!'/}}O$-/3Ca3GH
&*:Q*>??L C a"%557HIC ,//Q?C	ww'f!=
 %'	'JC NN3&		' J^DI#!),Ggs+w{gm/ o%f$M o%&C34[&"562x 
ffRYY[)
  	
 	
	 tAw' 
2uJ D72x4C
C=(l+#//#))+}7J7J7LM 	&JC
 (///uzz+H%P#++%!$S!1E#J$US%e,DE#??3/44D%)c
$3i#7eS) %Wi @5 HDI{3 %eDI %DI/	&2 4C\(:$;q$@!%l!3A!6D*F4::<,@A 77''G
 DJJL!		k3$>bggy!]C	

255&277*+HHY/3MGT   Q;"7)+CDC#,  	CC	"eVbgg-v7KLM	

 [(! )A	  ""277)84cl!"  ggkk-0k3'K	T  		R Nt ** r  se   h h/ i,:i<4j j 	h,h''h,/6i)(i),	i98i9jj	j('j(c                      e Zd Zg dZh dZddZd Zd Zd Zd Z	d Z
d	 Zej                  fd
Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZddZy)AppendingTiffWriter)r   r   r   r   r   r%   r   r   r   r   r%   r   r%   r   r   r   r%   >       	     r   r   c                    t        |d      r|| _        d| _        n$|| _        d| _        	 t	        ||rdnd      | _        | j                  j                         | _        | j                          y # t
        $ r t	        |d      | _        Y Lw xY w)Nr  FTzw+bzr+b)	r   r   close_fpr   openr  r  	beginningsetup)r~   fnr  s      rX   r   zAppendingTiffWriter.__init__m  sy    2vDF!DMDI DM)b3%E: 

  )b%)s   A0 0BBc                   | j                   j                  | j                  t        j                         d | _        d| _        | j                   j                  d      x| _        }|sd| _	        y d| _	        |dk(  r| j                  d       n$|dk(  r| j                  d       nd	}t        |      | j                          | j                          y )
Nr   r   TFr[   r   rZ   r   zInvalid TIFF file header)r   r  r  r  SEEK_SETwhereToWriteNewIFDOffsetoffsetOfNewPager  IIMMisFirst	setEndianRuntimeErrorskipIFDsgoToEnd)r~   iimmr   s      rX   r  zAppendingTiffWriter.setup{  s    DNNBKK0(,% 66;;q>)	DDL= NN3]"NN3,Cs##rb   c                   | j                   ry | j                  j                  | j                         | j                  j	                  d      }|sy || j
                  k7  rd}t        |      | j                         }|| j                  z  }| j                  j                  | j                         | j                  |       | j                  j                  |       | j                          y )Nr   z1IIMM of new page doesn't match IIMM of first page)r  r   r  r  r  r  r  readLongr  	writeLongfixIFD)r~   r  r   
ifd_offsets       rX   finalizezAppendingTiffWriter.finalize  s    << 	D(()vv{{1~499ECs##]]_
d***
D112z"Jrb   c                D    | j                          | j                          y rn   )r  r  r   s    rX   newFramezAppendingTiffWriter.newFrame  s    

rb   c                    | S rn   r1   r   s    rX   	__enter__zAppendingTiffWriter.__enter__  s    rb   c                <    | j                   r| j                          y)NF)r  r1  )r~   exc_type	exc_value	tracebacks       rX   __exit__zAppendingTiffWriter.__exit__  s    ==JJLrb   c                P    | j                   j                         | j                  z
  S rn   )r   r  r  r   s    rX   r  zAppendingTiffWriter.tell  s    vv{{}t3333rb   c                    |t         j                  k(  r|| j                  z  }| j                  j	                  ||       | j                         S rn   )r  r  r  r   r  r  )r~   r  whences      rX   r  zAppendingTiffWriter.seek  s<    R[[ d***FFF#yy{rb   c                >   | j                   j                  dt        j                         | j                   j	                         }d|dz  z
  }d|cxk  rdk  r'n n$| j                   j                  t        |             | j                   j	                         | _        y )Nr   r6   )r   r  r  SEEK_ENDr  r  r   r  )r~   pos	pad_bytess      rX   r  zAppendingTiffWriter.goToEnd  sj    Ar{{#ffkkm rM	y2FFLLy)*#vv{{}rb   c                    || _         | j                   dz   | _        | j                   dz   | _        | j                   dz   | _        y )Nr3   rS  HHL)endianlongFmtshortFmt	tagFormat)r~   r  s     rX   r  zAppendingTiffWriter.setEndian  s9    {{S(c)u,rb   c                &   	 | j                         }|dk(  r#| j                  j                         dz
  | _        y | j                  j	                  |       | j                         }| j                  j	                  |dz  t        j                         )Nr   r   r4   )r  r   r  r  r  	readShortr  SEEK_CUR)r~   r  num_tagss      rX   r  zAppendingTiffWriter.skipIFDs  sl    JQ040A-FFKK
#~~'HFFKK2r{{3 rb   c                8    | j                   j                  |      S rn   )r   r  ra  s     rX   r  zAppendingTiffWriter.write  s    vv||D!!rb   c                |    t        j                  | j                  | j                  j	                  d            \  }|S )Nr   )r4  r5  r  r   r  ri  s     rX   r  zAppendingTiffWriter.readShort  s)    ==A?rb   c                |    t        j                  | j                  | j                  j	                  d            \  }|S r]   )r4  r5  r  r   r  ri  s     rX   r  zAppendingTiffWriter.readLong  s)    ==tvv{{1~>rb   c                    | j                   j                  dt        j                         | j                   j	                  t        j                  | j                  |            }||dk7  rd| d}t        |      y y )Nr   wrote only  bytes but wanted 4	r   r  r  r  r  r4  r8  r  r  r~   r   bytes_writtenr   s       rX   rewriteLastShortToLongz*AppendingTiffWriter.rewriteLastShortToLong  h    B$V[[u%EF$!);.ABCs## *<$rb   c                    | j                   j                  dt        j                         | j                   j	                  t        j                  | j                  |            }||dk7  rd| d}t        |      y y )Nr  r   r   bytes but wanted 2)	r   r  r  r  r  r4  r8  r  r  r  s       rX   rewriteLastShortz$AppendingTiffWriter.rewriteLastShort  sh    B$V[[%FG$!);.ABCs## *<$rb   c                    | j                   j                  dt        j                         | j                   j	                  t        j                  | j                  |            }||dk7  rd| d}t        |      y y )Nr   r  r  r  r  s       rX   rewriteLastLongz#AppendingTiffWriter.rewriteLastLong  r  rb   c                    | j                   j                  t        j                  | j                  |            }||dk7  rd| d}t        |      y y )Nr   r  r  )r   r  r4  r8  r  r  r  s       rX   
writeShortzAppendingTiffWriter.writeShort  sR    V[[%FG$!);.ABCs## *<$rb   c                    | j                   j                  t        j                  | j                  |            }||dk7  rd| d}t        |      y y )Nr   r  r  )r   r  r4  r8  r  r  r  s       rX   r  zAppendingTiffWriter.writeLong  sR    V[[u%EF$!);.ABCs## *<$rb   c                X    | j                          | j                  j                          y rn   )r  r   r1  r   s    rX   r1  zAppendingTiffWriter.close	  s    rb   c                &   | j                         }t        |      D ]r  }t        j                  | j                  | j
                  j                  d            \  }}}| j                  |   }||z  }|dk  }|s0| j                         }	|	| j                  z  }	| j                  |	       || j                  v r| j
                  j                         }
|r9| j                  ||dk(  |dk(         | j
                  j                  |
dz          nP| j
                  j                  	       | j                  ||dk(  |dk(         | j
                  j                  |
       d x}	}
E|sI| j
                  j                  dt        j                          u y )Nr%   r   r   )isShortisLong)r  r  r4  r5  r  r   r  
fieldSizesr  r  r  Tagsr  
fixOffsetsr  r  r  )r~   r  r  r   
field_typer  
field_size
total_sizeis_localr  cur_poss              rX   r  zAppendingTiffWriter.fixIFD  sP   >>#x 	,A%+]]4>>466;;q>%R"CU4J#e+J!QH$...$$V,dii&&++-OO
a*PQ/ $  FFKK!,FFKK'OO
a*PQ/ $  FFKK(#''Ar{{+=	,rb   c                .   |s|sd}t        |      t        |      D ]  }|r| j                         n| j                         }|| j                  z  }|r|dk\  r|dk7  rd}t        |      | j                  |       | j                  j                  dt        j                         | j                  t        j                         | j                  j                  dt        j                         |r| j                  |       | j                  |        y )Nz offset is neither short nor longr   r   znot implementedir%   )r  r  r  r  r  r  r   r  r  r  r  r   r  r  r  )r~   r  r  r  r   r  r  s          rX   r  zAppendingTiffWriter.fixOffsets0  s    v4Cs##u 	-A)0T^^%dmmoFd***F6U?A:+C&s++ ++F3C-.Ar{{+%%f-$$V,%	-rb   N)F)FF)r   r   r   r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r1  r  r  r1   rb   rX   r  r  O  s    J(D2.

4 #%++ --	4"$$$$$!,F-rb   r  c                r   | j                   j                         }| j                  }t        |j	                  dg             }t        | d      s|st        | ||      S | j                         }	 t        |      5 }| g|z   D ]y  }||_         ||_        t        |d      sd}	n|j                  }	t        |	      D ]@  }
|j                  |
       |j                          t        |||       |j                          B { 	 d d d        | j                  |       y # 1 sw Y   xY w# | j                  |       w xY w)Nappend_imagesr  r   )r  r  r  r  r  r   r  r  r  r  r  r  r  r  )r   r  r  r  r  r  cur_idxtfimsnfrrA  s              rX   	_save_allr  J  s   ..%%'K$$M"=>M2z"=RX&&ggiG $ 	"tm+ ""-$1!sJ/C,,C : "CHHSMHHJ#r8,KKM	""	" 		" 	" 	s%   .D# 9BD=D# D D# #D6z.tifz.tiffz
image/tiff)n
__future__r   r  r  loggingr  r  r4  r&  collections.abcr   	fractionsr   numbersr   r    r	   r
   r   r   r   r   _binaryr   r  r   r  r   r   	getLoggerr   r  rU  r  IFD_LEGACY_APIr  r   r   rG  rH  rK  r@  rD  rE  r  r  rM  rW  r  rR  rS  rB  rT  r  r  r  r  	PREDICTORr\  rX  rY  rV  r  r  rL  rJ  
JPEGTABLESrF  r  r  r  r  r[  EXIFIFDr	  r  IMAGEJ_META_DATA_BYTE_COUNTSIMAGEJ_META_DATAr?  r   r  rP  rr   rN  r^   ra   rl   ru   r   rF  rf   r   rA  r   r  setattrr  ImageFileDirectoryr  r  r  r  r  register_openrs  register_saveregister_save_allregister_extensionsregister_mime)kr  s   00rX   <module>r3     s   R # 	    	   *  $ J J ! !  			8	$ 


 
  	   				
	
  	

	  %  u | x	
 x z { v  
= 
: 
 
> 
= 
?  
6!" 
6#$ 
6% * *:)?)?)ABA1B z D!T2z D!T2	z
 D!T2z D!T2z D!T2
z D!T2
z D!T2z D!T2z D!T2z D!T2z D!T2z D!T2z D!T2z  D!T2!z" D!T2#z$ D!T2%z& D!T2'z( D!T2)z* D!T2+z, D!T2-z. D!T2/z0 D!T21z2 D!T23z4 D!T25z6 D!T27z8 D!T29z: D!T2;z< D!T2=z> D!T2
?z@ D!T2
AzB D!T2
CzD D!T2
EzF D!T2GzH D!T2IzJ D!UB!1KzL D!UB!1MzN D!UB!1OzP D!UB!3QzR D!UB!2SzT D!UBUzV D!UBWzX D!UBYzZ D!UB[z\ D!UB]z^ D!UB_z` D!UBazb D!UBczd D!UBezf D!VT"Lgzh D!VT"Lizj D!Y#^kzl D!Y#^mzn D!Y#%5ozp D!Y#%5qzr D!\2&(8szt D!\2&(8uzv D!\4(*:wzx D!\4(*:yzz D!_f-/@{z| D!_f-/@}z~ D!'35Gz@ D!'35GAzB D!\4(*:CzD D!\4(*:EzF D!_f-/@GzH D!_f-/@IzJ D!'35GKzL D!'35GMzN D!\4(*:OzP D!\4(*:QzR D!_f-/@SzT D!_f-/@UzV D!'35GWzX D!'35GYzZ D!\6*,<[z\ D!\6*,<]z^ D!\2&(:_z` D!\2&(:azb D!%r*,@czd D!%r*,@ezf D!%t,.Bgzh D!%t,.Bizj D!%t,.Bkzl D!%t,.Bmzn D!%t,.Bozp D!%t,.Bqzr D!T2szt D!T2uzv D!T2wzx D!T2yzz D!T2{z| D!T2}z~ D!T2z@ D!T2AzB D!T2CzD D!T2EzF D!T2GzH D!T2IzJ D!T2
KzL D!T2
MzN D!VT"LOzP D!VT"LQzR D!T2D!T2D!\2&(8D!\2&(8D!_d+->D!_d+->D!'02DD!'02DD!%r*,@D!T2
D!T2
 D!Y#_D!Y#_D!Y#^D!Y#^sz	x AyAA "%" '( 'DG$N G$T (6  $(7  % JIC<<S!D!7T>>#3Fq3IJ!8d?OC4HIJ OS$X1 Xx + VHI'' VH@ #r1at	$ #r1at	$	
 	4Q61
% #r1at	$ 	4Q61
% '2q!UD	) VRAud+ gr1a- '2q!UD	) 
E2q!Y- VRA|Q/ VRA|Q/ VRA|T2  gr1aD1!" 
E2q!Y-#$ xQ5$/%& gr1a-'( Q5$/Q5$/+	2e"P	x- x-v>   M((- A   M((% 0   ,,i 8   -..0A B   M((, 7G? Cs   ]