ÿØÿà JFIF      ÿÛ C      

!"$"$ÿÛ C  ÿÂ p " ÿÄ              ÿÄ             ÿÚ    ÕÔË®
(%	aA*‚XYD¡(J„¡E¢RE,P€XYae )(E¤²€B¤R¥	BQ¤¢ X«)X…€¤   @  

  ..............................................................................................................................................................................
.............................................................................                                                  
                                                                                                                                                                                     ÿØÿà JFIF      ÿÛ C      

!"$"$ÿÛ C  ÿÂ p " ÿÄ              ÿÄ             ÿÚ    ÕÔË®
(%	aA*‚XYD¡(J„¡E¢RE,P€XYae )(E¤²€B¤R¥	BQ¤¢ X«)X…€¤   @  

  ..............................................................................................................................................................................
.............................................................................                                                  
                                                                                                                                                                                     o
    p̦io                     @   s  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dZe ej d	ZG d
d dZdZe
dZd?ddZdd Ze
de
jZdd Zdd Zdd ZG dd dZ G dd dZ!G dd de!Z"d d! Z#G d"d# d#e$Z%d$d%d&d'd(Z&e' Z(G d)d* d*Z)d+d, Z*e+e,e-eje.fZ/G d-d. d.e'Z0d/d0 Z1e2e3e#e e"d1e4e3e1e)e0d1iZ5de3d2d3d4Z6de3d2d5d6Z7e2d7d8d9d:d;Z8e2d8d7d<d=d>Z9dS )@a>  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)modulei   c                   @   <   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )r   c                 C   s<   t |ts	td|dkrtd|dk rtd|| _d S )Nzdata must be an int            zUIDs cannot be >= 2**64r	   UIDs must be positive)
isinstanceint	TypeError
ValueErrordataselfr    r   /usr/lib/python3.10/plistlib.py__init__Q   s   

zUID.__init__c                 C   s   | j S N)r   r   r   r   r   	__index__Z   s   zUID.__index__c                 C   s   d| j jt| jf S )Nz%s(%s))	__class____name__reprr   r   r   r   r   __repr__]      zUID.__repr__c                 C   s   | j | jffS r   )r   r   r   r   r   r   
__reduce__`      zUID.__reduce__c                 C   s   t |tstS | j|jkS r   )r   r   NotImplementedr   )r   otherr   r   r   __eq__c   s   
z
UID.__eq__c                 C   s
   t | jS r   )hashr   r   r   r   r   __hash__h      
zUID.__hash__N)	r   
__module____qualname__r   r   r!   r#   r'   r)   r   r   r   r   r   P   s    	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]L   c                 C   sP   |d d }g }t dt| |D ]}| |||  }|t| qd|S )N      r	       )rangelenappendbinascii
b2a_base64join)smaxlinelength
maxbinsizepiecesichunkr   r   r   _encode_base64|   s   
r=   c                 C   s$   t | trt| dS t| S )Nutf-8)r   strr4   
a2b_base64encode)r7   r   r   r   _decode_base64   s   

rB   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                 C   sL   d}t |  }g }|D ]}|| }|d u r n|t| qtj| S )Nyearmonthdayhourminutesecond)_dateParsermatch	groupdictr3   r   datetime)r7   ordergdlstkeyvalr   r   r   _date_from_string   s   
rS   c                 C   s    d| j | j| j| j| j| jf S )Nz%04d-%02d-%02dT%02d:%02d:%02dZrC   )dr   r   r   _date_to_string   s   rU   c                 C   sZ   t | }|d urtd| dd} | dd} | dd} | dd} | d	d
} | S )Nz;strings can't contain control characters; use bytes insteadz

&z&amp;<z&lt;>z&gt;)_controlCharPatsearchr   replace)textmr   r   r   _escape   s   
r`   c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)S )*_PlistParserc                 C   s   g | _ d | _d | _|| _d S r   )stackcurrent_keyroot
_dict_typer   	dict_typer   r   r   r         
z_PlistParser.__init__c                 C   sB   t  | _| 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	ParseFilerd   )r   fileobjr   r   r   parse   s   



