Ë
    oj.k  ã                   ó   — d Z ddlZddlmZ ddlmZmZmZmZm	Z	m
Z
 ddlmZmZmZ ddlmZ ddlmZ  G d„ d	«      Z G d
„ deej(                  «      Z G d„ deej,                  «      Z G d„ de«      Z G d„ de«      Z G d„ dej(                  «      Z e ej8                  e	d«       d«       G d„ de«      «       Z e ej8                  e	d«       d«       G d„ de«      «       Z e ej>                  e	d«       d«       G d„ de«      «       Z y)zG
Tests for implementations of L{IReactorUDP} and L{IReactorMulticast}.
é    N)ÚskipIf)ÚdeferÚerrorÚ
interfacesÚprotocolÚreactorÚudp)ÚDeferredÚgatherResultsÚmaybeDeferred)Úruntime)ÚTestCasec                   ó*   — e Zd ZdZdZdZd„ Zd„ Zd„ Zy)ÚMixinr   Nc                 ó   — g | _         y ©N)Úpackets©Úselfs    ú7/usr/lib/python3/dist-packages/twisted/test/test_udp.pyÚ__init__zMixin.__init__   s	   € Øˆ�ó    c                 óv   — d| _         | j                  �&| j                  d c}| _        |j                  d «       y y ©Né   )ÚstartedÚstartedDeferredÚcallback©r   Úds     r   ÚstartProtocolzMixin.startProtocol   s;   € ØˆŒØ×ÑÐ+Ø&*×&:Ñ&:¸DÐ#ˆAˆtÔ#Ø�J‰J�tÕð ,r   c                 ó   — d| _         y r   )Ústoppedr   s    r   ÚstopProtocolzMixin.stopProtocol"   s	   € Øˆ�r   )	Ú__name__Ú
__module__Ú__qualname__r   r#   r   r   r!   r$   © r   r   r   r      s    „ Ø€GØ€Gà€Oòòór   r   c                   ó   — e Zd ZdZdZd„ Zy)ÚServerNr   c                 ó¢   — | j                   j                  ||f«       | j                  �&| j                  d c}| _        |j                  d «       y y r   ©r   ÚappendÚpacketReceivedr   )r   ÚdataÚaddrr    s       r   ÚdatagramReceivedzServer.datagramReceived*   sJ   € Ø�‰×Ñ˜T 4˜LÔ)Ø×ÑÐ*Ø%)×%8Ñ%8¸$Ð"ˆAˆtÔ"Ø�J‰J�tÕð +r   )r%   r&   r'   r.   Úrefusedr1   r(   r   r   r*   r*   &   s   „ Ø€NØ€Gór   r*   c                   ó&   — e Zd ZdZdZd„ Zd„ Zd„ Zy)ÚClientNr   c                 óž   — | j                   j                  |«       | j                  �&| j                  d c}| _        |j                  d «       y y r   r,   )r   r/   r    s      r   r1   zClient.datagramReceived5   sF   € Ø�‰×Ñ˜DÔ!Ø×ÑÐ*Ø%)×%8Ñ%8¸$Ð"ˆAˆtÔ"Ø�J‰J�tÕð +r   c                 ót   — | j                   �%| j                   d c}| _         |j                  |«       || _        y r   )r   ÚerrbackÚfailure)r   r8   r    s      r   ÚconnectionFailedzClient.connectionFailed;   s6   € Ø×ÑÐ+Ø&*×&:Ñ&:¸DÐ#ˆAˆtÔ#Ø�I‰I�gÔØˆ�r   c                 óš   — | j                   �8| j                   d c}| _         |j                  t        j                  d«      «       d| _        y ©NÚyupr   ©r   r7   r   ÚConnectionRefusedErrorr2   r   s     r   ÚconnectionRefusedzClient.connectionRefusedA   óA   € Ø×ÑÐ+Ø&*×&:Ñ&:¸DÐ#ˆAˆtÔ#Ø�I‰I”e×2Ñ2°5Ó9Ô:Øˆ�r   )r%   r&   r'   r.   r2   r1   r9   r?   r(   r   r   r4   r4   1   s   „ Ø€NØ€Gòòór   r4   c                   ó   — e Zd Zd„ Zy)Ú
GoodClientc                 óš   — | j                   �8| j                   d c}| _         |j                  t        j                  d«      «       d| _        y r;   r=   r   s     r   r?   zGoodClient.connectionRefusedI   r@   r   N)r%   r&   r'   r?   r(   r   r   rB   rB   H   s   „ ór   rB   c                   ó   — e Zd ZdZy)ÚBadClientErrorzf
    Raised by BadClient at the end of every datagramReceived call to try and
    screw stuff up.
    N)r%   r&   r'   Ú__doc__r(   r   r   rE   rE   P   s   „ òr   rE   c                   ó    — e Zd ZdZdZd„ Zd„ Zy)Ú	BadClientz�
    A DatagramProtocol which always raises an exception from datagramReceived.
    Used to test error handling behavior in the reactor for that method.
    Nc                 ó   — || _         y)ze
        Set the Deferred which will be called back when datagramReceived is
        called.
        N)r    r   s     r   ÚsetDeferredzBadClient.setDeferred_   s   € ð
 ˆ�r   c                 óz   — | j                   �%| j                   d c}| _         |j                  |«       t        d«      ‚)NzApplication code is very buggy!)r    r   rE   )r   Úbytesr0   r    s       r   r1   zBadClient.datagramReceivedf   s5   € Ø�6‰6ÐØŸ™ ˆIˆAˆtŒvØ�J‰J�uÔÜÐ>Ó?Ð?r   )r%   r&   r'   rF   r    rJ   r1   r(   r   r   rH   rH   W   s   „ ñð
 	€Aòó@r   rH   ú!This reactor does not support UDPc                   ó˜   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Z ee	j                  j                  d«      dk(  d«      d	„ «       Zd
„ Zd„ Zd„ Zd„ Zy)ÚUDPTestsc                 ó®   ‡ ‡— t        «       }t        j                  «       x}|_        t	        j
                  d|d¬«      Šˆˆ fd„}|j                  |«      S )zu
        The C{type} of the host address of a listening L{DatagramProtocol}'s
        transport is C{"UDP"}.
        r   ú	127.0.0.1©Ú	interfacec                 ó|   •— ‰j                  «       }‰j                  |j                  d«       ‰j                  «       S )NÚUDP)ÚgetHostÚassertEqualÚtypeÚstopListening)Úignoredr0   Úpr   s     €€r   Ú	cbStartedz+UDPTests.test_oldAddress.<locals>.cbStartedx   s/   ø€ Ø—9‘9“;ˆDØ×Ñ˜TŸY™Y¨Ô.Ø—?‘?Ó$Ð$r   ©r*   r   r
   r   r   Ú	listenUDPÚaddCallback)r   Úserverr    r\   r[   s   `   @r   Útest_oldAddresszUDPTests.test_oldAddresso   sJ   ù€ ô
 “ˆÜ%*§^¡^Ó%5Ð5ˆˆFÔ"Ü×Ñ˜a °;Ô?ˆõ	%ð
 �}‰}˜YÓ'Ð'r   c                 óÜ   ‡ ‡‡— t        «       Št        j                  «       x}‰_        t	        j
                  d‰d¬«      Šˆˆ ˆfd„}ˆ ˆfd„}|j                  |«      j                  |«      S )z±
        The L{DatagramProtocol}'s C{startProtocol} and C{stopProtocol}
        methods are called when its transports starts and stops listening,
        respectively.
        r   rQ   rR   c                 ó”   •— ‰j                  ‰j                  d«       ‰j                  ‰j                  d«       ‰j                  «       S )Nr   r   )rW   r   r#   rY   )rZ   Úport1r   r`   s    €€€r   r\   z*UDPTests.test_startStop.<locals>.cbStarted‰   s:   ø€ Ø×Ñ˜VŸ^™^¨QÔ/Ø×Ñ˜VŸ^™^¨QÔ/Ø×&Ñ&Ó(Ð(r   c                 ó>   •— ‰j                  ‰j                  d«       y r   )rW   r#   )rZ   r   r`   s    €€r   Ú	cbStoppedz*UDPTests.test_startStop.<locals>.cbStoppedŽ   s   ø€ Ø×Ñ˜VŸ^™^¨QÕ/r   r]   )r   r    r\   rf   rd   r`   s   `   @@r   Útest_startStopzUDPTests.test_startStop   sZ   ú€ ô “ˆÜ%*§^¡^Ó%5Ð5ˆˆFÔ"Ü×!Ñ! ! V°{ÔCˆö	)õ
	0ð �}‰}˜YÓ'×3Ñ3°IÓ>Ð>r   c                 ó¶   ‡‡— t        «       Št        j                  «       x}‰_        t	        j
                  d‰d¬«      }d„ Šˆˆfd„}|j                  ‰|«      S )zr
        Re-listening with the same L{DatagramProtocol} re-invokes the
        C{startProtocol} callback.
        r   rQ   rR   c                 ó"   — |j                  «       S r   ©rY   ©rZ   Úports     r   r\   z'UDPTests.test_rebind.<locals>.cbStartedœ   s   € Ø×%Ñ%Ó'Ð'r   c                 óŽ   •— t        j                  «       x}‰_        t        j                  d‰d¬«      }|j                  ‰|«      S ©Nr   rQ   rR   )r   r
   r   r   r^   r_   )rZ   r    r[   r\   r`   s      €€r   rf   z'UDPTests.test_rebind.<locals>.cbStoppedŸ   s<   ø€ Ü).¯©Ó)9Ð9ˆA�Ô&Ü×!Ñ! ! V°{ÔCˆAØ—=‘= ¨AÓ.Ð.r   r]   )r   r    r[   rf   r\   r`   s       @@r   Útest_rebindzUDPTests.test_rebind“   sQ   ù€ ô
 “ˆÜ%*§^¡^Ó%5Ð5ˆˆFÔ"Ü×Ñ˜a °;Ô?ˆò	(õ	/ð
 �}‰}˜Y¨Ó*Ð*r   c                 óâ   ‡ ‡‡— t        «       Št        j                  «       x}‰_        t	        j
                  d‰d¬«      Šˆˆ ˆfd„}|j                  |«       ˆfd„}|j                  |«       |S )z�
        A L{CannotListenError} exception is raised when attempting to bind a
        second protocol instance to an already bound port
        r   rQ   rR   c                 ó  •— ‰j                  ‰j                  «       ‰j                  j                  «       «       t        «       }‰j	                  t
        j                  t        j                  ‰j                  «       j                  |d¬«       y )NrQ   rR   )
