
    Rhn                        d Z g d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Zddl	Z	ddl
Z
ddlZddlmZ  ej                  dde      Z e       j%                  ej&                          G d	 d
      ZdZ e
j,                  d      Zd1dZd Z e
j,                  de
j4                        Zd Zd Zd Z G d d      Z G d d      Z  G d de       Z!d Z" G d de#      Z$ddddd Z% e&       Z' G d! d"      Z(d# Z)e*e+e,ej                  e-fZ. G d$ d%e&      Z/d& Z0e1 e2e"ee!'      e3 e2e0e(e/'      iZ4de2d(d)Z5de2d(d*Z6e1d+d,d-d.Z7e1d,d+d/d0Z8y)2a>  plistlib.py -- a tool to generate and parse MacOSX .plist files.

The property list (.plist) file format is a simple XML pickle supporting
basic object types, like dictionaries, lists, numbers and strings.
Usually the top level object is a dictionary.

To write out a plist file, use the dump(value, file)
function. 'value' is the top level object, 'file' is
a (writable) file object.

To parse a plist from a file, use the load(file) function,
with a (readable) file object as the only argument. It
returns the top level object (again, usually a dictionary).

To work with plist data in bytes objects, you can use loads()
and dumps().

Values can be strings, integers, floats, booleans, tuples, lists,
dictionaries (but only with string keys), Data, bytes, bytearray, or
datetime.datetime objects.

Generate Plist example:

    import datetime
    import plistlib

    pl = dict(
        aString = "Doodah",
        aList = ["A", "B", 12, 32.1, [1, 2, 3]],
        aFloat = 0.1,
        anInt = 728,
        aDict = dict(
            anotherString = "<hello & hi there!>",
            aThirdString = "M\xe4ssig, Ma\xdf",
            aTrueValue = True,
            aFalseValue = False,
        ),
        someData = b"<binary gunk>",
        someMoreData = b"<lots of binary gunk>" * 10,
        aDate = datetime.datetime.now()
    )
    print(plistlib.dumps(pl).decode())

Parse Plist example:

    import plistlib

    plist = b'''<plist version="1.0">
    <dict>
        <key>foo</key>
        <string>bar</string>
    </dict>
    </plist>'''
    pl = plistlib.loads(plist)
    print(pl["foo"])
)InvalidFileExceptionFMT_XML
FMT_BINARYloaddumploadsdumpsUID    N)BytesIO)ParserCreatePlistFormatzFMT_XML FMT_BINARY)modulec                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)r	   c                     t        |t              st        d      |dk\  rt        d      |dk  rt        d      || _        y )Nzdata must be an int            zUIDs cannot be >= 2**64r
   UIDs must be positive)
