
    .PhM                        d dl Z d dlZd dlmZ d dlmZmZmZ d dlm	Z	  G d de
          Z G d de          Zej        ej        d	Z G d
 de          Z G d de          Z G d de          Zd Z G d d          Z G d de          Z G d de          Z edd           edd           edd           e             edd           edd           edd            edd!           edd"           e            d#
Z G d$ d%          Z G d& d'e          Ze                     eed(                    e             eed)                   d*            G d+ d,          Z G d- d.e          Z G d/ d0          Z G d1 d2          Zd3 Zd4 Z  e eed)          e            g                    Z!d5 Z"d6d7d7d7d(d7d7d8d(d9	Z#d: Z$ G d; d<          Z% G d= d>          Z& G d? d@          Z' G dA dB          Z(dS )C    N)deque)EnumIntEnumIntFlag)Optionalc                       e Zd ZdZdS )SizeLimitErrorzRaised when trying to (de-)serialise data exceeding D-Bus' size limit.

    This is currently only implemented for arrays, where the maximum size is
    64 MiB.
    N)__name__
__module____qualname____doc__     Q/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/jeepney/low_level.pyr	   r	      s         
 	Dr   r	   c                   "    e Zd ZdZdZd Zd ZdS )
Endianness      c                 &    | t           j        u rdndS )N<>r   littleselfs    r   struct_codezEndianness.struct_code   s    z000sss:r   c                 &    | t           j        u rdndS )N   l   Br   r   s    r   	dbus_codezEndianness.dbus_code   s    
 111tt<r   N)r
   r   r   r   bigr   r    r   r   r   r   r      s<        F
C; ; ;= = = = =r   r   )r   r   c                       e Zd ZdZdZdZdZdS )MessageTyper   r         N)r
   r   r   method_callmethod_returnerrorsignalr   r   r   r#   r#      s"        KMEFFFr   r#   c                       e Zd ZdZdZdZdS )MessageFlagr   r   r%   N)r
   r   r   no_reply_expectedno_auto_startallow_interactive_authorizationr   r   r   r+   r+   $   s!        M&'###r   r+   c                   2    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
S )HeaderFieldsr   r   r$   r%               	   N)r
   r   r   path	interfacemember
error_namereply_serialdestinationsender	signatureunix_fdsr   r   r   r0   r0   *   s;        DIFJLKFIHHHr   r0   c                 &    || |z  z
  }||k    rdS |S Nr   r   )possteppads      r   paddingrD   6   s#    
#*
C
d{{qJr   c                   0    e Zd Zd ZddZd	dZd Zd ZdS )
	FixedTypec                 0    |x| _         | _        || _        d S N)size	alignmentr   )r   rI   r   s      r   __init__zFixedType.__init__>   s    %))	DN&r   r   c                     |t          || j                  z  }|                                | j        z   }t          j        ||||| j        z                      d         }||| j        z   fS r@   )rD   rJ   r   structunpackrI   )r   bufrA   
endiannessfdscodevals          r   
parse_datazFixedType.parse_dataB   sh    wsDN+++%%''$*::mD#c#	/&9":;;A>C$)O##r   Nc                     dt          || j                  z  }|                                | j        z   }|t          j        ||          z   S )N    )rD   rJ   r   rM   pack)r   datarA   rP   rQ   rC   rR   s          r   	serialisezFixedType.serialiseH   sH    gc4>222%%''$*::V[t,,,,r   c                 B    d                     | j        | j                  S )NzFixedType({!r}, {!r}))formatrI   r   r   s    r   __repr__zFixedType.__repr__M   s    &--di9IJJJr   c                 n    t          |          t          u o| j        |j        k    o| j        |j        k    S rH   )typerF   rI   r   r   others     r   __eq__zFixedType.__eq__P   s8    Uy( <tyEJ/F <%)::	<r   r   rH   )r
   r   r   rK   rT   rY   r\   ra   r   r   r   rF   rF   =   sl        ' ' '$ $ $ $- - - -