rW   rV   Ú	transportr*   ÚassertRaisesr   ÚCannotListenErrorr   r^   rl   )rZ   Úserver2rl   r   r`   s     €€€r   r\   z*UDPTests.test_bindError.<locals>.cbStarted¯   si   ø€ Ø×Ñ˜TŸ\™\›^¨V×-=Ñ-=×-EÑ-EÓ-GÔHÜ“hˆGØ×ÑÜ×'Ñ'Ü×!Ñ!Ø—‘“×#Ñ#ØØ%ð õ r   c                 ó$   •— ‰j                  «       S r   rj   rk   s    €r   Ú
cbFinishedz+UDPTests.test_bindError.<locals>.cbFinished¼   s   ø€ Ø×%Ñ%Ó'Ð'r   r]   )r   r    r\   rw   rl   r`   s   `   @@r   Útest_bindErrorzUDPTests.test_bindError¦   s_   ú€ ô
 “ˆÜ%*§^¡^Ó%5Ð5ˆˆFÔ"Ü× Ñ   F°kÔBˆö		ð 	
�‰�iÔ ô	(ð 	
�‰�jÔ!Øˆr   c                 ó�  ‡ ‡‡‡	‡
— t        «       Š
t        j                  «       x}‰
_        t	        j
                  d‰
d¬«      Š	t        «       Št        j                  «       xŠ‰_        ˆˆˆ fd„}|j                  |«      }ˆˆ
fd„}|j                  |«       ˆˆ ˆ
fd„}|j                  |«       ˆ	ˆ fd„}|j                  |«       |S )zŽ
        Datagrams can be sent with the transport's C{write} method and
        received via the C{datagramReceived} callback method.
        r   rQ   rR   c                 óB   •— t        j                  d‰d¬«      ‰_        ‰S rn   )r   r^   Úport2)rZ   ÚclientÚclientStartedr   s    €€€r   ÚcbServerStartedz2UDPTests.test_sendPackets.<locals>.cbServerStartedÎ   s   ø€ Ü ×*Ñ*¨1¨fÀÔLˆDŒJØ Ð r   c                 ó  •‡‡— ‰j                   j                  d‰j                   j                  «       j                  «       ‰j                   j                  «       }‰j                   j                  «       }t	        j
                  «       x}‰_        ‰j                   j                  d|j                  |j                  f«       ddd|j                  |j                  ffgŠˆˆˆˆfd„Št	        j                   ‰d «      |gd¬«      S )	NrQ   ó   hello)ó   a)ó   bNó   cc                 ó¶   •— ‰rVt        j                  «       x}‰_        |j                  ‰«        ‰j                  j
                  ‰j                  d«      Ž  |S y ©Nr   )r   r
   r.   r_   rr   ÚwriteÚpop)rZ   ÚnextClientWriteÚcbClientSendr|   ÚclientWritesr`   s     €€€€r   r‰   zHUDPTests.test_sendPackets.<locals>.cbClientStarted.<locals>.cbClientSendÞ   sT   ø€ ÙÜ>C¿n¹nÓ>NÐN�O fÔ&;Ø#×/Ñ/°Ô=Ø*�F×$Ñ$×*Ñ*¨L×,<Ñ,<¸QÓ,?Ñ@Ø*Ð*ð	  r   T©ÚfireOnOneErrback)