isinstanceint	TypeError
ValueErrordataselfr   s     /usr/lib/python3.12/plistlib.py__init__zUID.__init__N   sE    $$1227?677!8455	    c                     | j                   S N)r   r   s    r   	__index__zUID.__index__W   s    yyr   c                 `    | j                   j                  dt        | j                        dS )N())	__class____name__reprr   r   s    r   __repr__zUID.__repr__Z   s    >>22DODDr   c                 4    | j                   | j                  ffS r   )r$   r   r   s    r   
__reduce__zUID.__reduce__]   s    ~~		|++r   c                 `    t        |t              st        S | j                  |j                  k(  S r   )r   r	   NotImplementedr   )r   others     r   __eq__z
UID.__eq__`   s%    %%!!yyEJJ&&r   c                 ,    t        | j                        S r   )hashr   r   s    r   __hash__zUID.__hash__e   s    DIIr   N)	r%   
__module____qualname__r   r    r'   r)   r-   r0    r   r   r	   r	   M   s!    E,'
r   r	   s   <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
zv[\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0b\x0c\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f]c                     |dz  dz  }g }t        dt        |       |      D ].  }| |||z    }|j                  t        j                  |             0 dj                  |      S )N      r
   r   )rangelenappendbinascii
b2a_base64join)smaxlinelength
maxbinsizepiecesichunks         r   _encode_base64rC   y   sj    "A%JF1c!fj) 2!a*n%h))%012 88Fr   c                     t        | t              r$t        j                  | j	                  d            S t        j                  |       S )Nutf-8)r   strr:   
a2b_base64encode)r=   s    r   _decode_base64rI      s9    !S""188G#455 ""1%%r   z{(?P<year>\d\d\d\d)(?:-(?P<month>\d\d)(?:-(?P<day>\d\d)(?:T(?P<hour>\d\d)(?::(?P<minute>\d\d)(?::(?P<second>\d\d))?)?)?)?)?Zc                     d}t         j                  |       j                         }g }|D ]%  }||   }| n|j                  t	        |             ' t        j
                  | S )Nyearmonthdayhourminutesecond)_dateParsermatch	groupdictr9   r   datetime)r=   ordergdlstkeyvals         r   _date_from_stringr[      sh    @E			1		'	'	)B
C g;

3s8	
 c""r   c                     d| j                   | j                  | j                  | j                  | j                  | j
                  fz  S )Nz%04d-%02d-%02dT%02d:%02d:%02dZrK   )ds    r   _date_to_stringr^      s:    +		!((/  r   c                     t         j                  |       }|t        d      | j                  dd      } | j                  dd      } | j                  dd      } | j                  dd      } | j                  d	d
      } | S )Nz;strings can't contain control characters; use bytes insteadz

&z&amp;<z&lt;>z&gt;)_controlCharPatsearchr   replace)textms     r   _escaperj      s~    t$A} - . 	.<<%D<<d#D<<W%D<<V$D<<V$DKr   c                       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 Zd Zd Zd Zd Zd Zy)_PlistParserc                 <    g | _         d | _        d | _        || _        y r   )stackcurrent_keyroot
_dict_typer   	dict_types     r   r   z_PlistParser.__init__   s    
	#r   c                 F   t               | _        | j                  | j                  _        | j                  | j                  _        | j                  | j                  _        | j                  | j                  _	        | j                  j                  |       | j                  S r   )r   parserhandle_begin_elementStartElementHandlerhandle_end_elementEndElementHandlerhandle_dataCharacterDataHandlerhandle_entity_declEntityDeclHandler	ParseFilerp   )r   fileobjs     r   parsez_PlistParser.parse   so    "n*.*C*C'(,(?(?%+/+;+;((,(?(?%g&yyr   c                     t        d      )Nz8XML entity declarations are not supported in plist files)r   )r   entity_nameis_parameter_entityvaluebase	system_id	public_idnotation_names           r   r|   z_PlistParser.handle_entity_decl   s     ##]^^r   c                 H    g | _         t        | d|z   d       }|	 ||       y y )Nbegin_)r   getattr)r   elementattrshandlers       r   rv   z!_PlistParser.handle_begin_element   s.    	$7 2D9EN r   c                 8    t        | d|z   d       }| |        y y )Nend_)r   )r   r   r   s      r   rx   z_PlistParser.handle_end_element   s%    $ 0$7I r   c                 :    | j                   j                  |       y r   )r   r9   r   s     r   rz   z_PlistParser.handle_data   s    		r   c                    | j                   ct        | j                  d   t              s"t	        d| j
                  j                  z        || j                  d   | j                   <   d | _         y | j                  s|| _        y t        | j                  d   t              s"t	        d| j
                  j                  z        | j                  d   j                  |       y )Nzunexpected element at line %d)
ro   r   rn   dictr   ru   CurrentLineNumberrp   listr9   r   r   s     r   
add_objectz_PlistParser.add_object   s    'djjnd3 !@!%!>!>"? @ @/4DJJrN4++,#DDIdjjnd3 !@!%!>!>"? @ @JJrN!!%(r   c                 J    dj                  | j                        }g | _        |S )N )r<   r   r   s     r   get_dataz_PlistParser.get_data   s     wwtyy!	r   c                 |    | j                         }| j                  |       | j                  j                  |       y r   )rq   r   rn   r9   )r   r   r]   s      r   
begin_dictz_PlistParser.begin_dict   s,    OO

!r   c                     | j                   r.t        d| j                   | j                  j                  fz        | j                  j                          y )Nz%missing value for key '%s' at line %d)ro   r   ru   r   rn   popr   s    r   end_dictz_PlistParser.end_dict   sI    D"..t{{/L/LMN O O

r   c                     | j                   st        | j                  d   t              s"t	        d| j
                  j                  z        | j                         | _         y )Nr   zunexpected key at line %d)ro   r   rn   r   r   ru   r   r   r   s    r   end_keyz_PlistParser.end_key   sL    :djjnd#C8![[::; < <==?r   c                 `    g }| j                  |       | j                  j                  |       y r   )r   rn   r9   )r   r   as      r   begin_arrayz_PlistParser.begin_array   s%    