z_PlistParser.parsec                 C   s   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_namer   r   r   rp      s   z_PlistParser.handle_entity_declc                 C   s.   g | _ t| d| d }|d ur|| d S d S )Nbegin_)r   getattr)r   elementattrshandlerr   r   r   rj      s
   z!_PlistParser.handle_begin_elementc                 C   s&   t | d| d }|d ur|  d S d S )Nend_)r}   )r   r~   r   r   r   r   rl      s   
z_PlistParser.handle_end_elementc                 C   s   | j | d S r   )r   r3   r   r   r   r   rn         z_PlistParser.handle_datac                 C   s   | j d ur$t| jd ti std| jj || jd | j < d | _ d S | js,|| _d S t| jd tg s>td| jj | jd | d S )Nzunexpected element at line %d)	rc   r   rb   typer   ri   CurrentLineNumberrd   r3   r   rw   r   r   r   
add_object   s   


z_PlistParser.add_objectc                 C   s   d | j}g | _|S )N )r6   r   r   r   r   r   get_data   s   z_PlistParser.get_datac                 C   s"   |   }| | | j| d S r   )re   r   rb   r3   )r   r   rT   r   r   r   
begin_dict   s   
z_PlistParser.begin_dictc                 C   s*   | j rtd| j | jjf | j  d S )Nz%missing value for key '%s' at line %d)rc   r   ri   r   rb   popr   r   r   r   end_dict   s
   z_PlistParser.end_dictc                 C   s8   | j st| jd ti std| jj |  | _ d S )Nr   zunexpected key at line %d)rc   r   rb   r   r   ri   r   r   r   r   r   r   end_key   s
   z_PlistParser.end_keyc                 C   s   g }|  | | j| d S r   )r   rb   r3   )r   r   ar   r   r   begin_array   s   
z_PlistParser.begin_arrayc                 C   s   | j   d S r   )rb   r   r   r   r   r   	end_array  r$   z_PlistParser.end_arrayc                 C      |  d d S )NTr   r   r   r   r   end_true  r$   z_PlistParser.end_truec                 C   r   )NFr   r   r   r   r   	end_false  r$   z_PlistParser.end_falsec                 C   sB   |   }|ds|dr| t|d d S | t| d S )N0x0X   )r   
startswithr   r   )r   rawr   r   r   end_integer
  s   z_PlistParser.end_integerc                 C      |  t|   d S r   )r   floatr   r   r   r   r   end_real  r"   z_PlistParser.end_realc                 C   s   |  |   d S r   )r   r   r   r   r   r   
end_string  s   z_PlistParser.end_stringc                 C   r   r   )r   rB   r   r   r   r   r   end_data  r"   z_PlistParser.end_datac                 C   r   r   )r   rS   r   r   r   r   r   end_date  r"   z_PlistParser.end_dateN)r   r+   r,   r   rt   rp   rj   rl   rn   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ra      s*    	ra   c                   @   s8   e Zd ZdddZdd Zdd Zdd
dZdd Zd	S )_DumbXMLWriterr	   	c                 C   s   || _ g | _|| _|| _d S r   )filerb   _indent_levelindent)r   r   indent_levelr   r   r   r   r     rh   z_DumbXMLWriter.__init__c                 C   s,   | j | | d|  |  jd7  _d S )Nz<%s>   )rb   r3   writelnr   r   r~   r   r   r   begin_element%  s   z_DumbXMLWriter.begin_elementc                 C   s@   | j dksJ | j |ksJ |  j d8  _ | d|  d S )Nr	   r   z</%s>)r   rb   r   r   r   r   r   r   end_element*  s   z_DumbXMLWriter.end_elementNc                 C   s:   |d urt |}| d|||f  d S | d|  d S )Nz<%s>%s</%s>z<%s/>)r`   r   )r   r~   rw   r   r   r   simple_element0  s   z_DumbXMLWriter.simple_elementc                 C   sH   |rt |tr|d}| j| j| j  | j| | jd d S )Nr>      
)r   r?   rA   r   writer   r   )r   liner   r   r   r   8  s   

z_DumbXMLWriter.writeln)r	   r   r   )r   r+   r,   r   r   r   r   r   r   r   r   r   r     s    

r   c                   @   sB   e Zd Z		dddZdd	 Zd
d Zdd Zdd Zdd ZdS )_PlistWriterr	      	r   TFc                 C   s.   |r| t t| ||| || _|| _d S r   )r   PLISTHEADERr   r   
_sort_keys	_skipkeys)r   r   r   r   writeHeader	sort_keysskipkeysr   r   r   r   E  s
   

z_PlistWriter.__init__c                 C   s"   |  d | | |  d d S )Nz<plist version="1.0">z</plist>)r   write_valuer   r   r   r   r   O  s   

z_PlistWriter.writec                 C   s(  t |tr| d| d S |du r| d d S |du r#| d d S t |trEd|  kr2dk rAn t|| dd	|  d S t|t |trT| d
t| d S t |tr`| | d S t |t	t
frn| | d S t |tjr~| dt| d S t |ttfr| | d S tdt| )NstringTtrueFfalsel         r   integerz%drealdatezunsupported type: %s)r   r?   r   r   OverflowErrorr   r    dict
write_dictbytes	bytearraywrite_bytesrM   rU   tuplelistwrite_arrayr   r   r   r   r   r   r   T  s,   