rr   ÚconnectrV   rl   r   r
   r.   r†   ÚhostÚDeferredList)rZ   ÚcAddrÚsAddrÚ
serverSendr‰   rŠ   r|   r`   s       @@€€r   ÚcbClientStartedz2UDPTests.test_sendPackets.<locals>.cbClientStartedÔ   sÔ   ú€ Ø×Ñ×$Ñ$ [°&×2BÑ2B×2JÑ2JÓ2L×2QÑ2QÔRØ×$Ñ$×,Ñ,Ó.ˆEØ×$Ñ$×,Ñ,Ó.ˆEä16·±Ó1AÐAˆJ˜Ô.Ø×Ñ×"Ñ" 8¨e¯j©j¸%¿*¹*Ð-EÔFà# \°D¸5¿:¹:ÀuÇzÁzÐ:RÐ3SÐTˆL÷+ô ×%Ñ%Ù˜dÓ# ZÐ0À4ôð r   c                 óR  •— ‰j                   j                  «       }‰j                   j                  «       }‰j                  ‰j                  d|j                  |j
                  ffg«       |j                  |j
                  f}‰j                  ‰j                  d|fd|fd|fg«       y )Nr€   r�   r‚   rƒ   )rr   rV   rW   r   rŽ   rl   )rZ   r�   r‘   Ú
clientAddrr|   r   r`   s       €€€r   ÚcbSendsFinishedz2UDPTests.test_sendPackets.<locals>.cbSendsFinishedî   s”   ø€ Ø×$Ñ$×,Ñ,Ó.ˆEØ×$Ñ$×,Ñ,Ó.ˆEØ×Ñ˜VŸ^™^¨x¸%¿*¹*ÀeÇjÁjÐ9QÐ.RÐ-SÔTØŸ*™* e§j¡jÐ1ˆJØ×ÑØ—‘Ø˜
Ð# d¨JÐ%7¸$À
Ð9KÐLõr   c                 ó¾   •— t        j                  t        j                  ‰j                  «      t        j                  ‰j                  j                  «      gd¬«      S ©NTr‹   )r   r�   r   rY   r{   )rZ   rd   r   s    €€r   rw   z-UDPTests.test_sendPackets.<locals>.cbFinishedú   sL   ø€ Ü×%Ñ%ä×'Ñ'¨×(;Ñ(;Ó<Ü×'Ñ'¨¯
©
×(@Ñ(@ÓAðð "&ôð r   )r*   r   r
   r   r   r^   rB   r_   )r   ÚserverStartedr~   r    r“   r–   rw   r|   r}   rd   r`   s   `      @@@@r   Útest_sendPacketszUDPTests.test_sendPacketsÂ   s¤   ü€ ô
 “ˆÜ16·±Ó1AÐAˆ˜Ô.Ü×!Ñ! ! V°{ÔCˆä“ˆÜ16·±Ó1AÐAˆ˜Ô.ö	!ð ×%Ñ% oÓ6ˆõ	ð0 	
�‰�oÔ&ö	ð 	
�‰�oÔ&õ	ð 	
�‰�jÔ!Øˆr   ÚINFRASTRUCTUREÚAZUREPIPELINESz"Hangs on Pipelines due to firewallc                 ó”  ‡ ‡‡‡‡	— t        «       Št        j                  «       x}‰_        t	        j
                  d‰d¬«      Št        «       Š	t        j                  «       x}‰	_        t	        j
                  d‰	d¬«      Št        j                  ||gd¬«      }ˆˆ ˆ	fd„}|j                  |«       ˆˆfd„}|j                  |«       |S )zÎ
        A L{ConnectionRefusedError} exception is raised when a connection
        attempt is actively refused by the other end.

        Note: This test assumes no one is listening on port 80 UDP.
        r   rQ   rR   Tr‹   c                 óP  •— t        j                  «       x}‰_        ‰j                  j	                  dd«       t        d«      D ]A  }‰j                  j                  d|fz  «       ‰j                  j                  d|fz  d«       ŒC ‰j                  |t        j                  «      S )NrQ   éP   é
   ó   %d©rQ   rŸ   )