K K K< < < < <r   rF   c                   6     e Zd Z fdZd fd	Zd Zd Z xZS )Booleanc                 L    t                                          dd           d S Nr%   IsuperrK   r   	__class__s    r   rK   zBoolean.__init__V   #    C     r   r   c                 r    t                                          |||          \  }}t          |          |fS rH   )ri   rT   bool)r   rO   rA   rP   rQ   rS   new_posrk   s          r   rT   zBoolean.parse_dataY   s3    ww))#sJ??WCyy'!!r   c                     dS )Nz	Boolean()r   r   s    r   r\   zBoolean.__repr__]       {r   c                 .    t          |          t          u S rH   )r^   rd   r_   s     r   ra   zBoolean.__eq__`       E{{g%%r   rb   )r
   r   r   rK   rT   r\   ra   __classcell__rk   s   @r   rd   rd   U   st        ! ! ! ! !" " " " " "  & & & & & & &r   rd   c                   B     e Zd Z fdZd fd	Zd	 fd	Zd Zd Z xZS )
FileDescriptorc                 L    t                                          dd           d S rf   rh   rj   s    r   rK   zFileDescriptor.__init__e   rl   r   r   c                 d    t                                          |||          \  }}||         |fS rH   )ri   rT   )r   rO   rA   rP   rQ   idxro   rk   s          r   rT   zFileDescriptor.parse_datah   s1    ww))#sJ??W3x  r   Nc                    |t          d          t          |d          r|                                }t          |t                    st          |t
                    st          d          |dk     rt          d| d          |                    |           t                      
                    t          |          dz
  ||          S )Nz+Sending FDs is not supported or not enabledfilenozYCannot use {data!r} as file descriptor. Expected an int or an object with fileno() methodr   z#File descriptor can't be negative ()r   )RuntimeErrorhasattrr|   
isinstancern   int	TypeError
ValueErrorappendri   rY   len)r   rX   rA   rP   rQ   rk   s        r   rY   zFileDescriptor.serialisel   s    ;LMMM4"" 	!;;==DdD!! 	HD#)>)> 	H G H H H !88J4JJJKKK

4ww  SAsJ???r   c                     dS )NzFileDescriptor()r   r   s    r   r\   zFileDescriptor.__repr__|   s    !!r   c                 .    t          |          t          u S rH   )r^   rw   r_   s     r   ra   zFileDescriptor.__eq__   s    E{{n,,r   rb   rH   )	r
   r   r   rK   rT   rY   r\   ra   rt   ru   s   @r   rw   rw   d   s        ! ! ! ! !! ! ! ! ! !@ @ @ @ @ @ " " "- - - - - - -r   rw   r   Br   hHr%   irg   r4   qQd)
ynr   br   uxtr   r   c                   L    e Zd Zd Zed             Zd
dZd ZddZd Z	d	 Z
dS )
StringTypec                     || _         d S rH   )length_type)r   r   s     r   rK   zStringType.__init__   s    &r   c                     | j         j        S rH   )r   rI   r   s    r   rJ   zStringType.alignment   s    $$r   r   c                     | j                             |||          \  }}||z   }|||                             d          }|||dz            dk    sJ ||dz   fS )Nutf-8r   rV   )r   rT   decode)r   rO   rA   rP   rQ   lengthendrS   s           r   rT   zStringType.parse_data   sp    &11#sJGGFl#c'l!!'**3sQw;5((((C!G|r   c                 t    t          |t                    s"t          d                    |                    d S )NzExpected str, not {!r})r   strr   r[   r   rX   s     r   
check_datazStringType.check_data   s>    $$$ 	C4;;DAABBB	C 	Cr   Nc                     |                      |           |                    d          }| j                            t	          |          ||          }||z   dz   S )Nr   rV   )r   encoder   rY   r   )r   rX   rA   rP   rQ   encodedlen_datas          r   rY   zStringType.serialise   sU    ++g&&#--c'llCLL'!E))r   c                 6    d                     | j                  S )NzStringType({!r}))r[   r   r   s    r   r\   zStringType.__repr__   s    !(()9:::r   c                 N    t          |          t          u o| j        |j        k    S rH   )r^   r   r   r_   s     r   ra   zStringType.__eq__   s(    Uz) ;$(99	;r   rb   rH   )r
   r   r   rK   propertyrJ   rT   r   rY   r\   ra   r   r   r   r   r      s        ' ' ' % % X%   C C C* * * *; ; ;; ; ; ; ;r   r   c                   (     e Zd Z fdZ fdZ xZS )ObjectPathTypec                 `    t                                          t          d                    d S )Nr   )ri   rK   simple_typesrj   s    r   rK   zObjectPathType.__init__   s&    c*+++++r   c                    t                                          |           |                    d          st          d|d          |                    d          r&t          |          dk    rt          d|d          d|v rt          d|d          t          j        t          j        z   dz   t          fd	|D                       rt          d|d
          d S )N/zObject path (z) must start with /r   z) cannot end with /z//z) cannot contain double /z/_c              3       K   | ]}|vV  	d S rH   r   ).0cvalid_charss     r   	<genexpr>z,ObjectPathType.check_data.<locals>.<genexpr>   s(      22q#222222r   z)) can only contain A-Z, a-z, 0-9, / and _)
