
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
U
    ¡ê,aÅ{  ã                   @   s  d dddgZ ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZ ddl
mZmZ dd	lmZ ejZz$ddlZdd
lmZmZmZmZ W n$ ek
rÊ   ejdkrÂ‚ dZY nX dZdZe ¡ ZdZdgZeedƒrþdZedg7 Zejdk�rdZedg7 Zefdd„Z dd„ Z!dd„ Z"dd„ Z#dd„ Z$G dd„ dƒZ%e�rhG dd„ de%ƒZ&G dd „ d e%ƒZ'G d!d„ de(ƒZ)dOd"d „Z*ejdk�rªdPd$d„Z+n
dQd%d„Z+G d&d'„ d'e(ƒZ,d(d)„ Z-ejdk�rðG d*d+„ d+e(ƒZ.d,d-„ Z/d.Z0d/Z1d0Z2d1Z3d2d3„ Z4d4d5„ Z5G d6d7„ d7e(ƒZ6d8d9„ Z7d:d;„ Z8G d<d=„ d=e)ƒZ9d>d?„ Z:ejdk�rtd@dA„ Z;ej<ej=hZ>dRdBd„Z?n,ddl@Z@ee@dCƒ�r�e@jAZBne@jCZBdSdDd„Z?ejdk�rædEdF„ ZDdGdH„ ZEe Fe'eD¡ dIdJ„ ZGdKdL„ ZHe Fe&eG¡ ndMdF„ ZDdNdH„ ZEe Fe'eD¡ dS )TÚClientÚListenerÚPipeÚwaité    Né   )Úutil)ÚAuthenticationErrorÚBufferTooShort)Ú	reduction)ÚWAIT_OBJECT_0ÚWAIT_ABANDONED_0ÚWAIT_TIMEOUTÚINFINITEÚwin32i    g      4@ÚAF_INETÚAF_UNIXÚAF_PIPEc                 C   s   t  ¡ |  S ©N©ÚtimeÚ	monotonic)Útimeout© r   ú?/opt/alt/python38/lib64/python3.8/multiprocessing/connection.pyÚ_init_timeout;   s    r   c                 C   s   t  ¡ | kS r   r   )Útr   r   r   Ú_check_timeout>   s    r   c                 C   sX   | dkrdS | dkr&t jdt ¡ d�S | dkrLt jdt ¡ ttƒf dd�S td	ƒ‚d
S )z?
    Return an arbitrary free address for the given family
    r   )Z	localhostr   r   z	listener-)ÚprefixÚdirr   z\\.\pipe\pyc-%d-%d-Ú zunrecognized familyN)	ÚtempfileZmktempr   Zget_temp_dirÚosÚgetpidÚnextÚ_mmap_counterÚ
ValueError©Úfamilyr   r   r   Úarbitrary_addressE   s    ÿÿr(   c                 C   sJ   t jdkr| dkrtd|  ƒ‚t jdkrF| dkrFtt| ƒsFtd|  ƒ‚dS )zD
    Checks if the family is valid for the current environment.
    r   r   zFamily %s is not recognized.r   N)ÚsysÚplatformr%   ÚhasattrÚsocketr&   r   r   r   Ú_validate_familyS   s
    
r-   c                 C   sT   t | ƒtkrdS t | ƒtkr*|  d¡r*dS t | ƒtks@t | ¡rDdS td|  ƒ‚dS )z]
    Return the types of the address

    This can be 'AF_INET', 'AF_UNIX', or 'AF_PIPE'
    r   z\\r   r   zaddress type of %r unrecognizedN)ÚtypeÚtupleÚstrÚ