r   r
   r   rr   r�   Úranger†   ÚassertFailurer   r>   )rZ   r?   Úir|   r   r`   s      €€€r   r\   z2UDPTests.test_connectionRefused.<locals>.cbStarted  s–   ø€ Ü9>¿¹Ó9IÐIÐ Ô 6Ø×Ñ×$Ñ$ [°"Ô5ä˜2“Yò H�Ø× Ñ ×&Ñ& u°¨t¡|Ô4Ø× Ñ ×&Ñ& u°¨t¡|Ð5FÕGðHð ×%Ñ%Ð&7¼×9UÑ9UÓVÐVr   c                 óª   •— t        j                  t        j                  ‰j                  «      t        j                  ‰j                  «      gd¬«      S r˜   ©r   r�   r   rY   )rZ   rl   r{   s    €€r   rw   z3UDPTests.test_connectionRefused.<locals>.cbFinished'  sH   ø€ Ü×%Ñ%ä×'Ñ'¨×(:Ñ(:Ó;Ü×'Ñ'¨×(;Ñ(;Ó<ðð "&ôð r   )	rB   r   r
   r   r   r^   r*   r�   r_   )
r   r}   r™   r    r\   rw   r|   rl   r{   r`   s
   `     @@@@r   Útest_connectionRefusedzUDPTests.test_connectionRefused  s§   ü€ ô “ˆÜ16·±Ó1AÐAˆ˜Ô.Ü× Ñ   F°kÔBˆä“ˆÜ16·±Ó1AÐAˆ˜Ô.Ü×!Ñ! ! V°{ÔCˆä×Ñ ¨}Ð=ÐPTÔUˆö	Wð 	
�‰�iÔ õ	ð 	
�‰�jÔ!Øˆr   c                 ó4  ‡ ‡	‡
‡‡‡— t        «       Š	t        j                  «       x}‰	_        t	        j
                  d‰	d¬«      Š
dŠt        «       Št        j                  «       x}‰_        t        j                  «       x}‰_        t	        j
                  d‰d¬«      Št        j                  ||gd¬«      }ˆ	ˆˆˆfd„}|j                  |«       t        j                  ||gd¬«      }ˆ ˆˆfd„}|j                  |«       ˆ
ˆfd	„}|j                  |«       |S )
as  
        When a server fails to successfully read a packet the server should
        still be able to process future packets.
        The IOCP reactor had a historical problem where a failure to read caused
        the reactor to ignore any future reads. This test should prevent a regression.

        Note: This test assumes no one is listening on port 80 UDP.
        r   rQ   rR   s   Sending test packet to serverTr‹   c                 óŽ   •— ‰j                   j                  dd«       ‰j                   j                  ‰d‰j                  f«       y )Ns$   write to port no one is listening tor¢   rQ   )rr   r†   Ú_realPortNumber)rZ   r|   r`   Ú
serverPortÚtest_data_to_sends    €€€€r   ÚcbClientAndServerStartedzAUDPTests.test_serverReadFailure.<locals>.cbClientAndServerStartedJ  sE   ø€ ð ×Ñ×"Ñ"Ø7Ð9Jôð ×Ñ×"Ñ"Ø! K°×1KÑ1KÐ#Lõr   c                 óJ   •— ‰j                  ‰j                  d   d   ‰«       y r…   ©rW   r   )rZ   r   r`   r­   s    €€€r   Úverify_server_got_dataz?UDPTests.test_serverReadFailure.<locals>.verify_server_got_data]  s"   ø€ Ø×Ñ˜VŸ^™^¨AÑ.¨qÑ1Ð3DÕEr   c                 óª   •— t        j                  t        j                  ‰j                  «      t        j                  ‰j                  «      gd¬«      S r˜   r§   )rZ   Ú
clientPortr¬   s    €€r   Úcleanupz0UDPTests.test_serverReadFailure.<locals>.cleanupb  sH   ø€ Ü×%Ñ%ä×'Ñ'¨
×(@Ñ(@ÓAÜ×'Ñ'¨
×(@Ñ(@ÓAðð "&ôð r   )
rB   r   r
   r   r   r^   r*   r.   r�   r_   )r   r}   r™   ÚserverGotDataÚserver_client_started_dr®   Úall_data_sentr±   r´   r|   r³   r`   r¬   r­   s   `        @@@@@r   Útest_serverReadFailurezUDPTests.test_serverReadFailure3  sú   ý€ ô “ˆÜ16·±Ó1AÐAˆ˜Ô.Ü×&Ñ& q¨&¸KÔHˆ
Ø<Ðä“ˆÜ16·±Ó1AÐAˆ˜Ô.Ü05·±Ó0@Ð@ˆ˜Ô-Ü×&Ñ& q¨&¸KÔHˆ
ä"'×"4Ñ"4Ø˜MÐ*¸Tô#
Ð÷	ð 	 ×+Ñ+Ð,DÔEä×*Ñ*Ø$ mÐ4Àtô
ˆö	Fð 	×!Ñ!Ð"8Ô9õ	ð 	×!Ñ! 'Ô*àÐr   c                 ób  — t        «       }t        j                  d|d¬«      }| j                  t        j
                  |j                  j                  dd«       |j                  j                  dd«       | j                  t        |j                  j                  dd«       |j                  «       S )a   
        A call to the transport's connect method fails with an
        L{InvalidAddressError} when a non-IP address is passed as the host
        value.

        A call to a transport's connect method fails with a L{RuntimeError}
        when the transport is already connected.
        r   rQ   rR   Ú	localhostrŸ   )
