
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!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   sh   t j| j|dd�\}}z<z |t jkr6t  |jgdt¡}W n   | ¡  ‚ Y nX W 5 | d¡\}}X d S )NT©Ú
overlappedF)	Ú_winapiZ	WriteFiler7   ÚGetOverlappedResultÚERROR_IO_PENDINGÚWaitForMultipleObjectsÚeventr   Úcancel)r:   rQ   ÚovÚerrZnwrittenÚwaitresr   r   r   rP     s    
  ÿzPipeConnection._send_bytesNc           	      C   s&  | j rd| _ t ¡ S |d kr dnt|dƒ}z´tj| j|dd�\}}d z<z |tjkrdt |jgdt¡}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}   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	rJt|ƒ| |krJ|  ¡  tj	| j|dd�\}}| 
d¡\}}| |  ¡ ¡ |S )Nr   Trv   )re   rƒ   r„   r‡   rx   r�   r7   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¡\}	}
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   ru   )r¿   r3   ZopenmodeÚaccessZobsizeZibsizeZh1Zh2rw   Ú_r   rÂ   rÃ   r   r   r   r     sT    
 ÿ
ÿ   ù	     þ   ÿ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 nPX z<zt 
|jgdt¡}W n    | ¡  t |¡ ‚ Y nX W 5 | 	d¡\}}X t|ƒS )Nr   Trv   F)rã   Úappendrâ   Úpoprx   rÓ   rC   r‰   ZERROR_NO_DATAry   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   sx   dd l }t|tƒs$td t|ƒ¡ƒ‚|  d¡}|ttƒd … }| 	||d¡ 
¡ }|  |¡ |  d¡}|tkrttdƒ‚d S )Nr   rî   rð   rï   zdigest sent was rejected)rñ   r«   rN   r%   rò   r.   r^   rO   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
    ÿr1  c                 C   s   |   ¡ }t|||ƒS r   )r½   ru   )r0  r<   r=   r;   r   r   r   r/  Á  s    r/  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.  )r2  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(  r1  r/  r   r   r   r   Ú<module>
   s¢   




 PT=

,,8	P