ri   r   
startswithr   endswithr   stringascii_lettersdigitsany)r   rX   r   rk   s     @r   r   zObjectPathType.check_data   s   4   s## 	JHTHHHIII== 	J#d))a--HTHHHIII4<<NTNNNOOO*V]:TA2222T22222 	QQQQ  	 	r   )r
   r   r   rK   r   rt   ru   s   @r   r   r      sQ        , , , , ,        r   r   r   r   )sogc                   4    e Zd ZdZd Zd	dZd
dZd Zd ZdS )Structr4   c                 d    t          d |D                       rt          d          || _        d S )Nc              3   @   K   | ]}t          |t                    V  d S rH   )r   	DictEntry)r   fs     r   r   z"Struct.__init__.<locals>.<genexpr>   s,      88Az!Y''888888r   zFound dict entry outside array)r   r   fields)r   r   s     r   rK   zStruct.__init__   s;    8888888 	><===r   r   c                     |t          |d          z  }g }| j        D ]3}|                    ||||          \  }}|                    |           4t	          |          |fS )Nr4   rQ   )rD   r   rT   r   tuple)r   rO   rA   rP   rQ   resfieldvs           r   rT   zStruct.parse_data   sk    wsA[ 	 	E%%c3
%DDFAsJJqMMMMSzz3r   Nc           	         t          |t                    s"t          d                    |                    t	          |          t	          | j                  k    rBt          d                    t	          |          t	          | j                                      dt          || j                  z  }|t	          |          z  }g }t          || j                  D ]I\  }}|
                    |                    ||||                     |t	          |d                   z  }J|d                    |          z   S )NzExpected tuple, not {!r}z{} entries for {} fieldsrV   r   r   )r   r   r   r[   r   r   r   rD   rJ   zipr   rY   join)	r   rX   rA   rP   rQ   rC   
res_piecesitemr   s	            r   rY   zStruct.serialise   s)   $&& 	E6==dCCDDDt99DK((((7>>D		3t{++     gc4>222s3xx
tT[11 	' 	'KD%eoodCoMMNNN3z"~&&&CCSXXj))))r   c                 \    d                     t          |           j        | j                  S )Nz{}({!r}))r[   r^   r
   r   r   s    r   r\   zStruct.__repr__   s#      d!4dkBBBr   c                 ^    t          |          t          |           u o| j        |j        k    S rH   )r^   r   r_   s     r   ra   zStruct.__eq__   s'    UtDzz)Lu|0KLr   rb   rH   )	r
   r   r   rJ   rK   rT   rY   r\   ra   r   r   r   r   r      sv        I  
   * * * *C C CM M M M Mr   r   c                        e Zd Z fdZ xZS )r   c                 \   t          |          dk    rt          dt          |          z            t          |d         t          t          f          s5t          d                    t          |d                                       t                                          |           d S )Nr   z%Dict entry must have 2 fields, not %dr   z5First field in dict entry must be simple type, not {})	r   r   r   rF   r   r[   r^   ri   rK   )r   r   rk   s     r   rK   zDictEntry.__init__   s    v;;!7#f++EG G G&)i%<== 	*GVAY((* * * 	     r   )r
   r   r   rK   rt   ru   s   @r   r   r      s8        ! ! ! ! ! ! ! ! !r   r   c                   L    e Zd ZdZ edd          Zd Zd
dZddZd Z	d	 Z
dS )Arrayr%   rg   c                     || _         d S rH   )elt_type)r   r   s     r   rK   zArray.__init__  s     r   r   c                    | j                             |||          \  }}|t          || j        j                  z  }||z   }| j        t
          d         k    r|||         |fS g }||k     r<| j                            ||||          \  }}|                    |           ||k     <t          | j        t                    rt          |          }||fS )Nr   r   )