rB   r   r^   rs   r   ÚInvalidAddressErrorrr   r�   ÚRuntimeErrorrY   )r   r|   rl   s      r   Útest_badConnectzUDPTests.test_badConnecto  s�   € ô “ˆÜ× Ñ   F°kÔBˆØ×ÑÜ×%Ñ% v×'7Ñ'7×'?Ñ'?ÀÈbô	
ð 	×Ñ× Ñ  ¨bÔ1Ø×Ñœ,¨×(8Ñ(8×(@Ñ(@À+ÈrÔRØ×!Ñ!Ó#Ð#r   c                 óJ  ‡ ‡‡‡‡‡‡‡	— t        j                  «       Šˆ fd„}‰j                  |«       t        «       Št	        j
                  d‰d¬«      Šˆfd„}‰j                  |«       ‰j                  «       Št        t        d«      «      Šg Š	ˆˆˆˆˆˆ ˆ	fd„Š ‰«        ‰S )zr
        When datagramReceived raises an exception it is logged but the port
        is not disconnected.
        c                 ó‚   •— ‰j                  t        «      }‰j                  t        |«      ddt        |«      fz  «       y)z…
            Flush the exceptions which the reactor should have logged and make
            sure they're actually there.
            é   z'Incorrectly found %d errors, expected 2N)ÚflushLoggedErrorsrE   rW   Úlen)ÚignÚerrsr   s     €r   ÚcbCompletedz8UDPTests.test_datagramReceivedError.<locals>.cbCompletedˆ  s:   ø€ ð
 ×)Ñ)¬.Ó9ˆDØ×ÑÜ�D“	˜1ÐGÌ3ÈtË9È,ÑVõr   r   rQ   rR   c                 óh   •‡ — t        j                  ‰j                  «      j                  ˆ fd„«      S )zƒ
            Disconnect the port we started and pass on whatever was given to us
            in case it was a Failure.
            c                 ó   •— ‰S r   r(   )rÃ   Úresults    €r   ú<lambda>zHUDPTests.test_datagramReceivedError.<locals>.cbCleanup.<locals>.<lambda>œ  s   ø€ Èv€ r   )r   r   rY   ÚaddBoth)rÈ   rl   s   `€r   Ú	cbCleanupz6UDPTests.test_datagramReceivedError.<locals>.cbCleanup—  s(   ù€ ô
 ×&Ñ& t×'9Ñ'9Ó:×BÑBÓCUÓVÐVr   é<   c                  ó^  •‡— ‰s	 ‰
j                  d«       ‰
j                  ‰j                  dd«       d‰j                  d«      fz  } t        j                  «       }‰j                  |«       ‰j                  j                  | ‰j                  ‰j                  f«       ˆˆ	ˆˆfd„}ˆ	fd„}|j                  ||«       |j                  ‰j                  «       t        j                  d|j                  t!        j"                  d	«      «      Šy# t        $ r ‰j                  «        Y �Œw xY w)
a6  
            Send one packet to the listening BadClient.  Set up a 0.1 second
            timeout to do re-transmits in case the packet is dropped.  When two
            packets have been received by the BadClient, stop sending and let
            the finalDeferred's callbacks do some assertions.
            zNot enough packets receivedNzUDP Protocol lost its transportr¡   r   c                 ó¶   •— ‰j                  «        ‰j                  | «       t        ‰«      dk(  r"t        j                  d‰j
                  d«       y ‰«        y)z…
                A packet arrived.  Cancel the timeout for it, record it, and
                maybe finish the test.
                rÀ   r   N)Úcancelr-   rÂ   r   Ú	callLaterr   )ÚpacketÚfinalDeferredÚmakeAttemptÚsucceededAttemptsÚtimeoutCalls    €€€€r   ÚcbPacketReceivedzRUDPTests.test_datagramReceivedError.<locals>.makeAttempt.<locals>.cbPacketReceivedÃ  sL   ø€ ð
 ×"Ñ"Ô$Ø!×(Ñ(¨Ô0ÜÐ(Ó)¨QÒ.ô
 ×%Ñ% a¨×)?Ñ)?ÀÕFá•Mr   c                 ó   •—  ‰«        y)aÄ  
                The packet wasn't received quickly enough.  Try sending another
                one.  It doesn't matter if the packet for which this was the
                timeout eventually arrives: makeAttempt throws away the
                Deferred on which this function is the errback, so when
                datagramReceived callbacks, so it won't be on this Deferred, so
                it won't raise an AlreadyCalledError.
                Nr(   )ÚerrrÓ   s    €r   ÚebPacketTimeoutzQUDPTests.test_datagramReceivedError.<locals>.makeAttempt.<locals>.ebPacketTimeoutÓ  s
   ø€ ñ •r   gš™™™™™¹?z&Timed out in testDatagramReceivedError)ÚfailÚ	Exceptionr7   ÚfailIfIdenticalrr   r‡   r   r
   rJ   r†   rŽ   rl   ÚaddCallbacksÚ
addErrbackr   rÐ   r   ÚTimeoutError)rÑ   ÚpacketDeferredrÖ   rÙ   rÕ   r0   Úattemptsr|   rÒ   rÓ   r   rÔ   s       @€€€€€€€r   rÓ   z8UDPTests.test_datagramReceivedError.<locals>.makeAttempt­  s  ù€ ñ ð,Ø—I‘IÐ;Ô<ð × Ñ Ø× Ñ  $Ð(Iôð ˜hŸl™l¨1›oÐ/Ñ/ˆFÜ"Ÿ^™^Ó-ˆNØ×Ñ˜~Ô.Ø×Ñ×"Ñ" 6¨D¯I©I°t·y±yÐ+AÔB÷"ô 	ð ×'Ñ'Ð(8¸/ÔJØ×%Ñ% m×&;Ñ&;Ô<ä!×+Ñ+ØØ×&Ñ&Ü×"Ñ"Ð#KÓLó‰KøôU !ò ,Ø!×)Ñ)×+ð,ús   †D ÄD,Ä+D,)
r   r
   r_   rH   r   r^   rÊ   rV   Úlistr£   )
r   rÅ   rË   r0   rá   r|   rÒ   rÓ   rl   rÔ   s
   `  @@@@@@@r   Útest_datagramReceivedErrorz#UDPTests.test_datagramReceivedError�  s�   ÿ€ ô
 Ÿ™Ó(ˆô	ð 	×!Ñ! +Ô.ä“ˆÜ× Ñ   F°kÔBˆô	Wð 	×Ñ˜iÔ(à�|‰|‹~ˆô œ˜b›	“?ˆØÐ÷8	ò 8	ñt 	ŒØÐr   c                 óþ   —  G d„ d«      }t        j                  dt        «       «      } |«       |_        |j	                  dd«       | j                  | j                  g«      }| j                  t        |«      d«       y)ai  
        C{'<broadcast>'} is an alternative way to say C{'255.255.255.255'}
        ({socket.gethostbyname("<broadcast>")} returns C{'255.255.255.255'}),
        so because it becomes a valid IP address, no deprecation warning about
        passing hostnames to L{twisted.internet.udp.Port.write} needs to be
        emitted by C{write()} in this case.
        c                   ó   — e Zd Zd„ Zy)ú6UDPTests.test_NoWarningOnBroadcast.<locals>.fakeSocketc                  ó   — y r   r(   )r   ÚfooÚbars      r   Úsendtoz=UDPTests.test_NoWarningOnBroadcast.<locals>.fakeSocket.sendtoô  s   € Ør   N)r%   r&   r'   rê   r(   r   r   Ú