!r   c                 8    | j                   j                          y r   )rn   r   r   s    r   	end_arrayz_PlistParser.end_array   s    

r   c                 &    | j                  d       y )NTr   r   s    r   end_truez_PlistParser.end_true  s    r   c                 &    | j                  d       y )NFr   r   s    r   	end_falsez_PlistParser.end_false  s    r   c                     | j                         }|j                  d      s|j                  d      r| j                  t        |d             y | j                  t        |             y )N0x0X   )r   
startswithr   r   )r   raws     r   end_integerz_PlistParser.end_integer  sF    mmo>>$3>>$#7OOCRL)OOCH%r   c                 T    | j                  t        | j                                      y r   )r   floatr   r   s    r   end_realz_PlistParser.end_real  s    dmmo./r   c                 B    | j                  | j                                y r   )r   r   r   s    r   
end_stringz_PlistParser.end_string  s    (r   c                 T    | j                  t        | j                                      y r   )r   rI   r   r   s    r   end_dataz_PlistParser.end_data  s    t}}78r   c                 T    | j                  t        | j                                      y r   )r   r[   r   r   s    r   end_datez_PlistParser.end_date  s    )$--/:;r   N)r%   r1   r2   r   r   r|   rv   rx   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r3   r   r   rl   rl      sg    $_
) 
+
&0)9<r   rl   c                   .    e Zd ZddZd Zd ZddZd Zy)	_DumbXMLWriterc                 <    || _         g | _        || _        || _        y r   )filern   _indent_levelindent)r   r   indent_levelr   s       r   r   z_DumbXMLWriter.__init__  s    	
)r   c                     | j                   j                  |       | j                  d|z         | xj                  dz  c_        y )Nz<%s>   )rn   r9   writelnr   r   r   s     r   begin_elementz_DumbXMLWriter.begin_element"  s6    

'"Vg%&ar   c                     | j                   dkD  sJ | j                  j                         |k(  sJ | xj                   dz  c_         | j                  d|z         y )Nr
   r   z</%s>)r   rn   r   r   r   s     r   end_elementz_DumbXMLWriter.end_element'  sQ    !!A%%%zz~~7***aWw&'r   Nc           	      ~    |'t        |      }| j                  d|d|d|d       y | j                  d|z         y )Nrc   rd   z</z<%s/>)rj   r   )r   r   r   s      r   simple_elementz_DumbXMLWriter.simple_element-  s7    ENELL'5'BC LL7*+r   c                    |rnt        |t              r|j                  d      }| j                  j	                  | j
                  | j                  z         | j                  j	                  |       | j                  j	                  d       y )NrE      
)r   rF   rH   r   writer   r   )r   lines     r   r   z_DumbXMLWriter.writeln5  s^     $${{7+IIOOD..<=IIOOD!		r   )r
   	r   )r%   r1   r2   r   r   r   r   r   r3   r   r   r   r     s     
(,	r   r   c                   6    e Zd Z	 	 ddZd Zd Zd Zd Zd Zy)	_PlistWriterc                 ~    |r|j                  t               t        j                  | |||       || _        || _        y r   )r   PLISTHEADERr   r   
_sort_keys	_skipkeys)r   r   r   r   writeHeader	sort_keysskipkeyss          r   r   z_PlistWriter.__init__B  s5     JJ{#dL&A#!r   c                 j    | j                  d       | j                  |       | j                  d       y )Nz<plist version="1.0">z</plist>)r   write_valuer   s     r   r   z_PlistWriter.writeL  s)    ./Z r   c                    t        |t              r| j                  d|       y |du r| j                  d       y |du r| j                  d       y t        |t              r9d|cxk  rdk  r#n t	        |      | j                  dd	|z         y t	        |      t        |t
              r| j                  d
t        |             y t        |t              r| j                  |       y t        |t        t        f      r| j                  |       y t        |t        j                        r| j                  dt        |             y t        |t        t        f      r| j!                  |       y t#        dt%        |      z        )NstringTtrueFfalsel         r   integerz%drealdatezunsupported type: %s)r   rF   r   r   OverflowErrorr   r&   r   
write_dictbytes	bytearraywrite_bytesrU   r^   tupler   write_arrayr   typer   s     r   r   z_PlistWriter.write_valueQ  s4   eS!%0d]'e^(s#5*7* $E** ##Ite|<#E**u%U4t$OOE"y12U#x001(>?t}-U# 2T%[@AAr   c           
         | j                  d       | xj                  dz  c_        t        ddt        | j                  j                  dd      | j                  z        z
        }t        ||      j                  d      D ]  }|s| j                  |        | xj                  dz  c_        | j                  d       y )Nr   r   r   L      	s           r   )