r   rT   rD   r   rJ   r   r   r   r   dict)	r   rO   rA   rP   rQ   r   r   r   r   s	            r   rT   zArray.parse_data  s    &11#sJGGwsDM3444Fl=L---s3w<$$Cii]--c3
-LLFAsJJqMMM Cii dmY// 	s))CCxr   Nc           	         d}t          | j        t                    r*t          |t                    r|                                }ne| j        t
          d         k    rt          |t                    rd}n7t          |t                    s"t          d	                    |                    t          | j        t                    r/| j        j        t          |          z  dk    rt          d          t          || j                  }||z   dz   }t          || j        j                  }|r|}	n||z   }
|
dz   }g }|D ]`}|                    | j                            ||
||                     |
t          |d	                   z  }
|
|k    rt          d          ad
                    |          }	| j                            t          |	          ||z   |          }d|z  |z   d|z  z   |	z   S )NFr   TzNot suitable for array: {!r}i   zArray size exceeds 64 MiB limitr%   r   r   r   rV   )r   r   r   r   itemsr   byteslistr   r[   rF   rI   r   r	   rD   rJ   r   rY   r   r   )r   rX   rA   rP   rQ   data_is_bytespad1pos_after_lengthpad2rO   data_pos	limit_poschunksr   r   s                  r   rY   zArray.serialise  s   dmY// 	IJtT4J4J 	I::<<DDm|C000ju6M6M0 MMD$'' 	I:AA$GGHHH dmY// 	H"SYY.%77$%FGGGsDN++:>')@AA 	#CC'$.H 7*IF L Ldm55(JC 6      Cr
OO+i''()JKKK (((6""C#--c#hhD*MM (EDL9C??r   c                 6    d                     | j                  S )NzArray({!r}))r[   r   r   s    r   r\   zArray.__repr__<  s    ##DM222r   c                 N    t          |          t          u o| j        |j        k    S rH   )r^   r   r   r_   s     r   ra   zArray.__eq__?  s!    Uu$K4=EN+JKr   rb   rH   )r
   r   r   rJ   rF   r   rK   rT   rY   r\   ra   r   r   r   r   r      s        I)As##K! ! !   $$@ $@ $@ $@L3 3 3L L L L Lr   r   c                   .    e Zd ZdZddZd	dZd Zd ZdS )
Variantr   r   c                     t           d                             |||          \  }}t          t          |                    }|                    ||||          \  }}||f|fS Nr   r   )r   rT   parse_signaturer   )r   rO   rA   rP   rQ   sigvaltyperS   s           r   rT   zVariant.parse_dataF  sc    $//S*EES!$s)),,%%c3
%DDSSz3r   Nc                     |\  }}t          t          |                    }t          d                             |||          }||                    ||t	          |          z   ||          z   S r   )r   r   r   rY   r   )r   rX   rA   rP   rQ   r   r   sig_bufs           r   rY   zVariant.serialiseO  sr    	T!$s)),,s#--c3
CC**#G$jc + 
 
 
 	
r   c                     dS )Nz	Variant()r   r   s    r   r\   zVariant.__repr__W  rq   r   c                 .    t          |          t          u S rH   )r^   r   r_   s     r   ra   zVariant.__eq__Z  rs   r   rb   rH   )r
   r   r   rJ   rT   rY   r\   ra   r   r   r   r   r   C  s_        I   
 
 
 
  & & & & &r   r   c                 p   |                      d          }|dk    rt          t          |                     S |dk    rt                      S |dk    r`g }| d         dk    r.|                    t          |                      | d         dk    .|                      d           t          |          S |dk    r`g }| d         dk    r.|                    t          |                      | d         dk    .|                      d           t          |          S |dv rt          d	          t          |         S )
z-Parse a symbolic signature into objects.
    r   ar   (r}   {}z)}zUnexpected end of struct)	popr   r   r   r   r   r   r   r   )r   tokenr   des       r   r   r   ]  s&    GGAJJE||_S))***||yy	#!fmmMM/#../// !fmm


f~~	#!fmmIIoc**+++ !fmm


}}	$3444E""r   c                 `   t          j        d| d d                   \  }t          |         }t          j        |                                dz   | dd                   \  }t          j        |                                dz   | dd                   \  }d|z   }|t	          |d          z   |z   S )Nr   r   rg   r%   r4         )rM   rN   
endian_mapr   rD   )rO   endianbody_lengthfields_array_len
header_lens        r   calc_msg_sizer  x  s    mCRaR))GFF=!3!3!5!5!;S1XFFLKf&8&8&:&:S&@#be*MM&&J
A...<<r   c                 \    t                               | d|          \  }}d |D             |fS )Nr   c                 @    i | ]\  }}t          |          |d          S )r   )r0   )r   kr   s      r   
<dictcomp>z'parse_header_fields.<locals>.<dictcomp>  s(    222fq!LOOQqT222r   )_header_fields_typerT   )rO   rP   lrA   s       r   parse_header_fieldsr
    s6     ++CZ@@FAs22222C77r   r   r   r   )	r   r   r$   r%   r1   r2   r3   r4   r5   c                     d t          |                                           D             }t                              |d|          S )Nc                 @    g | ]\  }}|j         t          |         |ffS r   )valueheader_field_codes)r   r   r   s      r   