startswithr   Úis_abstract_socket_namespacer%   )Úaddressr   r   r   Úaddress_type_   s    r4   c                   @   s¾   e Zd ZdZd+dd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	e
dd„ ƒZe
dd„ ƒZe
dd„ ƒZdd„ Zdd„ Zd,dd„Zdd„ Zd-dd„Zd.d d!„Zd"d#„ Zd/d%d&„Zd'd(„ Zd)d*„ ZdS )0Ú_ConnectionBaseNTc                 C   s>   |  ¡ }|dk rtdƒ‚|s(|s(tdƒ‚|| _|| _|| _d S )Nr   zinvalid handlez6at least one of `readable` and `writable` must be True)Ú	__index__r%   Ú_handleÚ	_readableÚ	_writable)ÚselfÚhandleÚreadableÚwritabler   r   r   Ú__init__u   s    ÿz_ConnectionBase.__init__c                 C   s   | j d k	r|  ¡  d S r   ©r7   Ú_close©r:   r   r   r   Ú__del__‚   s    
z_ConnectionBase.__del__c                 C   s   | j d krtdƒ‚d S )Nzhandle is closed)r7   ÚOSErrorrA   r   r   r   Ú_check_closed†   s    
z_ConnectionBase._check_closedc                 C   s   | j stdƒ‚d S )Nzconnection is write-only)r8   rC   rA   r   r   r   Ú_check_readableŠ   s    z_ConnectionBase._check_readablec                 C   s   | j stdƒ‚d S )Nzconnection is read-only)r9   rC   rA   r   r   r   Ú_check_writableŽ   s    z_ConnectionBase._check_writablec                 C   s"   | j rd| _n|  ¡  tdƒ‚d S )NFzbad message length)r9   r8   ÚcloserC   rA   r   r   r   Ú_bad_message_length’   s    z#_ConnectionBase._bad_message_lengthc                 C   s
   | j dkS )z True if the connection is closedN©r7   rA   r   r   r   Úclosed™   s    z_ConnectionBase.closedc                 C   s   | j S )z"True if the connection is readable)r8   rA   r   r   r   r<   ž   s    z_ConnectionBase.readablec                 C   s   | j S )z"True if the connection is writable)r9   rA   r   r   r   r=   £   s    z_ConnectionBase.writablec                 C   s   |   ¡  | jS )z+File descriptor or handle of the connection)rD   r7   rA   r   r   r   Úfileno¨   s    z_ConnectionBase.filenoc                 C   s$   | j dk	r z|  ¡  W 5 d| _ X dS )zClose the connectionNr?   rA   r   r   r   rG   ­   s    
z_ConnectionBase.closer   c                 C   s¨   |   ¡  |  ¡  t|ƒ}|jdkr.tt|ƒƒ}t|ƒ}|dk rFtdƒ‚||k rVtdƒ‚|dkrh|| }n&|dk rztdƒ‚n|| |krŽtdƒ‚|  |||| … ¡ dS )z,Send the bytes data from a bytes-like objectr   r   zoffset is negativezbuffer length < offsetNzsize is negativezbuffer length < offset + size)rD   rF   Ú
memoryviewÚitemsizeÚbytesÚlenr%   Ú_send_bytes)r:   ÚbufÚoffsetÚsizeÚmÚnr   r   r   Ú
send_bytesµ   s"    


z_ConnectionBase.send_bytesc                 C   s$   |   ¡  |  ¡  |  t |¡¡ dS )zSend a (picklable) objectN)rD   rF   rP   Ú_ForkingPicklerÚdumps©r:   Úobjr   r   r   ÚsendÊ   s    z_ConnectionBase.sendc                 C   sJ   |   ¡  |  ¡  |dk	r(|dk r(tdƒ‚|  |¡}|dkrB|  ¡  | ¡ S )z7
        Receive bytes data as a bytes object.
        Nr   znegative maxlength)rD   rE   r%   Ú_recv_bytesrH   Úgetvalue)r:   Z	maxlengthrQ   r   r   r   Ú
recv_bytesÐ   s    
z_ConnectionBase.recv_bytesc              
   C   s¸   |   ¡  |  ¡  t|ƒ�–}|j}|t|ƒ }|dk r>tdƒ‚n||krNtdƒ‚|  ¡ }| ¡ }||| k rvt| 	¡ ƒ‚| 
d¡ | ||| || | … ¡ |W  5 Q R £ S Q R X dS )zq
        Receive bytes data into a writeable bytes-like object.
        Return the number of bytes read.
        r   znegative offsetzoffset too largeN)rD   rE   rL   rM   rO   r%   r\   Útellr	   r]   ÚseekÚreadinto)r:   rQ   rR   rT   rM   ZbytesizeÚresultrS   r   r   r   Úrecv_bytes_intoÝ   s$    