r   r   maxr8   r   rg   rC   splitr   r   )r   r   r>   r   s       r   r   z_PlistWriter.write_bytess  s    6"aT[[((9D<N<NNOOQ #47==eD 	#DT"	# 	a r   c                    |r| j                  d       | j                  rt        |j                               }n|j                         }|D ]P  \  }}t	        |t
              s| j                  r#t        d      | j                  d|       | j                  |       R | j                  d       y | j                  d       y )Nr   keys must be stringsrY   )r   r   sorteditemsr   rF   r   r   r   r   r   )r   r]   r   rY   r   s        r   r   z_PlistWriter.write_dict  s    v&qwwy)	# (
U!#s+~~ #$:;;##E3/  '( V$ 'r   c                     |r;| j                  d       |D ]  }| j                  |        | j                  d       y | j                  d       y )Narray)r   r   r   r   )r   r   r   s      r   r   z_PlistWriter.write_array  sN    w' (  '(W% (r   N)r
   r   r   TF)	r%   r1   r2   r   r   r   r   r   r   r3   r   r   r   r   A  s(    BC%*"!
 BD!(()r   r   c                 V   d}|D ]  }| j                  |      s y t        j                  dft        j                  dft        j                  dffD ]U  \  }}| j                  |      s|D ]9  }||j                  d      j                  |      z   }| d t        |       |k(  s8  y W y)N)s   <?xmls   <plistTrE   z	utf-16-bez	utf-16-leasciiF)r   codecsBOM_UTF8BOM_UTF16_BEBOM_UTF16_LEdecoderH   r8   )headerprefixespfxbomencodingstartprefixs          r   _is_fmt_xmlr    s    $H S! '*$$k2$$k2 X   % 	E5<<077AAFls6{#v-	  r   c                       e Zd ZddZy)r   c                 0    t         j                  | |       y r   )r   r   )r   messages     r   r   zInvalidFileException.__init__  s    D'*r   N)zInvalid file)r%   r1   r2   r   r3   r   r   r   r     s    +r   r   BHLQ)r      r5      c                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	_BinaryPlistParsera  
    Read or write a binary plist file, following the description of the binary
    format.  Raise InvalidFileException in case of error, otherwise return the
    root object.

    see also: http://opensource.apple.com/source/CF/CF-744.18/CFBinaryPList.c
    c                     || _         y r   )rq   rr   s     r   r   z_BinaryPlistParser.__init__  s	    #r   c                    	 || _         | j                   j                  dt        j                         | j                   j	                  d      }t        |      dk7  r
t               t        j                  d|      \  }| _	        }}}| j                   j                  |       | j                  ||      | _        t        g|z  | _        | j                  |      S # t        t         t        j"                  t$        t&        f$ r t               w xY w)Ni    z>6xBBQQQ)_fpseekosSEEK_ENDreadr8   r   structunpack	_ref_size
_read_ints_object_offsets
_undefined_objects_read_objectOSError
IndexErrorerrorr   r   )r   fptraileroffset_sizenum_objects
top_objectoffset_table_offsets          r   r   z_BinaryPlistParser.parse  s    	) DHHHMM#r{{+hhmmB'G7|r!*,, j'2T^[*#HHMM-.#'??;#LD 'L;6DM$$Z00V\\= 	)&((	)s   CC 3Dc                     |dk(  rd| j                   j                  d      d   dz  }d|z  }dt        |   z   }t        j                  || j                   j                  |            d   S |S )z$ return the size of the next object.   r   r
   r6   rd   )r  r  _BINARY_FORMATr  r  )r   tokenLri   r=   fs        r   	_get_sizez_BinaryPlistParser._get_size  se    S=a #c)AQAnQ''A==DHHMM!$45a88r   c                    | j                   j                  |z        t        v r"t        j                  d| t                  S rt              |z  k7  r