<listcomp>z+serialise_header_fields.<locals>.<listcomp>  s.    OOO6Aq!'&q)1-	.OOOr   r   )sortedr   r  rY   )r   rP   r	  s      r   serialise_header_fieldsr    s=    OOVAGGII=N=NOOOA((B
;;;r   c                   8    e Zd Zd Zd ZddZed             ZdS )Headerc                     || _         t          |          | _        t          |          | _        || _        || _        || _        || _        dS )zA D-Bus message header

        It's not normally necessary to construct this directly: use higher level
        functions and methods instead.
        N)	rP   r#   message_typer+   flagsprotocol_versionr   serialr   )r   rP   r  r  r  r   r  r   s           r   rK   zHeader.__init__  sL     %'55 ''
 0&r   c           	      ~    d                     | j        | j        | j        | j        | j        | j        | j                  S )Nz7Header({!r}, {!r}, {!r}, {!r}, {!r}, {!r}, fields={!r}))r[   rP   r  r  r  r   r  r   r   s    r   r\   zHeader.__repr__  s>    HOOOT.
!4#3T[$+O O 	Or   Nc           	         | j                                         dz   }|| j        }t          j        || j                                         | j        j        | j        | j	        | j
        |          t          | j        | j                   z   S )NcBBBII)rP   r   r  rM   rW   r    r  r  r  r  r   r  r   )r   r  r   s      r   rY   zHeader.serialise  s    O''))H4>[F{1do7799,2DJ0+V5 5 *$+tGG	H 	Hr   c           	         t          j        d|d d                   \  }}}}t          |         }t          j        |                                dz   |dd                   \  }}t	          ||          \  }}	 | |||||||          |	fS )NcBBBr%   IIr   )rM   rN   r   r   r
  )
clsrO   r   msgtyper  pvbodylenr  r   rA   s
             r   from_bufferzHeader.from_buffer  s    %+]63rr7%C%C"F# -(:(:(<(<t(CS2YOO)#v66s67E2wGGLLr   rH   )r
   r   r   rK   r\   rY   classmethodr#  r   r   r   r  r    sm          O O O
