m
@c           @   s6  d  d d f d d d f d d d f d d	 d
 f d d d f d d d f d d d f d d d f d d d f d d d f d d d f f Z  h  d d f <d d f <d d  f <d! d" h  d d# <d$ d% <f <d& d' f <d( d) f <d* d+ f <d, d- f <d. d/ f <d0 d1 f <d2 d3 f <d4 d5 f <d6 d7 f <d8 d9 f <d: d; f <d< d= f <d> d? f <d@ dA f <dB dC h  d dD <d dE <dF dG <f <dH dI f <dJ dK f <dL dM f <dN dO f <dP dQ f <dR dS f <dT dU f <dV dW f <dX dY f <dZ d[ f <d\ d] f <d^ d_ f <d` da f <db dc f <dd de f <df dg f <dh di f <dj dk f <dl dm f <dn do f <dp dq f <dr ds f <dt du f <dv dw h  d  dx <d dy <d dz <dF d{ <d d| <d} d~ <d$ d <d d <d d <f <d d f <d d f <d d f <d d f <d d d   f <d d f <d d f <d d h  d  d <d d <d d <dF d <d d <d} d <d$ d <f <d d f <d d f <d d f <d d f <d d f <d d f <d d f <d d h  d  dx <d d <d d <dF d <d d <f <d d h  d  d <d d <d d <dF d <d d <d d <d d <d d <d d <d d <d d <d d <f <d d h  d  d <d d <d} d <d d <d d <d d <d d <d d <d d <d d <d d <d d <d d <f <d d f <d d f <d d d   f <d d f <d d f <d d f <d d d   f <d d f <d d f <d d f <d d f <d d f <d d f <d d f <d d f <d d f <d d f <d df <ddf <ddh  dF d<f <ddh  d d	<f <Z h  d d
f <d df <ddf <ddf <ddf <Z h  d  df <d df <d df <dF df <d df <d} df <d$ df <d df <d df <d df <d df <ddf <dd f <d d!f <d"d#f <d d$f <d d%f <d d&f <d d'f <d d(f <d d)f <d d*f <d d+f <d,d-f <d d.f <d d/f <d0d1f <Z h  d d2f <dF d3f <d d4f <d} d5f <d$ d6f <d d7f <d d8f <d d9f <d:d;f <d<d=f <d>d?f <d@dAf <dBdCh  d  dD<d dE<dV dF<dGdH<dIdJ<f <dKdLh  dMdN<dOdP<dQdR<d  dS<d dT<d dU<f <dVdWf <d dXf <Z h  dF d4h  d dY<d dZ<dF d[<d d\<d} d]<d$ d^<f <d d3h  d d_<d d`<f <d} d;h  d  da<d db<d dc<dF dd<d de<f <d$ dfh  d  dg<d dh<d di<d} dj<f <d dkh  d  dl<d dm<d d <dF dn<d d <d} do<d$ dp<f <Z dq  Z h  d drf <dV dse f <dX dth  d du<d dv<dF dw<f <dZ dxh  d  da<d dx<f <dydzf <d{d|f <d}d~f <ddd  f <ddXf <Z h  d dh  d d<d d<dF d<d d<d} d<f <d d4h  d d<d da<dF d<f <dF dh  d dx<dF d<d d<d} d<f <d dh  d dl<d d<dF d <d d<f <d} dh  dd<d da<d d<f <d$ df <d dkh  d dl<d d <dF d <d d <d} d<ddy <f <ddh  d  da<d d<d d<f <ddh  d  da<d d<d d<f <d dLh  d  da<d d<d d<f <d dfh  dda<dda<dd<dd<dd<dd<f <Z h  d  dd  f <dd4f <ddh  d d<d d<dF da<d d<d} d<f <ddkh  d  dl<d d <dV do<dGd<dd<dd<dIdn<dd<f <dd_h  d  da<d d<dV d<f <ddh  d  da<d d<dV d<f <ddh  d  dl<d d<d d <dF d<f <ddf <ddxh  d  d <d d<f <dd7h  d  dl<d dy <f <ddh  d  d <d d<f <ddh  d  dl<d d<d d<d d<d} d<d$ d<d d<dV d<dGd<f <ddh  d  d <d d<f <ddh  d  d <d d<f <ddh  d  d <d d<f <ddh  d  d <d d<f <Z	 h  d$ df <d df <d df <d df <Z
 h  d dh  d dx<d da<f <d df <dF d4h  d da<dF d<d} d<f <d dh  d  d<d dl<d d<dF d<d d<d} d<d$ d<d d<f <d} dh  d  d<d d<f <d d7h  d  d<d d<d d<dF d<d d<d} d<d$ d<f <d dh  d  d<d d<d d<f <ddh  d  d<d dy <d d<dF d<d d<d} d<d$ dN<d d<d d<d d<d d<dd<f <ddzh  d  d<d d<d d<f <d dh  dd<d  da<d d<f <d"dLh  dd<d  da<d d<f <d dh  dd<d  da<d d<f <d dh  d  d<d dl<d d<d d<d d<d d<f <d d h  dF d<d d<d} d<f <d dh  d  dy <d dl<dF d<d d<f <d dh  dd<dd<ddJ<ddD<d dH<f <d dh  d  d<d d<d d<dF d<d dy <d} d<f <d,df <d df <d d	f <d