z_PlistWriter.write_valuec                 C   sz   |  d |  jd8  _tddt| jdd| j  }t||dD ]	}|r.| | q%|  jd7  _| 	d d S )Nr   r   r   r-   r   s           r   )
r   r   maxr2   r   r]   r=   splitr   r   )r   r   r8   r   r   r   r   r   v  s   

z_PlistWriter.write_bytesc                 C   s   |r;|  d | jrt| }n| }|D ]\}}t|ts(| jr$qtd| d| | 	| q| 
d d S | d d S )Nr   keys must be stringsrQ   )r   r   sorteditemsr   r?   r   r   r   r   r   )r   rT   r   rQ   rw   r   r   r   r     s   

z_PlistWriter.write_dictc                 C   s>   |r|  d |D ]}| | q	| d d S | d d S )Narray)r   r   r   r   )r   r   rw   r   r   r   r     s   
z_PlistWriter.write_arrayN)r	   r   r   TF)	r   r+   r,   r   r   r   r   r   r   r   r   r   r   r   D  s    

"r   c                 C   s   d}|D ]
}|  |r dS qtjdftjdftjdffD ]'\}}|  |s'q|D ]}||d| }| d t| |krC  dS q)qdS )N)s   <?xmls   <plistTr>   z	utf-16-bez	utf-16-leasciiF)r   codecsBOM_UTF8BOM_UTF16_BEBOM_UTF16_LEdecoderA   r2   )headerprefixespfxbomencodingstartprefixr   r   r   _is_fmt_xml  s$   

r   c                   @   s   e Zd ZdddZdS )r   Invalid filec                 C   s   t | | d S r   )r   r   )r   messager   r   r   r     r   zInvalidFileException.__init__N)r   )r   r+   r,   r   r   r   r   r   r     s    r   BHLQ)r      r.      c                   @   sH   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dS )_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                 C   s
   || _ d S r   )re   rf   r   r   r   r     r*   z_BinaryPlistParser.__init__c                 C   s   z?|| _ | j dtj | j d}t|dkrt td|\}| _	}}}| j | | 
||| _tg| | _| |W S  tttjttfyO   t w )Ni    z>6xBBQQQ)_fpseekosSEEK_ENDreadr2   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_offsetr   r   r   rt     s&   