ÿz_ConnectionBase.recv_bytes_intoc                 C   s&   |   ¡  |  ¡  |  ¡ }t | ¡ ¡S )zReceive a (picklable) object)rD   rE   r\   rW   ÚloadsÚ	getbuffer)r:   rQ   r   r   r   Úrecvö   s    z_ConnectionBase.recvç        c                 C   s   |   ¡  |  ¡  |  |¡S )z/Whether there is any input available to be read)rD   rE   Ú_poll©r:   r   r   r   r   Úpollý   s    z_ConnectionBase.pollc                 C   s   | S r   r   rA   r   r   r   Ú	__enter__  s    z_ConnectionBase.__enter__c                 C   s   |   ¡  d S r   ©rG   ©r:   Úexc_typeÚ	exc_valueZexc_tbr   r   r   Ú__exit__  s    z_ConnectionBase.__exit__)TT)r   N)N)r   )rg   )Ú__name__Ú
__module__Ú__qualname__r7   r>   rB   rD   rE   rF   rH   ÚpropertyrJ   r<   r=   rK   rG   rV   r[   r^   rc   rf   rj   rk   rp   r   r   r   r   r5   r   s.   







r5   c                   @   sD   e Zd ZdZdZejfdd„Zdd„ Zddd	„Z	d
d„ Z
dd„ ZdS )ÚPipeConnectionzª
        Connection class based on a Windows named pipe.
        Overlapped I/O is used, so the handles must have been created
        with FILE_FLAG_OVERLAPPED.
        Fc                 C   s   || j ƒ d S r   rI   )r:   Z_CloseHandler   r   r   r@     s    zPipeConnection._closec              	   C   s�   t j| j|dd�\}}zHz,|t jkrBt  |jgdt¡}|tksBt	‚W n   | 
¡  ‚ Y nX W 5 | d¡\}}X |dks|t	‚|t|ƒksŒt	‚d S )NT©Ú
overlappedFr   )Ú_winapiZ	WriteFiler7   ÚGetOverlappedResultÚERROR_IO_PENDINGÚWaitForMultipleObjectsÚeventr   r   ÚAssertionErrorÚcancelrO   )r:   rQ   ÚovÚerrZnwrittenÚwaitresr   r   r   rP     s    
  ÿzPipeConnection._send_bytesNc           	      C   s2  | j rd| _ t ¡ S |d kr dnt|dƒ}zÀtj| j|dd�\}}d zHz,|tjkrpt |jgdt¡}|tkspt‚W n   | ¡  ‚ Y nX W 5 | d¡\}}|dkrÆt ¡ }| | 	¡ ¡ |£  W S |tj
krä|  ||¡£  W S X  W n: tk
�r$ } z|jtjk�rt‚n‚ W 5 d }~X Y nX tdƒ‚d S )NFé€   Trv   r   z.shouldn't get here; expected KeyboardInterrupt)Ú_got_empty_messageÚioÚBytesIOÚminrx   ÚReadFiler7   ry   Úwritere   ZERROR_MORE_DATAÚ_get_more_datarz   r{   r|   r   r   r}   r~   rC   ÚwinerrorÚERROR_BROKEN_PIPEÚEOFErrorÚRuntimeError)	r:   ÚmaxsizeZbsizer   r€   ZnreadÚfr�   Úer   r   r   r\   &  s>    
ÿ

  ÿ
zPipeConnection._recv_bytesc                 C   s.   | j st | j¡d dkrdS tt| g|ƒƒS )Nr   T)rƒ   rx   ÚPeekNamedPiper7   Úboolr   ri   r   r   r   rh   F  s
    ÿzPipeConnection._pollc                 C   s¤   |  ¡ }t ¡ }| |¡ t | j¡d }|dks6t‚|d k	rVt|ƒ| |krV|  	¡  tj