fakeSocketræ   ó  s   „ ór   rë   r   s   test)z<broadcast>iÒ  N)	r	   ÚPortr*   Úsocketr†   ÚflushWarningsÚtest_NoWarningOnBroadcastrW   rÂ   )r   rë   r[   Úwarningss       r   rï   z"UDPTests.test_NoWarningOnBroadcastê  se   € ÷	ñ 	ô �H‰H�Qœ›Ó!ˆÙ“<ˆŒØ	�‰�Ð.Ô/à×%Ñ% t×'EÑ'EÐ&FÓGˆØ×Ñœ˜X›¨Õ*r   N)r%   r&   r'   ra   rg   ro   rx   rš   r   ÚosÚenvironÚgetr¨   r¸   r½   rã   rï   r(   r   r   rO   rO   m   sh   „ ò(ò ?ò(+ò&ò8BñH Ø
�
‰
�‰Ð'Ó(Ð,<Ñ<Ø,óñ'ó	ð'òR:òx$ò$góR+r   rO   c                   óL   — e Zd ZdZ ej
                  ed«      sdZd„ Zd„ Z	d„ Z
y)ÚReactorShutdownInteractionTestsz!Test reactor shutdown interactionNrM   c                 óp   — t        «       | _        t        j                  d| j                  d¬«      | _        y)zStart a UDP portr   rQ   rR   N)r*   r`   r   r^   rl   r   s    r   ÚsetUpz%ReactorShutdownInteractionTests.setUp  s%   € ä“hˆŒÜ×%Ñ% a¨¯©ÀÔLˆ�	r   c                 ó6   — | j                   j                  «       S )zStop the UDP port)rl   rY   r   s    r   ÚtearDownz(ReactorShutdownInteractionTests.tearDown  s   € à�y‰y×&Ñ&Ó(Ð(r   c                 ó~  ‡ ‡— t        j                  «       Št        j                  «       x}‰ j                  _        ˆˆ fd„}|j	                  |«       ˆ fd„}‰j	                  |«       ‰ j                  j
                  j                  dd‰ j                  j
                  j                  «       j                  f«       ‰S )z0Test reactor shutdown while in a recvfrom() loopc                 ó�   •— ‰j                   j                  j                  «        t        j                  d‰j
                  d «       y r…   )r`   rr   ÚconnectionLostr   rÐ   r   )rZ   Úfinishedr   s    €€r   ÚpktRecezQReactorShutdownInteractionTests.testShutdownFromDatagramReceived.<locals>.pktRece  s3   ø€ à�K‰K×!Ñ!×0Ñ0Ô2ô ×Ñ˜a ×!2Ñ!2°DÕ9r   c                 ó&   •— ‰j                  «        y r   )rÁ   ©rZ   r   s    €r   ÚflushErrorszUReactorShutdownInteractionTests.testShutdownFromDatagramReceived.<locals>.flushErrors(  s   ø€ ð
 ×"Ñ"Õ$r   s@                                                                   rQ   )	r   r
   r`   r.   r_   rr   r†   rV   rl   )r   Úprrþ   r  rý   s   `   @r   Ú testShutdownFromDatagramReceivedz@ReactorShutdownInteractionTests.testShutdownFromDatagramReceived  s“   ù€ ô —>‘>Ó#ˆÜ*/¯.©.Ó*:Ð:ˆˆT�[‰[Ô'õ	:ð 	�‰�wÔô	%ð 	×Ñ˜[Ô)Ø�‰×Ñ×#Ñ#Ø˜ d§k¡k×&;Ñ&;×&CÑ&CÓ&E×&JÑ&JÐKô	
ð ˆr   )r%   r&   r'   rF   r   ÚIReactorUDPr   Úskipr÷   rù   r  r(   r   r   rõ   rõ   ÿ  s,   „ á+à!ˆ:×!Ñ! '¨4Ô0Ø2ˆòMò
)ó$r   rõ   ú'This reactor does not support multicastc                   óª  — e Zd Zej                  j                  d«      dk(  rej                  j                  «       rdZ	 e
j                  ed«      sdZ	d„ Zd„ Zd„ Zd	„ Zd
„ Zd„ Z eej                  j)                  «       xr ej                  j+                  «        d«      d„ «       Zd„ Z eej                  j)                  «       d«      d„ «       Zy)ÚMulticastTestsr›   rœ   z Does not work on Azure PipelinesNr  c                 óx  — t        «       | _        t        «       | _        t	        j
                  d| j                  «      | _        t	        j
                  d| j                  «      | _        | j                  j                  j                  d| j                  j                  j                  «       j                  «       y )Nr   rQ   )r*   r`   r4   r|   r   ÚlistenMulticastrd   r{   rr   r�   rV   rl   r   s    r   r÷   zMulticastTests.setUpD  sw   € Ü“hˆŒÜ“hˆŒä×,Ñ,¨Q°·±Ó<ˆŒ
Ü×,Ñ,¨Q°·±Ó<ˆŒ
Ø�‰×Ñ×%Ñ% k°4·;±;×3HÑ3H×3PÑ3PÓ3R×3WÑ3WÕXr   c                 ó�   — t        t        | j                  j                  «      t        | j                  j                  «      g«      S r   )r   r   rd   rY   r{   r   s    r   rù   zMulticastTests.tearDownL  s8   € Üä˜dŸj™j×6Ñ6Ó7Ü˜dŸj™j×6Ñ6Ó7ðó
ð 	
r   c                 ó  — | j                   | j                  fD ]q  }| j                  |j                  j	                  «       d«       |j                  j                  d«       | j                  |j                  j	                  «       d«       Œs y )Nr   rÀ   )r|   r`   rW   rr   ÚgetTTLÚsetTTL)r   Úos     r   ÚtestTTLzMulticastTests.testTTLT  sj   € Ø—‘˜dŸk™kÐ)ò 	6ˆAØ×Ñ˜QŸ[™[×/Ñ/Ó1°1Ô5Ø�K‰K×Ñ˜qÔ!Ø×Ñ˜QŸ[™[×/Ñ/Ó1°1Õ5ñ	6r   c                 óŒ  ‡ ‡— ‰ j                  ‰ j                  j                  j                  «       d«       ‰ j                  j                  j	                  «       Š‰ j                  j                  j                  d«      }ˆˆ fd„}|j                  |«       ˆˆ fd„}|j                  |«       ˆ fd„}|j                  |«       |S )zv
        Test that after loopback mode has been set, multicast packets are
        delivered to their sender.
        r   ú225.0.0.250c                 ó¢   •— t        «       x}‰j                  _        ‰j                  j                  j	                  dd‰j
                  f«       |S )Nr€   r  ©r
   r`   r.   rr   r†   rl   ©rZ   r    r0   r   s     €€r   ÚcbJoinedz.MulticastTests.test_loopback.<locals>.cbJoinedc  s>   ø€ Ü-5«ZÐ7ˆA�—‘Ô*Ø�K‰K×!Ñ!×'Ñ'¨°=À$Ç)Á)Ð2LÔMØˆHr   c                 óÒ  •— ‰j                  t        ‰j                  j                  «      d«       ‰j                  j                  j                  d«       ‰j                  ‰j                  j                  j                  «       d«       ‰j                  j                  j                  dd‰j                  f«       t        «       }t        j                  d|j                  d «       |S )Nr   r   r€   r  )rW   rÂ   r`   r   rr   ÚsetLoopbackModeÚgetLoopbackModer†   rl   r
   r   rÐ   r   r  s     €€r   ÚcbPacketz.MulticastTests.test_loopback.<locals>.cbPacketj  s¤   ø€ Ø×ÑœS §¡×!4Ñ!4Ó5°qÔ9Ø�K‰K×!Ñ!×1Ñ1°!Ô4Ø×Ñ˜TŸ[™[×2Ñ2×BÑBÓDÀaÔHØ�K‰K×!Ñ!×'Ñ'¨°=À$Ç)Á)Ð2LÔMô “