t               t        fdt        d|z        D              S )Nrd   c              3   V   K   | ]   }t         j                  ||z    d        " yw)bigN)r   
from_bytes).0rA   r   sizes     r   	<genexpr>z0_BinaryPlistParser._read_ints.<locals>.<genexpr>  s/      < QD(95A <s   &)r
   )	r  r  r,  r  r  r8   r   r   r7   )r   nr5  r   s     `@r   r  z_BinaryPlistParser._read_ints  s    xx}}TAX&>!==1QCt(<'=!>EE3t9q0*,, <"'4!8T":< < <r   c                 :    | j                  || j                        S r   )r  r  )r   r7  s     r   
_read_refsz_BinaryPlistParser._read_refs   s    q$..11r   c                      j                   |   }|t        ur|S  j                  |   } j                  j	                  |        j                  j                  d      d   }|dz  |dz  }}|dk(  rd}ne|dk(  rd}n\|dk(  rd	}nS|dk(  rd
}nJ|dk(  r9t        j                   j                  j                  d|z        d|dk\        }n|dk(  r4t        j                  d j                  j                  d            d   }n|dk(  r4t        j                  d j                  j                  d            d   }n|dk(  rbt        j                  d j                  j                  d            d   }t        j                  ddd      t        j                  |      z   }n3|dk(  rE j                  |      } j                  j                  |      }t        |      |k7  rt               |dk(  rW j                  |      } j                  j                  |      }	t        |	      |k7  r
t               |	j                  d      }n|dk(  rZ j                  |      dz  } j                  j                  |      }	t        |	      |k7  r
t               |	j                  d      }n.|dk(  r<t!        t        j                   j                  j                  d|z         d            }n|dk(  rN j                  |      } j#                  |      }
g }| j                   |<   |j%                   fd|
D               n|d k(  r j                  |      } j#                  |      } j#                  |      }
 j'                         }| j                   |<   	 t)        ||
      D ](  \  }} j+                  |      | j+                  |      <   * n
t               | j                   |<   |S # t,        $ r t               w xY w)!zx
        read the object by reference.

        May recursively read sub-objects (content of an array/dict/set)
        r   r
      r+  Nr  F	   Tr   r   r2  r6   signed"   z>fr5   #   z>d3     )seconds@   P   r   `   r  utf-16be      c              3   @   K   | ]  }j                  |        y wr   )r   )r4  xr   s     r   r6  z2_BinaryPlistParser._read_object.<locals>.<genexpr>O  s     A1$++A.As      )r  r  r  r  r  r  r   r3  r  r  rU   	timedeltar/  r8   r   r   r	   r9  extendrq   zipr   r   )r   refresultoffsettokentokenHr-  r.  r=   r   obj_refskey_refskos   `             r   r   z_BinaryPlistParser._read_object  s    s##M%%c*fa #ut|D=Fd]Fd]F
 d]Ft^^^DHHMM!v+$>$)&A+ $ ?F d]]]4q)9:1=Fd]]]4q)9:1=Fd]dDHHMM!$45a8A ''a3((34F t^v&AXX]]1%F6{a*,,t^v&A88==#D4yA~*,,[[)Ft^v&*A88==#D4yA~*,,[[,Ft^a&j(A5IJFt^v&Aq)HF!'DMM#MMAAA t^v&Aq)Hq)H__&F!'DMM#-(3 HDAq373D3DQ3GF4,,Q/0H
 '((#c  -*,,-s   7O, ,P N)
r%   r1   r2   __doc__r   r   r/  r  r9  r   r3   r   r   r  r    s&    $)2<2cr   r  c                 (    | dk  ry| dk  ry| dk  ryy)N   r      r          r5   r  r3   )counts    r   _count_to_sizer_  h  s%    v~		 r   c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)_BinaryPlistWriterc                 .    || _         || _        || _        y r   )r  r   r   )r   r$  r   r   s       r   r   z_BinaryPlistWriter.__init__x  s    #!r   c                    g | _         i | _        i | _        | j                  |       t	        | j                         }dg|z  | _        t        |      | _        t        | j                     | _	        | j                  j                  d       | j                   D ]  }| j                  |        | j                  |      }| j                  j                         }t        |      }dt        |   |z  z   }| j                  j                  t        j                   |g| j
                          d}||| j                  |||f}	| j                  j                  t        j                   dg|	        y )Nr
      bplist00rd   z	>5xBBBQQQ)_objlist	_objtable_objidtable_flattenr8   r  r_  r  r,  _ref_formatr  r   _write_object
_getrefnumtellr  pack)
r   r   r'  objr(  r)  r&  offset_formatsort_versionr%  s
             r   r   z_BinaryPlistWriter.write}  s>      	e $--( !s;'4)$..9 	{# == 	$Cs#	$ __U+
"hhmmo$%89n[9KGGv{{=H43G3GHI +t~~{+
 	v{{;99:r   c                 D   t        |t              rt        |      |f| j                  v ry t	        |      | j
                  v ry t        | j                        }| j                  j                  |       t        |t              r|| j                  t        |      |f<   n|| j
                  t	        |      <   t        |t              rg }g }|j                         }| j                  rt        |      }|D ]O  \  }}t        |t              s| j                  r#t        d      |j                  |       |j                  |       Q t!        j"                  ||      D ]  }| j%                  |        y t        |t&        t(        f      r|D ]  }| j%                  |        y y )Nr   )r   _scalarsr   rf  idrg  r8   re  r9   r   r   r   r   rF   r   r   	itertoolschainrh  r   r   )	r   r   refnumkeysvaluesr   rW  vrX  s	            r   rh  z_BinaryPlistWriter._flatten  se    eX&UU#t~~5Y$*** T]]#U#eX&39DNNDK/0*0DRY' eT"DFKKMEu !1!!S)~~ #$:;;Aa ! __T62 !a ! e}- !a ! .r   c                     t        |t              r| j                  t        |      |f   S | j                  t        |         S r   )r   rr  rf  r   rg  rs  r   s     r   rk  z_BinaryPlistWriter._getrefnum  s9    eX&>>4;"677##BuI..r   c                 8   |dk  r3| j                   j                  t        j                  d||z               y |dk  r5| j                   j                  t        j                  d|dz  d|             y |dk  r5| j                   j                  t        j                  d|dz  d|             y |d	k  r5| j                   j                  t        j                  d
|dz  d|             y | j                   j                  t        j                  d|dz  d|             y )Nr+  z>Br[  z>BBBr   r\  z>BBH   r]  z>BBL   z>BBQ   )r  r   r  rm  )r   rS  r5  s      r   _write_sizez_BinaryPlistWriter._write_size  s    "9HHNN6;;tUT\:;F]HHNN6;;vus{D$GHG^HHNN6;;vus{D$GHG^HHNN6;;vus{D$GH HHNN6;;vus{D$GHr   c                    | j                  |      }| j                  j                         | j                  |<   || j                  j	                  d       y |du r| j                  j	                  d       y |du r| j                  j	                  d       y t        |t              rP|dk  r2	 | j                  j	                  t        j                  dd|             y |d	k  r1| j                  j	                  t        j                  d
d|             y |dk  r1| j                  j	                  t        j                  dd|             y |dk  r1| j                  j	                  t        j                  dd|             y |dk  r1| j                  j	                  t        j                  dd|             y |dk  r1| j                  j	                  d|j                  ddd      z          y t        |      t        |t              r1| j                  j	                  t        j                  dd|             y t        |t        j                        rY|t        j                  ddd      z
  j                         }| j                  j	                  t        j                  dd|             y t        |t        t         f      r7| j#                  dt%        |             | j                  j	                  |       y t        |t&              rI	 |j)                  d      }| j#                  dt%        |             | j                  j	                  |       y t        |t,              r%|j.                  dk  rt1        d#      |j.                  d	k  r1| j                  j	                  t        j                  d
d$|             y |j.                  dk  r1| j                  j	                  t        j                  dd%|             y |j.                  dk  r1| j                  j	                  t        j                  dd&|             y |j.                  dk  r1| j                  j	                  t        j                  dd'|             y t        |      t        |t2        t4        f      r{|D cg c]  }| j                  |       }}t%        |      }| j#                  d(|       | j                  j	                  t        j                  d)| j6                  |z  z   g|        y t        |t8              rHg g }	}| j:                  rt=        |j?                               }
n|j?                         }
|
D ]m  \  }}t        |t&              s| j@                  r#tC        d*      |jE                  | j                  |             |	jE                  | j                  |             o t%        |      }| j#                  d+|       | j                  j	                  t        j                  d)| j6                  |z  z   g|        | j                  j	                  t        j                  d)| j6                  |z  z   g|	        y tC        |      # t        j                  $ r t        |      d w xY w# t*        $ r3 |j)                  d       }| j#                  d!t%        |      d"z         Y w xY wc c}w ),N    F   Tr   r
   z>Bqr~  r[  z>BBr   r\  z>BHr|  r]  z>BLr}  l            z>BQr      r2  r=  z>Bdr@  rB  r   rA  rD  r   rE  rG  rF  r  r   rH           rI  rd   r   rL  )#rk  r  rl  r  r   r   r   r  rm  r#  r   to_bytesr   rU   total_secondsr   r   r  r8   rF   rH   UnicodeEncodeErrorr	   r   r   r   r   ri  r   r   r   r   r   r   r9   )r   r   rP  r.  trX  refsr=   keyRefsvalRefs	rootItemsrW  ry  s                r   rj  z _BinaryPlistWriter._write_object  s   ooe$$(HHMMOS!=HHNN7#e^HHNN7#d]HHNN7#s#qy9HHNN6;;udE#BC v{{5$>?v{{5$>?v{{5$>?v{{5$>?wE$)OOP#E**u%HHNN6;;udE:;x001**4A66EEGAHHNN6;;udA67y12T3u:.HHNN5!s#4LL)  s5z2
 HHNN1s#zzA~ !899f$v{{5$>?g%v{{5$>?g%v{{5$>?g%v{{5$>?#E**e}-0561DOOA&6D6D	AT1%HHNN6;;sT-=-=-A'AIDIJt$!2WG"5;;=1	!KKM	! 31!!S)~~ #$:;;tq12tq123 GAT1%HHNN6;;sT-=-=-A'ALGLMHHNN6;;sT-=-=-A'ALGLM E""] || 9'.D89< & 4LL,  s1v{34* 7s$   .0Y= 
,Z  "[= Z 8[[N)	r%   r1   r2   r   r   rh  rk  r  rj  r3   r   r   ra  ra  w  s$    "
+;Z(!T/I ^#r   ra  c                     | d d dk(  S )Nr  rd  r3   )r   s    r   _is_fmt_binaryr  K  s    "1:$$r   )detectru   writerfmtrs   c                    |W| j                  d      }| j                  d       t        j                         D ]  } |d   |      s|d   } n t	               t        |   d   } ||      }|j                  |       S )zRead a .plist file. 'fp' should be a readable and binary file object.
    Return the unpacked root object (which usually is a dictionary).
    r  r
   r  ru   )rs   )r  r  _FORMATSrx  r   r   )r$  r  rs   r   infoPps          r   r   r   a  s     {

OO% 	)DtH~f%N	) '(( SM(#	IA772;r   c                4    t        |       }t        |||      S )zqRead a .plist file from a bytes object.
    Return the unpacked root object (which usually is a dictionary).
    r  )r   r   )r   r  rs   r$  s       r   r   r   w  s     
By11r   TF)r  r   r   c                z    |t         vrt        d|      t        |   d   |||      }|j                  |        y)zWWrite 'value' to a .plist file. 'fp' should be a writable,
    binary file object.
    zUnsupported format: r  )r   r   N)r  r   r   )r   r$  r  r   r   r  s         r   r   r     s=     (3899c]8$R9xPF
LLr   r  r   r   c                V    t               }t        | ||||       |j                         S )z?Return a bytes object with the contents for a .plist file.
    r  )r   r   getvalue)r   r  r   r   r$  s        r   r   r     s'     
Bh)D;;=r   )r   )9rY  __all__r:   r   rU   enumior   rt  r  rer  xml.parsers.expatr   Enumr%   r   globalsupdate__members__r	   r   compilere   rC   rI   ASCIIrR   r[   r^   rj   rl   r   r   r  r   r   r,  objectr  r  r_  rF   r   r   r   rr  ra  r  r   r   r   r  r   r   r   r   r3   r   r   <module>r     s  7p       	 	  * dii';HM 	  (( ) B "**IJ& bjj  X  Z\  Zb  Zb  c	#
k< k<\# #L[)> [)|B+J + SSS1X
^ ^@ eX..6Q#& Q#h% T
 !!
 D ,  2 #dU   %4 r   