| j|dd�\}}| d¡\}}|dks†t‚||ks’t‚| |  ¡ ¡ |S )Nr   r   Trv   )re   r„   r…   rˆ   rx   r‘   r7   r}   rO   rH   r‡   ry   )r:   r   rŽ   rQ   r�   Úleftr€   Zrbytesr   r   r   r‰   L  s    
zPipeConnection._get_more_data)N)rq   rr   rs   Ú__doc__rƒ   rx   ÚCloseHandler@   rP   r\   rh   r‰   r   r   r   r   ru     s   
 ru   c                   @   s|   e Zd ZdZer,ejfdd„ZejZ	ej
Znejfdd„ZejZ	ejZe	fdd„Zefdd„Zd	d
„ Zddd„Zdd„ ZdS )Ú
Connectionzo
    Connection class based on an arbitrary file descriptor (Unix only), or
    a socket handle (Windows).
    c                 C   s   || j ƒ d S r   rI   ©r:   r@   r   r   r   r@   c  s    zConnection._closec                 C   s   || j ƒ d S r   rI   r—   r   r   r   r@   h  s    c                 C   s8   t |ƒ}|| j|ƒ}||8 }|dkr&q4||d … }qd S ©Nr   )rO   r7   )r:   rQ   rˆ   Ú	remainingrU   r   r   r   Ú_sendm  s    zConnection._sendc                 C   sb   t  ¡ }| j}|}|dkr^|||ƒ}t|ƒ}|dkrJ||krBt‚ntdƒ‚| |¡ ||8 }q|S )Nr   zgot end of file during message)r„   r…   r7   rO   rŒ   rC   rˆ   )r:   rS   ÚreadrQ   r;   r™   ÚchunkrU   r   r   r   Ú_recvv  s    


zConnection._recvc                 C   s„   t |ƒ}|dkrHt dd¡}t d|¡}|  |¡ |  |¡ |  |¡ n8t d|¡}|dkrr|  |¡ |  |¡ n|  || ¡ d S )Niÿÿÿú!iéÿÿÿÿú!Qi @  )rO   ÚstructZpackrš   )r:   rQ   rU   Z
pre_headerÚheaderr   r   r   rP   †  s    


zConnection._send_bytesNc                 C   s^   |   d¡}t d| ¡ ¡\}|dkr@|   d¡}t d| ¡ ¡\}|d k	rT||krTd S |   |¡S )Né   rž   rŸ   é   r    )r�   r¡   Zunpackr]   )r:   rŽ   rQ   rS   r   r   r   r\   �  s    

zConnection._recv_bytesc                 C   s   t | g|ƒ}t|ƒS r   )r   r’   )r:   r   Úrr   r   r   rh   §  s    zConnection._poll)N)rq   rr   rs   r”   rx   Ú_multiprocessingZclosesocketr@   r[   Z_writerf   Z_readr!   rG   rˆ   r›   rš   r�   rP   r\   rh   r   r   r   r   r–   \  s   	

r–   c                   @   sR   e Zd ZdZddd„Zdd„ Zdd	„ Zed
d„ ƒZedd„ ƒZ	dd„ Z
dd„ ZdS )r   z•
    Returns a listener object.

    This is a wrapper for a bound socket which is 'listening' for
    connections, or for a Windows named pipe.
    Nr   c                 C   sp   |p|rt |ƒpt}|pt|ƒ}t|ƒ |dkr>t||ƒ| _nt|||ƒ| _|d k	rft|tƒsft	dƒ‚|| _
d S )Nr   úauthkey should be a byte string)r4   Údefault_familyr(   r-   ÚPipeListenerÚ	_listenerÚSocketListenerÚ
isinstancerN   Ú	TypeErrorÚ_authkey)r:   r3   r'   ÚbacklogÚauthkeyr   r   r   r>   ·  s    ÿzListener.__init__c                 C   s>   | j dkrtdƒ‚| j  ¡ }| jr:t|| jƒ t|| jƒ |S )zz
        Accept a connection on the bound socket or named pipe of `self`.

        Returns a `Connection` object.
        Nzlistener is closed)rª   rC   Úacceptr®   Údeliver_challengeÚanswer_challenge)r:   Úcr   r   r   r±   Ç  s    