z_BinaryPlistParser.parsec                 C   sL   |dkr$| j dd d@ }d|> }dt|  }t|| j |d S |S )z$ return the size of the next object.   r   r	   r/   rZ   )r   r   _BINARY_FORMATr   r   )r   tokenLr_   r7   fr   r   r   	_get_size  s   z_BinaryPlistParser._get_sizec                 C   s\   t |t}| j|}	 t||krt||kr|S t ||| }|| j|7 }||7 }qr   )min_MIN_READ_BUF_SIZEr   r   r2   r   )r   sizecursizer   deltar   r   r   _read  s   
z_BinaryPlistParser._readc                    s^   |  |  tv rtd| t   S st t fddtd| D S )NrZ   c                 3   s(    | ]}t  ||  d V  qdS )bigN)r   
from_bytes).0r;   r   r  r   r   	<genexpr>  s     z0_BinaryPlistParser._read_ints.<locals>.<genexpr>r	   )r  r   r   r   r   r   r1   )r   nr  r   r
  r   r     s   z_BinaryPlistParser._read_intsc                 C   s   |  || jS r   )r   r   )r   r  r   r   r   
_read_refs  r$   z_BinaryPlistParser._read_refsc                    s   j | }|tur|S  j| } j|  jdd }|d@ |d@ }}|dkr/d}n|dkr7d}n|dkr?d	}n|dkrGd
}n|dkr\tj jd|> d|dkd}n|dkrmt	d jdd }n|dkr~t	d jdd }n|dkrt	d jdd }t

dddt
j|d }n|dkr |} |}n|dkr |} |}	|	d}n|dkrՈ |d } |}	|	d}ny|dkrtt jd| d}nf|dkr |} |}
g }| j |< | fdd |
D  nC|d!krK |} |} |}
  }| j |< zt||
D ]\}} || |< q.W n tyJ   t w t | j |< |S )"zx
        read the object by reference.

        May recursively read sub-objects (content of an array/dict/set)
        r   r	      r   Nr   F	   Tr0   r   r  r/   signed"   z>fr.   #   z>d3     )seconds@   P   r   `   r   utf-16be      c                 3   s    | ]}  |V  qd S r   )r   )r	  xr   r   r   r  X  s    z2_BinaryPlistParser._read_object.<locals>.<genexpr>   )r   r   r   r   r   r   r   r  r   r   rM   	timedeltar   r  r   r   r  extendre   zipr   r   r   )r   refresultoffsettokentokenHr   r   r7   r   obj_refskey_refskor   r   r   r     s~   
















z_BinaryPlistParser._read_objectN)r   r+   r,   __doc__r   rt   r   r  r   r  r   r   r   r   r   r     s    

r   c                 C   s(   | dk rdS | dk rdS | dk rdS dS )N   r      r           r.   r   r   )countr   r   r   _count_to_sizeq  s   r0  c                   @   r   )_BinaryPlistWriterc                 C   s   || _ || _|| _d S r   )r   r   r   )r   r   r   r   r   r   r   r     s   
z_BinaryPlistWriter.__init__c           
      C   s   g | _ i | _i | _| | t| j }dg| | _t|| _t| j | _	| j
d | j D ]}| | q-| |}| j
 }t|}dt| |  }| j
tj|g| jR   d}||| j|||f}	| j
tjdg|	R   d S )Nr	      bplist00rZ   z	>5xBBBQQQ)_objlist	_objtable_objidtable_flattenr2   r   r0  r   r   _ref_formatr   r   _write_object
_getrefnumtellr   pack)
r   rw   r   objr   r   r   offset_formatsort_versionr   r   r   r   r     s*   






z_BinaryPlistWriter.writec           	      C   s$  t |trt||f| jv rd S n	t|| jv rd S t| j}| j| t |tr4|| jt||f< n|| jt|< t |t	r}g }g }|
 }| jrOt|}|D ]\}}t |tsb| jr^qQtd|| || qQt||D ]}| | qsd S t |ttfr|D ]	}| | qd S d S )Nr   )r   _scalarsr   r4  idr5  r2   r3  r3   r   r   r   r   r?   r   r   	itertoolschainr6  r   r   )	r   rw   refnumkeysvaluesr   r)  vr*  r   r   r   r6    s@   