ˆAÜ×Ñ˜a §¡¨TÔ2ØˆHr   c                 ód   •— ‰j                  t        ‰j                  j                  «      d«       y r   )rW   rÂ   r`   r   r   s    €r   Ú
cbNoPacketz0MulticastTests.test_loopback.<locals>.cbNoPacketw  s"   ø€ Ø×ÑœS §¡×!4Ñ!4Ó5°qÕ9r   )rW   r`   rr   r  rV   Ú	joinGroupr_   )r   Újoinedr  r  r  r0   s   `    @r   Útest_loopbackzMulticastTests.test_loopbackZ  sž   ù€ ð
 	×Ñ˜Ÿ™×.Ñ.×>Ñ>Ó@À!ÔDØ�{‰{×$Ñ$×,Ñ,Ó.ˆØ—‘×&Ñ&×0Ñ0°Ó?ˆõ	ð
 	×Ñ˜8Ô$õ		ð 	×Ñ˜8Ô$ô	:ð 	×Ñ˜:Ô&àˆr   c                 ó²  ‡ — ‰ j                  ‰ j                  j                  j                  «       d«       ‰ j                  ‰ j                  j                  j                  «       d«       ‰ j                  j                  j                  d«      }‰ j                  j                  j                  d«      }t        ||g«      }ˆ fd„}|j                  |«       |S )zK
        Test C{getOutgoingInterface} and C{setOutgoingInterface}.
        z0.0.0.0rQ   c                 óÖ   •— ‰j                  ‰j                  j                  j                  «       d«       ‰j                  ‰j                  j                  j                  «       d«       y )NrQ   )rW   r|   rr   ÚgetOutgoingInterfacer`   r   s    €r   ÚcbInterfacesz3MulticastTests.test_interface.<locals>.cbInterfaces‰  sI   ø€ Ø×Ñ˜TŸ[™[×2Ñ2×GÑGÓIÈ;ÔWØ×Ñ˜TŸ[™[×2Ñ2×GÑGÓIÈ;ÕWr   )rW   r|   rr   r"  r`   ÚsetOutgoingInterfacer   r_   )r   Úd1Úd2rÈ   r#  s   `    r   Útest_interfacezMulticastTests.test_interface~  s¨   ø€ ð 	×Ñ˜Ÿ™×.Ñ.×CÑCÓEÀyÔQØ×Ñ˜Ÿ™×.Ñ.×CÑCÓEÀyÔQà�[‰[×"Ñ"×7Ñ7¸ÓDˆØ�[‰[×"Ñ"×7Ñ7¸ÓDˆÜ  B˜xÓ(ˆô	Xð 	×Ñ˜<Ô(Øˆr   c                 óÖ   ‡ — ‰ j                   j                  j                  d«      }ˆ fd„}|j                  |«       ˆ fd„}|j                  |«       ˆ fd„}|j                  |«       |S )zE
        Test that multicast a group can be joined and left.
        r  c                 óN   •— ‰j                   j                  j                  d«      S ©Nr  )r|   rr   Ú
leaveGroupr   s    €r   ÚclientJoinedz3MulticastTests.test_joinLeave.<locals>.clientJoined–  ó   ø€ Ø—;‘;×(Ñ(×3Ñ3°MÓBÐBr   c                 óN   •— ‰j                   j                  j                  d«      S r*  )r`   rr   r  r   s    €r   Ú
clientLeftz1MulticastTests.test_joinLeave.<locals>.clientLeft›  s   ø€ Ø—;‘;×(Ñ(×2Ñ2°=ÓAÐAr   c                 óN   •— ‰j                   j                  j                  d«      S r*  )r`   rr   r+  r   s    €r   ÚserverJoinedz3MulticastTests.test_joinLeave.<locals>.serverJoined   r-  r   )r|   rr   r  r_   )r   r    r,  r/  r1  s   `    r   Útest_joinLeavezMulticastTests.test_joinLeave�  s`   ø€ ð �K‰K×!Ñ!×+Ñ+¨MÓ:ˆô	Cð 	
�‰�lÔ#ô	Bð 	
�‰�jÔ!ô	Cð 	
�‰�lÔ#àˆr   z2Windows' UDP multicast is not yet fully supported.c                 óˆ   — | j                  | j                  j                  j                  d«      t        j
                  «      S )zŠ
        Test that an attempt to join an address which is not a multicast
        address fails with L{error.MulticastJoinError}.
        rQ   )r¤   r|   rr   r  r   ÚMulticastJoinErrorr   s    r   Útest_joinFailurezMulticastTests.test_joinFailure¨  s7   € ð ×!Ñ!Ø�K‰K×!Ñ!×+Ñ+¨KÓ8¼%×:RÑ:Ró