zListener.acceptc                 C   s    | j }|dk	rd| _ | ¡  dS )zA
        Close the bound socket or named pipe of `self`.
        N)rª   rG   )r:   Zlistenerr   r   r   rG   Õ  s    zListener.closec                 C   s   | j jS r   )rª   Ú_addressrA   r   r   r   r3   Þ  s    zListener.addressc                 C   s   | j jS r   )rª   Ú_last_acceptedrA   r   r   r   Úlast_acceptedâ  s    zListener.last_acceptedc                 C   s   | S r   r   rA   r   r   r   rk   æ  s    zListener.__enter__c                 C   s   |   ¡  d S r   rl   rm   r   r   r   rp   é  s    zListener.__exit__)NNr   N)rq   rr   rs   r”   r>   r±   rG   rt   r3   r·   rk   rp   r   r   r   r   r   °  s   
	

c                 C   sh   |p
t | ƒ}t|ƒ |dkr&t| ƒ}nt| ƒ}|dk	rHt|tƒsHtdƒ‚|dk	rdt||ƒ t||ƒ |S )z=
    Returns a connection to the address of a `Listener`
    r   Nr§   )	r4   r-   Ú
PipeClientÚSocketClientr¬   rN   r­   r³   r²   )r3   r'   r°   r´   r   r   r   r   í  s    


Tc                 C   sj   | r>t  ¡ \}}| d¡ | d¡ t| ¡ ƒ}t| ¡ ƒ}n$t ¡ \}}t|dd�}t|dd�}||fS )úL
        Returns pair of connection objects at either end of a pipe
        TF©r=   ©r<   )r,   Z
socketpairÚsetblockingr–   Údetachr!   Úpipe)ÚduplexÚs1Ús2Úc1Úc2Zfd1Zfd2r   r   r   r     s    

c              
   C   sî   t dƒ}| r*tj}tjtjB }tt }}ntj}tj}dt }}t ||tjB tj	B tj
tjB tjB d||tjtj¡}t ||dtjtjtjtj¡}t |tjdd¡ tj|dd�}| d¡\}	}
|
dksÎt‚t|| d�}t|| d�}||fS )	rº   r   r   r   NTrv   r»   r¼   )r(   rx   ÚPIPE_ACCESS_DUPLEXÚGENERIC_READÚGENERIC_WRITEÚBUFSIZEZPIPE_ACCESS_INBOUNDÚCreateNamedPipeÚFILE_FLAG_OVERLAPPEDÚFILE_FLAG_FIRST_PIPE_INSTANCEÚPIPE_TYPE_MESSAGEÚPIPE_READMODE_MESSAGEÚ	PIPE_WAITÚNMPWAIT_WAIT_FOREVERÚNULLÚ
CreateFileÚOPEN_EXISTINGÚSetNamedPipeHandleStateÚConnectNamedPipery   r}   ru   )rÀ   r3   ZopenmodeÚaccessZobsizeZibsizeZh1Zh2rw   Ú_r€   rÃ   rÄ   r   r   r   r     sV    
 ÿ
ÿ   ù	     þ   ÿc                   @   s*   e Zd ZdZd
dd„Zdd„ Zdd„ Zd	S )r«   zO
    Representation of a socket which is bound to an address and listening
    r   c                 C   sÈ   t   tt |ƒ¡| _zRtjdkr2| j t jt jd¡ | j d¡ | j 	|¡ | j 
|¡ | j ¡ | _W n  tk
r„   | j ¡  ‚ Y nX || _d | _|dkr¾t |¡s¾tj| tj|fdd�| _nd | _d S )NÚposixr   Tr   r   ©ÚargsZexitpriority)r,   ÚgetattrÚ_socketr!   ÚnameZ
setsockoptZ
SOL_SOCKETZSO_REUSEADDRr½   ZbindZlistenZgetsocknamerµ   rC   rG   Z_familyr¶   r   r2   ÚFinalizeÚunlinkÚ_unlink)r:   r3   r'   r¯   r   r   r   r>   G  s0    

 ÿ
   ÿ