H H H H M M [M M Mr   r  c                   N    e Zd ZdZd Zd Zed
dedd fd            Zddefd	Z	dS )MessagezObject representing a DBus message.

    It's not normally necessary to construct this directly: use higher level
    functions and methods instead.
    c                 "    || _         || _        d S rH   )headerbody)r   r(  r)  s      r   rK   zMessage.__init__  s    			r   c                 h    d                     t          |           j        | j        | j                  S )Nz{}({!r}, {!r}))r[   r^   r
   r(  r)  r   s    r   r\   zMessage.__repr__  s'    &&tDzz':DKSSSr   r   rO   returnc                    t                               |          \  }}|j                            t          j        d          }|t          |          k    r#t          d| dt          |           d          |d |         }d}t          j        |j        v rZ|j        t          j                 }t          t          d|z                      }|                    |||j        |          d         }t          ||          S )Nr   zMessage expects z FDs, but only z were receivedr   (%s)r   )r  r#  r   getr0   r>   r   r   r=   r   r   rT   rP   r&  )	r  rO   rQ   r(  rA   n_fdsr)  r   	body_types	            r   r#  zMessage.from_buffer  s    ((--!!,"7;;3s88Q5QQSQQQ   &5&k!V]22- 67C'Vc\(:(:;;I''S&2C'MMaPDvt$$$r   Nc                 
   | j         j        }t          j        | j         j        v rZ| j         j        t          j                 }t          t          d|z                      }|                    | j        d||          }nd}t          |          | j         _
        |r&t          |          | j         j        t          j        <   | j                             |          }dt          t          |          d          z  }||z   |z   S )a  Convert this message to bytes.

        Specifying *serial* overrides the ``msg.header.serial`` field, so a
        connection can use its own serial number without modifying the message.

        If file-descriptor support is in use, *fds* should be a
        :class:`array.array` object with type ``'i'``. Any file descriptors in
        the message will be added to the array. If the message contains FDs,
        it can't be serialised without this array.
        r-  r   r   r   )r  rV   r4   )r(  rP   r0   r=   r   r   r   rY   r)  r   r   r>   rD   )	r   r  rQ   r   r   r0  body_buf
header_bufrC   s	            r   rY   zMessage.serialise  s     '!T[%777+$\%;<C'Vc\(:(:;;I **49aS*IIHHH"%h-- 	A8;CDK|45[**&*99
ws:222C(**r   rb   )NN)
r
   r   r   r   rK   r\   r$  r   r#  rY   r   r   r   r&  r&    s         
  T T T % %e %	 % % % [%+ +% + + + + + +r   r&  c                   J    e Zd ZdZd ZddefdZd Zd Zde	e
         fd	Zd
S )Parserz8Parse DBus messages from a stream of incoming data.
    c                 H    t                      | _        g | _        d | _        d S rH   )