ð 	
r   c                 óh  ‡ ‡‡‡— t        «       Št        j                  d‰«      Š‰ j                  j                  j                  «       Š‰ j                  j                  j                  d«      }ˆˆˆ fd„}|j                  |«       ˆ fd„}|j                  |«       ˆfd„}|j                  |«       |S )zn
        Test that a multicast group can be joined and messages sent to and
        received from it.
        r   r  c                 óŽ   •— t        «       x}‰j                  _        ‰j                  j	                  dd‰j
                  f«       |S )Nó   hello worldr  r  )rZ   r    r0   Úcr   s     €€€r   r  z/MulticastTests.test_multicast.<locals>.cbJoinedÁ  s8   ø€ Ü-5«ZÐ7ˆA�—‘Ô*Ø�K‰K×Ñ˜n¨}¸d¿i¹iÐ.HÔIØˆHr   c                 ó^   •— ‰j                  ‰j                  j                  d   d   d«       y ©Nr   r8  )rW   r`   r   r   s    €r   r  z/MulticastTests.test_multicast.<locals>.cbPacketÈ  s'   ø€ Ø×Ñ˜TŸ[™[×0Ñ0°Ñ3°AÑ6¸ÕGr   c                 ó\   •‡ — t        ‰j                  «      }|j                  ˆ fd„«       |S )Nc                 ó   •— ‰S r   r(   ©rÃ   Úpassthroughs    €r   rÉ   z@MulticastTests.test_multicast.<locals>.cleanup.<locals>.<lambda>Ï  ó   ø€ ¨;€ r   )r   rY   r_   )r?  rÈ   r[   s   ` €r   r´   z.MulticastTests.test_multicast.<locals>.cleanupÍ  s%   ù€ Ü" 1§?¡?Ó3ˆFØ×ÑÓ6Ô7ØˆMr   )r*   r   r
  r`   rr   rV   r  r_   )r   r  r  r  r´   r0   r9  r[   s   `    @@@r   Útest_multicastzMulticastTests.test_multicast¶  s•   û€ ô
 ‹HˆÜ×#Ñ# A qÓ)ˆØ�{‰{×$Ñ$×,Ñ,Ó.ˆà—‘×&Ñ&×0Ñ0°Ó?ˆö	ð
 	×Ñ˜8Ô$ô	Hð 	×Ñ˜8Ô$ô	ð
 	×Ñ˜7Ô#àˆr   zjon non-linux platforms it appears multiple processes can listen, but not multiple sockets in same process?c                 ó  ‡ ‡‡‡‡‡	‡
— t        «       Št        j                  d‰d¬«      Š‰j                  «       j                  Št        «       Št        j                  ‰‰d¬«      Š	dŠ
t        ‰ j                  j                  j                  ‰
«      ‰j                  ‰
«      ‰	j                  ‰
«      g«      }ˆˆˆˆ
fd„}|j                  |«       ˆˆˆ fd„}|j                  |«       ˆˆ	fd„}|j                  |«       |S )z¢
        Test that multiple sockets can listen on the same multicast port and
        that they both receive multicast messages directed to that address.
        r   T)ÚlistenMultipler  c                 óž   •— t        «       x}‰_        t        «       x}‰_        ‰j                  j                  d‰‰f«       t	        ||g«      S )Nr8  )r
   r.   rr   r†   r   )rZ   r%  r&  ÚfirstClientÚportnoÚsecondClientÚtheGroups      €€€€r   r1  z5MulticastTests.test_multiListen.<locals>.serverJoinedò  sK   ø€ Ü.6«jÐ8ˆB�Ô+Ü/7«zÐ9ˆB�Ô,Ø×!Ñ!×'Ñ'¨¸À6Ð8JÔKÜ  " b Ó*Ð*r   c                 óŽ   •— ‰j                  ‰j                  d   d   d«       ‰j                  ‰j                  d   d   d«       y r;  r°   )rZ   rE  rG  r   s    €€€r   Ú
gotPacketsz3MulticastTests.test_multiListen.<locals>.gotPacketsú  sC   ø€ Ø×Ñ˜[×0Ñ0°Ñ3°AÑ6¸ÔGØ×Ñ˜\×1Ñ1°!Ñ4°QÑ7¸ÕHr   c                 ó˜   •‡ — t        t        ‰j                  «      t        ‰j                  «      g«      }|j                  ˆ fd„«       |S )Nc                 ó   •— ‰S r   r(   r>  s    €r   rÉ   zBMulticastTests.test_multiListen.<locals>.cleanup.<locals>.<lambda>  r@  r   )r   r   rY   r_   )r?  rÈ   Ú	firstPortÚ
secondPorts   ` €€r   r´   z0MulticastTests.test_multiListen.<locals>.cleanup   sD   ù€ Ü"ä! )×"9Ñ"9Ó:Ü! *×":Ñ":Ó;ðóˆFð ×ÑÓ6Ô7ØˆMr   )r*   r   r
  rV   rl   r   r`   rr   r  r_   rÊ   )r   r  r1  rJ  r´   rE  rM  rF  rG  rN  rH  s   `    @@@@@@r   Útest_multiListenzMulticastTests.test_multiListenÖ  sÛ   þ€ ô “hˆÜ×+Ñ+¨A¨{È4ÔPˆ	à×"Ñ"Ó$×)Ñ)ˆä“xˆÜ×,Ñ,¨V°\ÐRVÔWˆ
à ˆÜà—‘×%Ñ%×/Ñ/°Ó9Ø×#Ñ# HÓ-Ø×$Ñ$ XÓ.ðó
ˆ÷	+ð 	×Ñ˜<Ô(ö	Ið 	×Ñ˜:Ô&õ	ð 	�‰�wÔØˆr   )r%   r&   r'   rñ   rò   ró   r   ÚplatformÚisMacOSXr  r   ÚIReactorMulticastr   r÷   rù   r  r  r'  r2  r   Ú	isWindowsÚisVistar5  rA  rO  r(   r   r   r  r  6  sä   „ ð 	�
‰
�‰Ð'Ó(Ð,<Ò<Ø×Ñ×%Ñ%Ô'à1ˆà'ˆ:×'Ñ'¨°Ô6Ø8ˆòYò
ò6ò"òHò$ñ0 Ø×Ñ×"Ñ"Ó$ÒG¨W×-=Ñ-=×-EÑ-EÓ-GÐ)GØ<óñ
ó	ð
òñ@ Ø×Ñ×"Ñ"Ó$ð	óñ/óñ/r   r  )!rF   rñ   Úunittestr   Útwisted.internetr   r   r   r   r   r	   Útwisted.internet.deferr
   r   r   Útwisted.pythonr   Útwisted.trial.unittestr   r   ÚDatagramProtocolr*   ÚConnectedDatagramProtocolr4   rB   rÛ   rE   rH   r  rO   rõ   rR  r  r(   r   r   ú<module>r\     s0  ðñ
ó
 
Ý ç M× Mß IÑ IÝ "Ý +÷ñ ô&ˆU�H×-Ñ-ô ôˆU�H×6Ñ6ô ô.�ô ô�Yô ô@�×)Ñ)ô @ñ, Ð"ˆJ×"Ñ" 7¨DÓ1Ð1Ð3VÓWôN+ˆxó N+ó XðN+ñb Ð"ˆJ×"Ñ" 7¨DÓ1Ð1Ð3VÓWô3 hó 3ó Xð3ñl Ø$ˆ
×$Ñ$ W¨dÓ3Ð3Ø-óôQ�Xó Qó	ñQr   