dh  d  d<d d <f <d dh  d"d<d d<dd<d d<d d<f <d d7h  d  d<d d<f <Z h  d dkh  d  dl<d d<d do<dF d <d d <d} d <d$ d<f <d df <d"df <d dh  dd<dd<dd<dd<dd <d!d"<d#d$<d%d&<d  d'<dd(<d d)<d d*<d d+<d,d-<d.d/<d0d1<dd2<f <d d f <Z d3  Z d4  Z d5  Z d f  d6    YZ d7f  d8    YZ d9f  d:    YZ d  d; Z e d<j od=k Z e e i  d j  o! d>e i d  GHe i d   n xEe i d D]6Z y e e d? Z Wn e Gd@GHHqn Xe dAGHe e  Z e o dBGHqn e i   Z e i   x e D] Z  e  drdCf j o qjn e  e e  i! d d d d d
 d f j o qjn y, dDe  e  e e  i! d e e  i" f GHWn  dEGe  GdFGe e  GdFGHn XqjWe i# dr o	 dGGHn HqWn d=S(H  i    t   Xt   Proprietaryi   t   Bt   Bytet   At   ASCIIi   t   St   Shorti   t   Lt   Longi   t   Rt   Ratiot   SBs   Signed Bytet   Ut	   Undefinedt   SSs   Signed Shortt   SLs   Signed Longt   SRs   Signed Ratioi   t
   ImageWidthi  t   ImageLengthi  t   BitsPerSamplei  t   Compressions   Uncompressed TIFFi   s   JPEG Compressedi  t   PhotometricInterpretationi
  t	   FillOrderi  t   DocumentNamei  t   ImageDescriptioni  t   Makei  t   Modeli  t   StripOffsetsi  t   Orientationi  t   SamplesPerPixeli  t   RowsPerStripi  t   StripByteCountsi  t   XResolutioni  t   YResolutioni  t   PlanarConfigurationi(  t   ResolutionUnits   Not Absolutes   Pixels/Inchi   s   Pixels/Centimeteri-  t   TransferFunctioni1  t   Softwarei2  t   DateTimei;  t   Artisti>  t
   WhitePointi?  t   PrimaryChromaticitiesiV  t   TransferRangei   t   JPEGProci  t   JPEGInterchangeFormati  t   JPEGInterchangeFormatLengthi  t   YCbCrCoefficientsi  t   YCbCrSubSamplingi  t   YCbCrPositioningi  t   ReferenceBlackWhitei  t   CFARepeatPatternDimi  t
   CFAPatterni  t   BatteryLeveli  t	   Copyrighti  t   ExposureTimei  t   FNumberi  s   IPTC/NAAii  t
   ExifOffsetis  t   InterColorProfilei"  t   ExposureProgramt   Unidentifiedt   Manuals   Program Normals   Aperture Prioritys   Shutter Priorityi   s   Program Creatives   Program Actioni   s   Portrait Modes   Landscape Modei$  t   SpectralSensitivityi%  t   GPSInfoi'  t   ISOSpeedRatingsi(  t   OECFi   t   ExifVersionc         C   s   d i  t t |    S(   Nt    (   t   joint   mapt   chrt   x(   RG   (    (    t9   /home2/kennisonb/webapps/zope/Zope/Products/Photo/EXIF.pyt   <lambda>   s    i  t   DateTimeOriginali  t   DateTimeDigitizedi  t   ComponentsConfigurationRC   t   Yt   Cbt   Crt   Redt   Greent   Bluei  t   CompressedBitsPerPixeli  t   ShutterSpeedValuei  t   ApertureValuei  t   BrightnessValuei  t   ExposureBiasValuei  t   MaxApertureValuei  t   SubjectDistancei  t   MeteringModet   Averaget   CenterWeightedAveraget   Spott	   MultiSpoti  t   LightSourcet   Unknownt   Daylightt   Fluorescentt   Tungsteni
   t   Flashi   s   Standard Light Ai   s   Standard Light Bi   s   Standard Light Ci   t   D55i   t   D65i   t   D75i   t   Otheri	  t   Not   Fireds	   Fired (?)s	   Fired (!)i	   s
   Fill Firedi   s   Fill Fired (?)i   s   Fill Fired (!)i   t   Offi   s   Auto Offi   s
   Auto Firedi   s   Auto Fired (?)i   s   Auto Fired (!)i    s   Not Availablei
  t   FocalLengthi|  t	   MakerNotei  t   UserCommentc         C   s   d i  t t |    S(   NRC   (   RD   RE   RF   RG   (   RG   (    (    RH   RI      s    i  t
   SubSecTimei  t   SubSecTimeOriginali  t   SubSecTimeDigitizedi   t   FlashPixVersionc         C   s   d i  t t |    S(   NRC   (   RD   RE   RF   RG   (   RG   (    (    RH   RI      s    i  t
   ColorSpacei  t   ExifImageWidthi  t   ExifImageLengthi  t   InteroperabilityOffseti  t   FlashEnergyi  t   SpatialFrequencyResponsei  t   FocalPlaneXResolutioni  t   FocalPlaneYResolutioni  t   FocalPlaneResolutionUniti  t   SubjectLocationi  t   ExposureIndexi  t   SensingMethodi   t
   FileSources   Digital Camerai  t	   SceneTypes   Directly Photographedt   InteroperabilityIndext   InteroperabilityVersioni   t   RelatedImageFileFormati  t   RelatedImageWidthi  t   RelatedImageLengtht   GPSVersionIDt   GPSLatitudeReft   GPSLatitudet   GPSLongitudeReft   GPSLongitudet   GPSAltitudeReft   GPSAltitudet   GPSTimeStampt   GPSSatellitest	   GPSStatust   GPSMeasureModei   t   GPSDOPi   t   GPSSpeedReft   GPSSpeedi   t   GPSTrackReft   GPSTrackt   GPSImgDirectionReft   GPSImgDirectiont   GPSMapDatumt   GPSDestLatitudeReft   GPSDestLatitudet   GPSDestLongitudeReft   GPSDestLongitudei   t   GPSDestBearingReft   GPSDestBearingt   GPSDestDistanceRefi   t   GPSDestDistancet
   ISOSettingt	   ColorModet   Qualityt   Whitebalancet   ImageSharpeningt	   FocusModet   FlashSettingt   ISOSelectioni   t   ImageAdjustmenti   t   AuxiliaryLensi   t   ManualFocusDistancei   t   DigitalZoomFactori   t   AFFocusPositiont   Centert   Topt   Bottomi   t   Lefti   t   Righti   t
   Saturationis   B&Wis   -2is   -1t   0t   1t   2i   t   NoiseReductiont   DataDumps	   VGA Basics
   VGA Normals   VGA Fines
   SXGA Basics   SXGA Normals	   SXGA Finet   Colort
   Monochromet   Normals   Bright+s   Bright-s	   Contrast+s	   Contrast-t   CCDSpeeds   ISO 80s   ISO 160s   ISO 320s   ISO 100t   WhiteBalancet   Autot   Presett   Incandescentt   Cloudys   Speed Lightc         C   s   h  d d <d d <d d <d d <} h  d d	 <d d
 <d d <d d <d d <} d | |  d |  d | |  d f S(   Ni    R   i   R`   i   t   Fasti   t   Panoramas   Non-panoramics   Left to rights   Right to lefts   Bottom to topi   s   Top to bottoms   %s - sequence %d - %s(   t   at   bt   v(   R   R   R   (    (    RH   t   olympus_special_modeJ  s    *3t   JPEGThumbnailt   SpecialModet   JPEGQualt   SQt   HQt   SHQt   Macroi  t   DigitalZoomi  t   SoftwareReleasei  t   PictureInfoi	  t   CameraIDc         C   s   d i  t t |    S(   NRC   (   RD   RE   RF   RG   (   RG   (    (    RH   RI   h  s    i   t   RecordingModes   Single ShutterR   s   Night Scenet   Portraitt	   Landscapet   Economyt   Finet   FocusingModes
   Auto Focuss   Manual Focust   Infinityt	   FlashModet   Ons   Red Eye Reductiont   FlashIntensityt   Weakt   Strongs   Object Distancet   Shadei   t	   Sharpnesst   Softt   Hardt   Contrastt   Lowt   Highi@   iP   id   i}   s   +1.0i   s   +3.0i   s   +2.0t   NoteVersionc         C   s   d i  t t |    S(   NRC   (   RD   RE   RF   RG   (   RG   (    (    RH   RI     s    s   DaylightColor-Fluorescenti  s   DaywhiteColor-Fluorescenti  s   White-Fluorescentt   Customi  i  t   Tonei  i  t   FlashStrengthi   i!  i0  t   SlowSynci1  t   PictureModet   Sportst   Nights
   Program AEs   Aperture Priority AEs   Shutter Priority AEs   Manual Exposurei   t   MotorOrBracketi   t   BlurWarningi  t   FocusWarningi  t	   AEWarningt	   ImageTypet   FirmwareVersiont   ImageNumbert	   OwnerNamet	   Macromodet	   SelfTimert	   Superfines   Flash Not Fireds   Red-Eye Reductions   Slow Synchros   Auto + Red-Eye Reductions   On + Red-Eye Reductions   external flasht   ContinuousDriveModes   Single Or Timert
   Continuouss   One-Shots   AI Servos   AI Focust   MFt   Singlet	   ImageSizet   Larget   Mediumt   Smallt   EasyShootingModes	   Full Autos   Fast Shutters   Slow Shuttert   Sepias   Macro/Close-Ups	   Pan Focust   Nonet   2xt   4xi  t   ISOs   See ISOSpeedRatings Tagt   50t   100t   200t   400t
   Evaluativet   Partials   Center-weightedt	   FocusTypes   Close-Up (Macro)s   Locked (Pan Mode)t   AFPointSelectedi 0  s	   None (MF)i0  s   Auto-Selectedi0  i0  i0  t   ExposureModes   Easy Shootingt   Programs   Tv-prioritys   Av-prioritys   A-DEPt!   LongFocalLengthOfLensInFocalUnitst"   ShortFocalLengthOfLensInFocalUnitst   FocalUnitsPerMMi   t   FlashActivitys   Did Not Firet   FlashDetailss   External E-TTLs   Internal Flashs   FP Sync Useds   2nd("Rear")-Curtain Sync Useds   FP Sync Enabledt   Sunnyt   SequenceNumbert   AFPointUsedt	   FlashBiasi  s   -2 EVi  s   -1.67 EVi  s   -1.50 EVi  s   -1.33 EVi  s   -1 EVi  s   -0.67 EVi  s   -0.50 EVi  s   -0.33 EVs   0 EVs   0.33 EVs   0.50 EVs   0.67 EVs   1 EVi,   s   1.33 EVi0   s   1.50 EVi4   s   1.67 EVs   2 EVc         C   s/   d } x" |  D] } | d >t |  B} q W| S(   Ni    i   (   RG   t   strt   ct   ord(   R  RG   R  (    (    RH   t   s2n_motorolay  s
     c         C   s?   d } d } x, |  D]$ } | t |  | >B} | d } q W| S(   Ni    l    i   (   RG   t   yR  R  R  (   R  R  RG   R  (    (    RH   t	   s2n_intel  s     c         C   s*   | d j o |  Sn t | |  |  Sd  S(   Ni    (   R   R   t   gcd(   R   R   (    (    RH   R     s    c           B   s#   t  Z d   Z d   Z d   Z RS(   Nc         C   s   | |  _  | |  _ d  S(   N(   t   numt   selft   den(   R"  R!  R#  (    (    RH   t   __init__  s    	c         C   s?   |  i   |  i d j o t |  i  Sn d |  i |  i f S(   Ni   s   %d/%d(   R"  t   reduceR#  R  R!  (   R"  (    (    RH   t   __repr__  s    
c         C   sJ   t  |  i |  i  } | d j o$ |  i | |  _ |  i | |  _ n d  S(   Ni   (   R   R"  R!  R#  t   div(   R"  R'  (    (    RH   R%    s    (   t   __name__t
   __module__R$  R&  R%  (    (    (    RH   R     s   		t   IFD_Tagc           B   s#   t  Z d   Z d   Z d   Z RS(   Nc         C   s:   | |  _  | |  _ | |  _ | |  _ | |  _ | |  _ d  S(   N(   t	   printableR"  t   tagt
   field_typet   field_offsett   field_lengtht   values(   R"  R+  R,  R-  R0  R.  R/  (    (    RH   R$    s    					c         C   s   |  i S(   N(   R"  R+  (   R"  (    (    RH   t   __str__  s    c         C   s(   d |  i t |  i d |  i |  i f S(   Ns   (0x%04X) %s=%s @ %di   (   R"  R,  t   FIELD_TYPESR-  R+  R.  (   R"  (    (    RH   R&    s    (   R(  R)  R$  R1  R&  (    (    (    RH   R*    s   		t   EXIF_headerc           B   sk   t  Z d d  Z d d  Z d   Z d   Z d   Z d   Z e d  Z	 d	   Z
 d
   Z d   Z RS(   Ni    c         C   s1   | |  _  | |  _ | |  _ | |  _ h  |  _ d  S(   N(   t   fileR"  t   endiant   offsett   debugt   tags(   R"  R4  R5  R6  R7  (    (    RH   R$    s
    				c         C   sd   |  i i |  i |  |  i i |  } |  i d j o t |  } n t
 |  } | o n | S(   Nt   I(   R"  R4  t   seekR6  t   readt   lengtht   sliceR5  R  t   valR  t   signed(   R"  R6  R<  R?  R=  R>  (    (    RH   t   s2n  s    c         C   sg   d } xZ t |  D]L } |  i d j o | t | d @ } n t | d @ | } | d ?} q W| S(   NRC   R9  i   i   (   t   st   rangeR<  t   iR"  R5  RF   R6  (   R"  R6  R<  RC  RA  (    (    RH   t   n2s  s     c         C   s   |  i d d  S(   Ni   (   R"  R@  (   R"  (    (    RH   t	   first_IFD  s    c         C   s.   |  i | d  } |  i | d d | d  S(   Ni   i   i   (   R"  R@  t   ifdt   entries(   R"  RF  RG  (    (    RH   t   next_IFD  s    c         C   sA   |  i   } g  } x( | o  | i |  |  i |  } q W| S(   N(   R"  RE  RC  R   t   appendRH  (   R"  RC  R   (    (    RH   t	   list_IFDs  s     c      	   C   s>  |  i | d  } x%t |  D]} | d d | } |  i | d  } |  i | d d  } d | j  o t	 t
  j  n p t d | | f  n t
 | d }
 |  i | d d  } | d } | |
 d j o |  i | d  } n | } | d j oV | d j o? |  i i |  i |  |  i i |  i   i d d  } qd } n g  } | d	 d d
 d g j } x t |  D]t } | d j o5 t |  i | d |  |  i | d d |   } n |  i | |
 |  } | i |  | |
 } qW| d j o! | d j o t | d  }	 n t |  }	 | i |  } | o | d } t	 |  d j o` t! | d  o | d |  }	 qd }	 x2 | D]& } |	 | d i | t" |   7}	 qWqn d | } t# |	 | | | | | |
  |  i$ | d | <|  i& o( d | t" |  i$ | d |  f GHq q Wd  S(   Ni   i   i    s   unknown type %d in tag 0x%04Xi   i   t    RC   i   i	   i
   i   i   s
   Tag_0x%04Xt   _s
       %s: %s(   i   i
   ('   R"  R@  RF  RG  RB  RC  t   entryR,  R-  t   lenR2  t
   ValueErrort   typelent   countR6  R.  R4  R:  R;  t   stript   replaceR0  R?  t   jR   t   value_jRI  R  R+  t   dictt   gett	   tag_entryt   tag_namet   callablet   reprR*  R8  t   ifd_nameR7  (   R"  RF  R\  RV  RG  R,  R-  RY  RX  R+  RP  R.  R6  RQ  RC  RT  R?  R0  RU  RM  (    (    RH   t   dump_IFD  sb     $
(
  
 ,
	
c         C   sy  |  i | d  } |  i d j o
 d } n d } |  i i |  i |  | |  i i	 | d d  d 7} xLt
 |  D]>} | d d | } |  i | d  } |  i | d d  } t | d }
 |  i | d d  } |  i | d	 d  } | d d
 } | d j o | } | |
 }	 n | |
 d j o t |  } | |  |  i | d  | | d } | d j o | } d }	 n |  i i |  i |  | |  i i	 | |
  7} qx qx W|  i d i } |  i d i } x t
 t |   D]w } |  i t |  |	  } | |  | | | |	 } | |	 7} |  i i |  i | |  | |  i i	 | |  7} qW| |  i d <d  S(   Ni   t   Mt   MM *   s   II*    i   t       i    i   i   i   i  t   Thumbnail_StripOffsetst   Thumbnail_StripByteCountst   TIFFThumbnail(   R"  R@  t	   thumb_ifdRG  R5  t   tiffR4  R:  R6  R;  RB  RC  RM  R,  R-  R2  RP  RQ  t   oldofft   ptrt	   strip_offt	   strip_lenRN  t   newoffRD  R8  R0  t   old_offsetst
   old_counts(   R"  Rd  RQ  R-  Rk  Rl  Rh  RC  Re  Ri  RP  Rj  R,  RG  Rf  RM  Rg  R6  (    (    RH   t   extract_TIFF_thumbnail6  sH    
" &
" 
c         C   s  |  i d } |  i d i } |  i d i } | d j oh | i d d !d d d	 d
 d g j o! |  i | i d d d t	 n |  i | i d d t
 d  Sn | d  d j o% |  i | i d d d t d  Sn | d j o! |  i | i d d t d  Sn | d j o] |  i } d |  _ |  i } |  i | i 7_ |  i d d d t | |  _ | |  _ d  Sn | d j of |  i | i d d t xB d t f d t f f D]( } |  i |  i | d i | d  qWd  Sn d  S(   Nt   EXIF_MakerNotet
   Image_Maket   Image_Modelt   NIKONi    i   iN   ii   ik   io   in   i   Rm   RV  i   t   OLYMPUSt   Casiot   FUJIFILMR9  i   t   Canont   MakerNote_Tag_0x0001t   MakerNote_Tag_0x0004i   (   R"  R8  t   noteR+  t   maket   modelR0  R]  R.  t   MAKERNOTE_NIKON_OLDER_TAGSt   MAKERNOTE_NIKON_NEWER_TAGSt   MAKERNOTE_OLYMPUS_TAGSt   MAKERNOTE_CASIO_TAGSR5  R6  t   MAKERNOTE_FUJIFILM_TAGSt   MAKERNOTE_CANON_TAGSt   MAKERNOTE_CANON_TAG_0x001t   MAKERNOTE_CANON_TAG_0x004RC  t   canon_decode_tag(   R"  RC  R6  Rx  R5  Rz  Ry  (    (    RH   t   decode_maker_notel  sD    &


					
 &c         C   s   x t  d t |   D] } | i | d  } |  i o | G| GHn | d } t |  d j o | d i | | d  } n | | } t t |  d  d d  d  d   |  i d | <q Wd  S(   Ni   R`   i    t
   MakerNote_(   s   Unknown(   RB  RN  t   valueRC  RV  RW  RG   R"  R7  t   nameR>  R*  R  R  R8  (   R"  R  RV  R  R>  RC  RG   (    (    RH   R    s     


(   R(  R)  R$  R@  RD  RE  RH  RJ  t	   EXIF_TAGSR]  Rm  R  R  (    (    (    RH   R3    s   					D	6	9c         C   s1  |  i d  } | d d !d d g j o3 |  i d  |  i d  } |  i d  d } n | d d !d j o xp | d d	 j o^ | d
 d !d. j oJ t | d  d t | d  } |  i | d  d |  i d  } qs W| d d	 j o3 | d
 d !d j o |  i   } |  i d  } q3h  Sn h  S| o# h  d d <d d <| Gd GHn t
 |  | | |  } | i   } d } x| D]|} | d j o
 d } n( | d j o d } | }
 n d | } | o d | | | f GHn | i | |  | i i | d  } | o | o d | i d GHn | i | i d d  | i i d   } | o< | o d! | i d GHn | i | i d d" d# t qn | i i | d$  }	 |	 o< | o d% |	 i d GHn | i |	 i d d& d# t n | d 7} qW| i i d'  } | o! | i d( j o | i |
  n | i i d)  } | oF |  i | | i d  | i d* i d } |  i |  | i d+ <n | i i  d,  o | i!   n | i i  d+  pR | i i d-  } | o5 |  i | | i d  |  i | i"  | i d+ <q*n | i S(/   Ni   i    i   s   II* t   MM *i   i   s   s   i   i
   t   JFIFt   JFXXt   OLYMi   i   i   s    t   ExifR9  t   IntelR^  t   Motorolat   formatt   Imaget	   Thumbnails   IFD %ds    IFD %d (%s) at offset %d:t   _ExifOffsets    EXIF SubIFD at offset %d:t   EXIFt"   EXIF_SubIFD_InteroperabilityOffsets.    EXIF Interoperability SubSubIFD at offset %d:s   EXIF InteroperabilityRV  t   _GPSInfos    GPS SubIFD at offset %d:t   GPSt   Thumbnail_Compressions   Uncompressed TIFFt   Thumbnail_JPEGInterchangeFormatt%   Thumbnail_JPEGInterchangeFormatLengthR   Rn  t   MakerNote_JPEGThumbnail(   R  R  R  (#   R4  R;  t   dataR:  R5  R6  R  R<  t   tellR7  R3  t   hdrRJ  t   ifd_listt   ctrRC  t   IFD_nameRd  R]  R8  RW  t   exif_offR0  t   intr_offt	   INTR_TAGSt   gps_offt   GPS_TAGSt   thumbR+  Rm  t	   thumb_offt   sizet   has_keyR  R/  (   R4  R7  R  R  R  R  R  R6  R  R  Rd  R  R  RC  R<  R5  R  R  (    (    RH   t   process_file  s    
 %"%# 


!!t   __main__Ns   Usage: %s files...
t   rbt
   unreadablet   :s   No EXIF information foundRc  s      %s (%s): %st   errort   "s   File has JPEG thumbnail($   R2  R  R  R  R|  R{  R   R}  R~  R  R  R  R  R  R  R   R   R*  R3  R  R(  t   sysRN  t   argvt   exitt   filenamet   openR4  R  t   keysRG   t   sortRC  R-  R+  R  (   R  R  R  R   R4  R  R  R}  R*  R   R  R{  R3  R  R2  R  R  R  R~  R  R   R|  RC  R  R  RG   (    (    RH   t   ?D   s        B	 K  0 *!	  6  A6	    9l !!		
	^	 		
 ,,!	