BufferPiperO   rQ   next_msg_sizer   s    r   rK   zParser.__init__   s"    <<!r   r   rX   c                 n    | j                             |           | j                            |           dS )z)Provide newly received data to the parserN)rO   writerQ   extend)r   rX   rQ   s      r   add_datazParser.add_data  s0    tr   c                 p    |                      |           t          t          | j        d                    S )zhFeed the parser newly read data.

        Returns a list of messages completed by the new data.
        N)r<  r   iterget_next_messager   s     r   feedzParser.feed
  s1    
 	dD.55666r   c                     | j         j        }|dk     rd|z
  S | j        ,t          | j                             d                    | _        | j        |z
  S )zHow many bytes can be received without going beyond the next message?

        This is only used with file-descriptor passing, so we don't get too many
        FDs in a single recvmsg call.
        r   )rO   bytes_bufferedr8  r  peek)r   gots     r   bytes_desiredzParser.bytes_desired  sU     h%888O%!.tx}}R/@/@!A!AD!C''r   r+  c                    | j         <| j        j        dk    r,t          | j                            d                    | _         | j         }|| j        j        |k    r| j                            |          }t                              || j                  }d| _         |j	        j
                            t          j        d          }| j        |d         | _        |S dS dS )zqParse one message, if there is enough data.

        Returns None if it doesn't have a complete message.
        Nr   r   r   )r8  rO   rB  r  rC  readr&  r#  rQ   r(  r   r.  r0   r>   )r   nmsraw_msgmsgfds_consumeds        r   r?  zParser.get_next_message   s    
 %x&",,%248==3D3D%E%E" O!8C!?!?hmmC((G%%g48%<<C!%D:,001FJJLx.DHJ O!?!?r   Nrb   )r
   r   r   r   rK   r   r<  r@  rE  r   r&  r?  r   r   r   r5  r5    s         " " "
 U    
7 7 7( ( ((7"3      r   r5  c                   \    e Zd ZdZd ZdefdZdefdZdedefdZ	defd	Z
dedefd
ZdS )r7  zA place to store received data until we can parse a complete message

    The main difference from io.BytesIO is that read & write operate at
    opposite ends, like a pipe.
    c                 :    t                      | _        d| _        d S r@   )r   r   rB  r   s    r   rK   zBufferPipe.__init__8  s    ggr   r   c                 t    | j                             |           | xj        t          |          z  c_        d S rH   )r   r   rB  r   )r   r   s     r   r:  zBufferPipe.write<  s8    1s1vv%r   nbytesc              #      K   || j         k    sJ | j        D ]+}|d |         }|t          |          z  }|V  |dk    r d S ,d S r@   )rB  r   r   )r   rO  chunks      r   
_peek_iterzBufferPipe._peek_iter@  sp      ,,,,,[ 	 	E'6'NEc%jj FKKK{{ 		 	r   r+  c                 R    d                     |                     |                    S )z=Get exactly nbytes bytes from the front without removing themr   )r   rR  r   rO  s     r   rC  zBufferPipe.peekI       xx//000r   c              #     K   || j         k    sJ 	 | j                                        }| xj         t          |          z  c_         |t          |          k    rn|t          |          z  }|V  a|d |         ||d          }}|r7| j                            |           | xj         t          |          z  c_         |V  d S rH   )rB  r   popleftr   
appendleft)r   rO  rQ  rems       r   
_read_iterzBufferPipe._read_iterM  s      ,,,,,	K''))E3u::-U##c%jj FKKK	 7F7^U677^s 	,K""3'''3s88+r   c                 R    d                     |                     |                    S )z1Take & return exactly nbytes bytes from the frontr   )r   rZ  rT  s     r   rG  zBufferPipe.read^  rU  r   N)r
   r   r   r   rK   r   r:  r   rR  rC  rZ  rG  r   r   r   r7  r7  2  s         
     &u & & & &    13 15 1 1 1 1    "13 15 1 1 1 1 1 1r   r7  ))r   rM   collectionsr   enumr   r   r   typingr   r   r	   r   r   r!   r   r#   r+   r0   rD   rF   rd   rw   r   r   r   updater   r   r   r   r   r  r  r
  r  r  r  r&  r5  r7  r   r   r   <module>r`     s           ' ' ' ' ' ' ' ' ' '      	 	 	 	 	Z 	 	 	= = = = = = = = %Z^<<
    $   ( ( ( ( (' ( ( (	 	 	 	 	7 	 	 	  < < < < < < < <0& & & & &i & & &- - - - -Y - - -@ 
1c			1c			1c				1c			1c			1c			1c			1c					 ; ; ; ; ; ; ; ;B    Z   &   	L%	&	&				L%	&	&    #M #M #M #M #M #M #M #ML	! 	! 	! 	! 	! 	! 	! 	!CL CL CL CL CL CL CL CLL& & & & & & & &4# # #6= = = eFFL$5wwyy#ABBCC 8 8 8 








 
 < < <
%M %M %M %M %M %M %M %MP7+ 7+ 7+ 7+ 7+ 7+ 7+ 7+t2 2 2 2 2 2 2 2j.1 .1 .1 .1 .1 .1 .1 .1 .1 .1r   