zSocketListener.__init__c                 C   s&   | j  ¡ \}| _| d¡ t| ¡ ƒS )NT)rÛ   r±   r¶   r½   r–   r¾   ©r:   Úsr   r   r   r±   `  s    
zSocketListener.acceptc                 C   s0   z| j ¡  W 5 | j }|d k	r*d | _ |ƒ  X d S r   )rß   rÛ   rG   )r:   rÞ   r   r   r   rG   e  s    zSocketListener.closeN)r   )rq   rr   rs   r”   r>   r±   rG   r   r   r   r   r«   C  s   
r«   c              
   C   sP   t | ƒ}t tt|ƒ¡�.}| d¡ | | ¡ t| ¡ ƒW  5 Q R £ S Q R X dS )zO
    Return a connection object connected to the socket given by `address`
    TN)r4   r,   rÚ   r½   Zconnectr–   r¾   )r3   r'   rá   r   r   r   r¹   o  s
    

r¹   c                   @   s8   e Zd ZdZddd„Zddd„Zdd	„ Zed
d„ ƒZdS )r©   z0
        Representation of a named pipe
        Nc                 C   sL   || _ | jdd�g| _d | _t d| j ¡ tj| tj| j| j fdd�| _	d S )NT)Úfirstz listener created with address=%rr   rØ   )
rµ   Ú_new_handleÚ_handle_queuer¶   r   Ú	sub_debugrÝ   r©   Ú_finalize_pipe_listenerrG   )r:   r3   r¯   r   r   r   r>   ƒ  s     
 þzPipeListener.__init__Fc              
   C   sH   t jt jB }|r|t jO }t  | j|t jt jB t jB t j	t
t
t jt j¡S r   )rx   rÅ   rÊ   rË   rÉ   rµ   rÌ   rÍ   rÎ   ZPIPE_UNLIMITED_INSTANCESrÈ   rÏ   rÐ   )r:   râ   Úflagsr   r   r   rã   Ž  s    
 
ÿ   ûzPipeListener._new_handlec              
   C   sÂ   | j  |  ¡ ¡ | j  d¡}ztj|dd�}W n0 tk
r^ } z|jtjkrN‚ W 5 d }~X Y n\X z<zt |jgdt¡}W n    | ¡  t |¡ ‚ Y nX W 5 | 	d¡\}}|dks¸t
‚X t|ƒS )Nr   Trv   F)rä   Úappendrã   Úpoprx   rÔ   rC   rŠ   ZERROR_NO_DATAry   r}   r{   r|   r   r~   r•   ru   )r:   r;   r   r�   rÖ   r€   Úresr   r   r   r±   š  s(      ÿ
zPipeListener.acceptc                 C   s$   t  d|¡ | D ]}t |¡ qd S )Nz closing listener with address=%r)r   rå   rx   r•   )Zqueuer3   r;   r   r   r   ræ   ±  s    z$PipeListener._finalize_pipe_listener)N)F)	rq   rr   rs   r”   r>   rã   r±   Ústaticmethodræ   r   r   r   r   r©     s   

r©   c              
   C   sœ   t ƒ }z6t | d¡ t | tjtjB dtjtjtjtj¡}W q‚ t	k
rz } z |j
tjtjfksht|ƒrj‚ W 5 d}~X Y qX q‚q‚ t |tjdd¡ t|ƒS )zU
        Return a connection object connected to the pipe given by `address`
        éè  r   N)r   rx   ZWaitNamedPiperÑ   rÆ   rÇ   rÐ   rÒ   rÊ   rC   rŠ   ZERROR_SEM_TIMEOUTZERROR_PIPE_BUSYr   rÓ   rÍ   ru   )r3   r   Úhr�   r   r   r   r¸   ·  s8     
   ýÿÿ   ÿr¸   é   s   #CHALLENGE#s	   #WELCOME#s	   #FAILURE#c                 C   s‚   dd l }t|tƒs$td t|ƒ¡ƒ‚t t¡}|  	t
| ¡ | ||d¡ ¡ }|  d¡}||krl|  	t¡ n|  	t¡ tdƒ‚d S )Nr   ú Authkey must be bytes, not {0!s}Úmd5é   zdigest received was wrong)Úhmacr¬   rN   r%   Úformatr.   r!   ÚurandomÚMESSAGE_LENGTHrV   Ú	CHALLENGEÚnewÚdigestr^   ÚWELCOMEÚFAILUREr   ©Z
connectionr°   rò   Úmessagerø   Zresponser   r   r   r²   Ü  s    
ÿ


r²   c                 C   s˜   dd l }t|tƒs$td t|ƒ¡ƒ‚|  d¡}|d ttƒ… tksNt	d| ƒ‚|ttƒd … }| 
||d¡ ¡ }|  |¡ |  d¡}|tkr”tdƒ‚d S )Nr   rï   rñ   zmessage = %rrð   zdigest sent was rejected)rò   r¬   rN   r%   ró   r.   r^   rO   rö   r}   r÷   rø   rV   rù   r   rû   r   r   r   r³   ë  s    
ÿ
 

r³   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚConnectionWrapperc                 C   s6   || _ || _|| _dD ]}t||ƒ}t| ||ƒ qd S )N)rK   rG   rj   r^   rV   )Ú_connÚ_dumpsÚ_loadsrÚ   Úsetattr)r:   ÚconnrX   rd   ÚattrrZ   r   r   r   r>   þ  s    
zConnectionWrapper.__init__c                 C   s   |   |¡}| j |¡ d S r   )rÿ   rþ   rV   )r:   rZ   rá   r   r   r   r[     s    
zConnectionWrapper.sendc                 C   s   | j  ¡ }|  |¡S r   )rþ   r^   r   rà   r   r   r   rf     s    
zConnectionWrapper.recvN)rq   rr   rs   r>   r[   rf   r   r   r   r   rý   ý  s   rý   c                 C   s   t  | fd d d d¡ d¡S )Nr   úutf-8)Ú	xmlrpclibrX   Úencode)rZ   r   r   r   Ú
_xml_dumps  s    r  c                 C   s   t  |  d¡¡\\}}|S )Nr  )r  rd   Údecode)rá   rZ   Úmethodr   r   r   Ú
_xml_loads  s    r
  c                   @   s   e Zd Zdd„ ZdS )ÚXmlListenerc                 C   s"   dd l ma t | ¡}t|ttƒS r˜   )Úxmlrpc.clientÚclientr  r   r±   rý   r  r
  rY   r   r   r   r±     s    
zXmlListener.acceptN)rq   rr   rs   r±   r   r   r   r   r    s   r  c                  O   s   dd l ma tt| |ŽttƒS r˜   )r  r  r  rý   r   r  r
  )rÙ   Úkwdsr   r   r   Ú	XmlClient  s    r  c                 C   s®   t | ƒ}g }|rªt |d|¡}|tkr*qªn\t|  krFtt|ƒ k rTn n
|t8 }n2t|  krptt|ƒ k r~n n
|t8 }ntdƒ‚| || ¡ ||d d … }d}q|S )NFzShould not get herer   r   )	Úlistrx   r{   r   r   rO   r   r�   rè   )Zhandlesr   ÚLÚreadyrê   r   r   r   Ú_exhaustive_wait%  s     
 
r  c           
         s^  |dkrt }n|dk rd}nt|d d ƒ}t| ƒ} i ‰g }tƒ ‰ tƒ }�z@| D �]&}zt|dƒ}	W n  tk
r„   |ˆ| ¡ < Y qPX zt	 |	ƒ dd¡\}}W n8 tk
rÖ } zd|j }}|tkrÆ‚ W 5 d}~X Y nX |t	jkrø| |¡ |ˆ|j< qP|�rjt ¡ dd… d	k�rjz| d
¡\}}W n* tk
�rP } z
|j}W 5 d}~X Y nX |�sjt|dƒ�rjd|_ˆ  |¡ d}qPtˆ ¡ |ƒ}W 5 |D ]}| ¡  �q�|D ]Œ}z| d¡\}}W n6 tk
�rð } z|j}|tk�rà‚ W 5 d}~X Y nX |t	j
k�r¤ˆ|j }ˆ  |¡ |dk�r¤t|dƒ�r¤d|_�q¤X ˆ  ‡fdd„|D ƒ¡ ‡ fdd„| D ƒS )ú—
        Wait till an object in object_list is ready/readable.

        Returns list of those objects in object_list which are ready/readable.
        Nr   rì   g      à?Trƒ   rK   é   )é   r  Fc                 3   s   | ]}ˆ | V  qd S r   r   )Ú.0rí   )Úwaithandle_to_objr   r   Ú	<genexpr>†  s     zwait.<locals>.<genexpr>c                    s   g | ]}|ˆ kr|‘qS r   r   )r  Úo)Úready_objectsr   r   Ú
<listcomp>‡  s      úwait.<locals>.<listcomp>)r   Úintr  Úsetr~   ry   rC   rŠ   Ú_ready_errorsrx   ZERROR_OPERATION_ABORTEDr|   Úaddr+   rƒ   rÚ   ÚAttributeErrorr6   r‡   rz   rè   r)   Zgetwindowsversionr  ÚkeysÚupdate)
Úobject_listr   Zov_listZready_handlesr   rÖ   r€   r�   r  rK   r   )r  r  r   r   ;  sh    







ÚPollSelectorc              
   C   s˜   t ƒ �ˆ}| D ]}| |tj¡ q|dk	r4t ¡ | }| |¡}|r\dd„ |D ƒW  5 Q R £ S |dk	r4|t ¡  }|dk r4|W  5 Q R £ S q4W 5 Q R X dS )r  Nc                 S   s   g | ]\}}|j ‘qS r   )Zfileobj)r  ÚkeyZeventsr   r   r   r  ¥  s     r  r   )Ú_WaitSelectorÚregisterÚ	selectorsZ
EVENT_READr   r   Zselect)r%  r   ZselectorrZ   Zdeadliner  r   r   r   r   •  s    
c              
   C   sZ   |   ¡ }t |tjtj¡�6}ddlm} | |¡}t|| j	| j
ffW  5 Q R £ S Q R X d S )Nr   )Úresource_sharer)rK   r,   Zfromfdr   ZSOCK_STREAMr   r+  Z	DupSocketÚrebuild_connectionr<   r=   )r  r;   rá   r+  Údsr   r   r   Úreduce_connection±  s
    
r.  c                 C   s   |   ¡ }t|  ¡ ||ƒS r   ©r¾   r–   )r-  r<   r=   Zsockr   r   r   r,  ·  s    r,  c                 C   sB   | j rtjnd| jrtjndB }t |  ¡ |¡}t|| j | jffS r˜   )	r<   rx   ZFILE_GENERIC_READr=   ZFILE_GENERIC_WRITEr
   Z	DupHandlerK   Úrebuild_pipe_connection)r  rÕ   Údhr   r   r   Úreduce_pipe_connection¼  s
    ÿr2  c                 C   s   |   ¡ }t|||ƒS r   )r¾   ru   )r1  r<   r=   r;   r   r   r   r0  Á  s    r0  c                 C   s    t  |  ¡ ¡}t|| j| jffS r   )r
   ZDupFdrK   r,  r<   r=   )r  Údfr   r   r   r.  Ç  s    c                 C   s   |   ¡ }t|||ƒS r   r/  )r3  r<   r=   Úfdr   r   r   r,  Ê  s    )NN)T)T)N)N)IÚ__all__r„   r!   r)   r,   r¡   r   r    Ú	itertoolsr¦   r   r   r   r	   Úcontextr
   ZForkingPicklerrW   rx   r   r   r   r   ÚImportErrorr*   rÈ   ZCONNECTION_TIMEOUTÚcountr$   r¨   Zfamiliesr+   r   r   r(   r-   r4   r5   ru   r–   Úobjectr   r   r   r«   r¹   r©   r¸   rõ   rö   rù   rú   r²   r³   rý   r  r
  r  r  r  r‹   ZERROR_NETNAME_DELETEDr   r   r*  r&  r(  ZSelectSelectorr.  r,  r)  r2  r0  r   r   r   r   Ú<module>
   s¢   




 PT=

,,8	P