z_BinaryPlistWriter._flattenc                 C   s*   t |tr| jt||f S | jt| S r   )r   r?  r4  r   r5  r@  r   r   r   r   r9    s   
z_BinaryPlistWriter._getrefnumc                 C   s   |dk r| j td||B  d S |dk r&| j td|dB d| d S |dk r:| j td|dB d| d S |d	k rN| j td
|dB d| d S | j td|dB d| d S )Nr   z>Br,  z>BBBr   r-  z>BBH   r.  z>BBL   z>BBQ   )r   r   r   r;  )r   r%  r  r   r   r   _write_size  s       z_BinaryPlistWriter._write_sizec                    sj    |} j  j|< |d u r jd d S |du r% jd d S |du r1 jd d S t|tr|dk rVz jtdd| W d S  tj	yU   t
|d w |d	k rg jtd
d| d S |dk rx jtdd| d S |dk r jtdd| d S |dk r jtdd| d S |dk r jd|jdddd  d S t
|t|trĈ jtdd| d S t|tjr|tddd  } jtdd| d S t|ttfr dt|  j| d S t|tr0z|d} dt| W n ty'   |d } d!t|d"  Y nw  j| d S t|tr|jdk r@td#|jd	k rS jtd
d$| d S |jdk rf jtdd%| d S |jdk ry jtdd&| d S |jdk r jtdd'| d S t
|t|ttfr fd(d)|D }t|} d*|  jtjd+ j|  g|R   d S t|tr1g g }} jrt| }	n| }	|	D ]%\}
}t|
ts j rqt!d,|"  |
 |"  | qt|} d-|  jtjd+ j|  g|R    jtjd+ j|  g|R   d S t!|).N    F   Tr   r	   z>BqrI  r,  z>BBr   r-  z>BHrG  r.  z>BLrH  l            z>BQr      r  r  z>Bdr  r  r   r  r  r   r  r  r  r   r   r           c                    s   g | ]}  |qS r   )r9  )r	  r*  r   r   r   
<listcomp>6  s    z4_BinaryPlistWriter._write_object.<locals>.<listcomp>r  rZ   r   r  )#r9  r   r:  r   r   r   r   r   r;  r   r   to_bytesr   rM   total_secondsr   r   rJ  r2   r?   rA   UnicodeEncodeErrorr   r   r   r   r   r7  r   r   r   r   r   r   r3   )r   rw   r"  r   trefsr7   keyRefsvalRefs	rootItemsr)  rF  r   r   r   r8    s   


 


(
$(z _BinaryPlistWriter._write_objectN)	r   r+   r,   r   r   r6  r9  rJ  r8  r   r   r   r   r1    s    -*r1  c                 C   s   | d d dkS )Nr   r2  r   )r   r   r   r   _is_fmt_binaryT  r   rZ  )detectri   writerfmtrg   c                C   sj   |du r%|  d}| d t D ]}|d |r |d } nqt nt| d }||d}|| S )zRead a .plist file. 'fp' should be a readable and binary file object.
    Return the unpacked root object (which usually is a dictionary).
    Nr   r	   r[  ri   )rg   )r   r   _FORMATSrE  r   rt   )r   r^  rg   r   infoPpr   r   r   r   j  s   



r   c                C   s   t | }t|||dS )zqRead a .plist file from a bytes object.
    Return the unpacked root object (which usually is a dictionary).
    r]  )r
   r   )rw   r^  rg   r   r   r   r   r     s   r   TF)r^  r   r   c                C   s:   |t vrtd|f t | d |||d}||  dS )zWWrite 'value' to a .plist file. 'fp' should be a writable,
    binary file object.
    zUnsupported format: %rr\  )r   r   N)r_  r   r   )rw   r   r^  r   r   r\  r   r   r   r     s   r   r^  r   r   c                C   s    t  }t| ||||d | S )z?Return a bytes object with the contents for a .plist file.
    rc  )r
   r   getvalue)rw   r^  r   r   r   r   r   r   r     s   r   )r-   ):r+  __all__r4   r   rM   enumior
   rA  r   rer   xml.parsers.expatr   Enumr   r   globalsupdate__members__r  r   r   compiler[   r=   rB   ASCIIrJ   rS   rU   r`   ra   r   r   r   r   r   r   objectr   r   r0  r?   r   r   r   r?  r1  rZ  r   r   r   r_  r   r   r   r   r   r   r   r   <module>   sn    8!
	
n&^! ' U	