§
    |Ådr ã                   óX  — d Z ddlmZm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ZddlZddlZddlZddlZddlZdZdZdZdZdZd	Zd
ZdZdZ G d„ d¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Z  G d„ de¦  «        Z! G d„ d¦  «        Z"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+d Z,d!Z-d"Z.d#Z/d$Z0d%Z1d&Z2d'Z3d(Z4d)Z5d*Z6d+Z7d,Z8d-Z9d.Z:d/Z;ej<        fd0„Z= G d1„ d2¦  «        Z> G d3„ d4¦  «        Z? G d5„ d6e¦  «        Z@ G d7„ d8¦  «        ZAd9„ ZBd:„ ZCd;„ ZDd<„ ZEd=„ ZF G d>„ d?¦  «        ZGdS )@a(  
packet.py - definitions and classes for Python querying of NTP

Freely translated from the old C ntpq code by ESR, with comments
preserved.  The idea was to cleanly separate ntpq-that-was into a
thin front-end layer handling mainly command interpretation and a
back-end that presents the take from ntpd as objects that can be
re-used by other front ends. Other reusable pieces live in util.py.

This code should be Python2-vs-Python-3 agnostic.  Keep it that way!

Here are some pictures to help make sense of this code. First, from RFC 5905,
the general structure of an NTP packet (Figure 8):

       0                   1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |LI | VN  |Mode |    Stratum    |     Poll      |  Precision    |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                         Root Delay                            |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                         Root Dispersion                       |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                          Reference ID                         |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      +                     Reference Timestamp (64)                  +
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      +                      Origin Timestamp (64)                    +
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      +                      Receive Timestamp (64)                   +
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      +                      Transmit Timestamp (64)                  +
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      .                                                               .
      .                    Extension Field 1 (variable)               .
      .                                                               .
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      .                                                               .
      .                    Extension Field 2 (variable)               .
      .                                                               .
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                          Key Identifier                       |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      |                           digest (128)                        |
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

The fixed header is 48 bytes long.  The simplest possible case of an
NTP packet is the minimal SNTP request, a mode 3 packet with the
Stratum and all following fields zeroed out to byte 47.

How to interpret these fields:

The modes are as follows:

+-------+--------------------------+
| Value | Meaning                  |
+-------+--------------------------+
| 0     | reserved                 |
| 1     | symmetric active         |
| 2     | symmetric passive        |
| 3     | client                   |
| 4     | server                   |
| 5     | broadcast                |
| 6     | NTP control message      |
| 7     | reserved for private use |
+-------+--------------------------+

While the Stratum field has 8 bytes, only values 0-16 (low 5 bits)
are legal. Value 16 means 'unsynchronized' Values 17-255 are reserved.

LI (Leap Indicator), Version, Poll, and Precision are not described
here; see RFC 5905.

t_1, the origin timestamp, is the time according to the client at
which the request was sent.

t_2, the receive timestamp, is the time according to the server at
which the request was received.

t_3, the transmit timestamp, is the time according to the server at
which the reply was sent.

You also need t_4, the destination timestamp, which is the time according to
the client at which the reply was received.  This is not in the reply packet,
it's the packet receipt time collected by the client.

The 'Reference timestamp' is an unused historical relic.  It's supposed to be
copied unchanged from upstream in the stratum hierarchy. Normal practice
has been for Stratum 1 servers to fill it in with the raw timestamp from the
most recent reference-clock.

Theta is the thing we want to estimate: the offset between the server
clock and the client clock. The sign convention is that theta is
positive if the server is ahead of the client.

Theta is estimated by [(t_2-t_1)+(t_3-t_4)]/2. The accuracy of this
estimate is predicated upon network latency being symmetrical.

Delta is the network round trip time, i.e. (t_4-t_1)-(t_3-t_2). Here's
how the terms work: (t_4-t_1) is the total time that the request was
in flight, and (t_3-t_2) is the time that the server spent processing it;
when you subtract that out you're left with just network delays.

Lambda nominally represents the maximum amount by which theta could be
off. It's computed as delta/2 + epsilon. The delta/2 term usually
dominates and represents the maximum amount by which network asymmetry
could be throwing off the calculation. Epsilon is the sum of three
other sources of error:

rho_r: the (im)precision field from response packet, representing the
server's inherent error in clock measurement.

rho_s: the client's own (im)precision.

PHI*(t_4-t_1): The amount by which the client's clock may plausibly
have drifted while the packet was in flight. PHI is taken to be a
constant of 15ppm.

rho_r and rho_s are estimated by making back-to-back calls to
clock_gettime() (or similar) and taking their difference. They're
encoded on the wire as an eight-bit two's complement integer
representing, to the nearest integer, log_2 of the value in seconds.

If you look at the raw data, there are 3 unknowns:
   * transit time client to server
   * transit time server to client
   * clock offset
but there are only two equations, so you can't solve it.

NTP gets the 3rd equation by assuming the transit times are equal.  That lets
it solve for the clock offset.

If you assume that both clocks are accurate which is reasonable if you have
GPS at both ends, then you can easily solve for the transit times in each
direction.

The RFC 5905 diagram is slightly out of date in that the digest header assumes
a 128-bit (16-octet) MD5 hash, but it is also possible for the field to be a
128-bit AES_CMAC hash or 160-bit (20-octet) SHA-1 hash.  NTPsec will
support any 128- or 160-bit MAC type in libcrypto.

An extension field consists of a 16-bit network-order type field
length, followed by a 16-bit network-order payload length in octets,
followed by the payload (which must be padded to a 4-octet boundary).

       0                   1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |         Type field             |      Payload length          |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      |                        Payload (variable)                     |
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Here's what a Mode 6 packet looks like:

       0                   1                   2                   3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |LI | VN  | 6   |R|E|M|  Opcode  |          Sequence            |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |               Status           |       Association ID         |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |               Offset           |            Count             |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      .                                                               .
      .                        Payload (variable)                     .
      .                                                               .
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                          Key Identifier                       |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      |                           digest (128)                        |
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

In this case, the fixed header is 24 bytes long.

R = Response bit
E = Error bit
M = More bit.

A Mode 6 packet cannot have extension fields.

é    )Úprint_functionÚdivisionNé    iˆ  i¸  iÿÿ  é   é   é   é   é   c                   ó¼   — e Zd ZdZed„ ¦   «         Zed„ ¦   «         Zej        j	        ej        j
        dfd„Zed„ ¦   «         Zej        d„ ¦   «         Zd„ Zd	„ Zd
„ ZdS )ÚPacketzEncapsulate an NTP fragmentc                 ó   — | dz  dz  |dz  z  S )Né   é   © )ÚvÚms     ú,/usr/lib/python3/dist-packages/ntp/packet.pyÚVN_MODEzPacket.VN_MODE  s   € à�a‘%˜A‘ ! c¡'Ñ*Ð+ó    c                 óJ   — | dz  dz  t                                ||¦  «        z  S )Nr   é   )r   r   )Úlr   r   s      r   ÚPKT_LI_VN_MODEzPacket.PKT_LI_VN_MODE  s#   € à�a‘%˜A‘¥§¢°°1Ñ!5Ô!5Ñ5Ð6r   Nc                 ó�   — || _         d| _        d| _        t                               t
          j        j        ||¦  «        | _        d S )Nr   r   )ÚsessionÚ
li_vn_modeÚ	extensionr   r   ÚntpÚmagicÚLEAP_NOTINSYNC)ÚselfÚmodeÚversionr   s       r   Ú__init__zPacket.__init__  s>   € àˆŒØˆŒàˆŒÝ ×/Ò/µ´	Ô0HØ07¸ñ?ô ?ˆŒˆˆr   c                 ó   — | j         S ©N)Ú_Packet__extension©r!   s    r   r   zPacket.extension  s   € àÔÐr   c                 óN   — t           j                             |¦  «        | _        d S r&   )r   ÚpolyÚ	polybytesr'   )r!   Úxs     r   r   zPacket.extension"  s    € åœ8×-Ò-¨aÑ0Ô0ˆÔÐÐr   c                 óV   — dt           j                             | j        ¦  «                 S )N)zno-leapzadd-leapzdel-leapÚunsync)r   r   ÚPKT_LEAPr   r(   s    r   ÚleapzPacket.leap&  s&   € ðÝœ)×,Ò,¨T¬_Ñ=Ô=ô?ð 	?r   c                 ó   — | j         dz	  dz  S )Nr   r   ©r   r(   s    r   r#   zPacket.version*  s   € Ø” 1Ñ$¨Ñ+Ð+r   c                 ó   — | j         dz  S )Nr   r2   r(   s    r   r"   zPacket.mode-  s   € ØŒ Ñ$Ð$r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ústaticmethodr   r   r   r   ÚMODE_CLIENTÚNTP_VERSIONr$   Úpropertyr   Úsetterr0   r#   r"   r   r   r   r   r   	  sÝ   € € € € € Ø!Ð!àð,ð ,ñ „\ð,ð ð7ð 7ñ „\ð7ð  œIÔ1ØœÔ.¸ð?ð ?ð ?ð ?ð ð ð  ñ „Xð ð Ôð1ð 1ñ Ôð1ð?ð ?ð ?ð,ð ,ð ,ð%ð %ð %ð %ð %r   r   c                   ó   — e Zd Zdd„Zd„ ZdS )ÚSyncExceptionr   c                 ó"   — || _         || _        d S r&   ©ÚmessageÚ	errorcode©r!   rA   rB   s      r   r$   zSyncException.__init__2  ó   € ØˆŒØ"ˆŒˆˆr   c                 ó   — | j         S r&   ©rA   r(   s    r   Ú__str__zSyncException.__str__6  ó
   € ØŒ|Ðr   N©r   ©r4   r5   r6   r$   rG   r   r   r   r>   r>   1  s7   € € € € € ð#ð #ð #ð #ðð ð ð ð r   r>   c                   óÂ   — e Zd ZdZdZdZdZdZdd„Zd„ Z	e
d	„ ¦   «         Ze
d
„ ¦   «         Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )Ú
SyncPacketz5Mode 1-5 time-synchronization packet, including SNTP.z!BBBbIIIQQQQé0   l   €~T ghUMuï>Ú c                 ó  — t                                | ¦  «         d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _	        d| _
        d| _        d| _        d| _        g | _        d| _        d | _        d | _        t$                               t)          j        ¦   «         ¦  «        | _        d| _        d| _        |r4|                      t2          j                             |¦  «        ¦  «         d S d S )Nr   rN   TF)r   r$   ÚstatusÚstratumÚpollÚ	precisionÚ
root_delayÚroot_dispersionÚrefidÚreference_timestampÚorigin_timestampÚreceive_timestampÚtransmit_timestampr   Ú	extfieldsÚmacÚhostnameÚresolvedrL   Úposix_to_ntpÚtimeÚreceivedÚtrustedÚrescaledÚanalyzer   r*   r+   )r!   Údatas     r   r$   zSyncPacket.__init__A  sì   € Ý�Š˜ÑÔÐØˆŒØˆŒØˆŒ	ØˆŒØˆŒØ ˆÔØˆŒ
Ø#$ˆÔ Ø !ˆÔØ!"ˆÔØ"#ˆÔØˆŒØˆŒØˆŒØˆŒØˆŒÝ"×/Ò/µ´	±´Ñ<Ô<ˆŒØˆŒØˆŒØð 	3Ø�LŠL�œ×+Ò+¨DÑ1Ô1Ñ2Ô2Ð2Ð2Ð2ð	3ð 	3r   c                 ó€  — t          |¦  «        }|t          j        k     s	|dz  dk    rt          d¦  «        ‚t	          j        t          j        |d t          j        …         ¦  «        \  | _        | _        | _	        | _
        | _        | _        | _        | _        | _        | _        | _        |t          j        d …         | _        | j        }t          |¦  «        dk    rgt	          j        d|d d…         ¦  «        \  }}| j                             ||dd|z   …         f¦  «         |d|z   d …         }t          |¦  «        dk    °gt          |¦  «        dk    r	|| _        d S t          |¦  «        dk    rt          d	¦  «        ‚t          |¦  «        d
v rt          d¦  «        ‚t          |¦  «        dv r	|| _        d S d S )Nr   r   zimpossible packet lengthé   z!IIr	   r   r   zUnsupported DES authentication)r	   r   zPacket is a runt)r
   rg   )ÚlenrL   Ú
HEADER_LENr>   ÚstructÚunpackÚformatr   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r   r[   Úappendr\   )r!   re   ÚdatalenÚpayloadÚftypeÚflens         r   rd   zSyncPacket.analyzeY  sº  € Ý�d‘)”)ˆØ•ZÔ*Ò*Ð*¨w¸©{¸qÒ.@Ð.@ÝÐ :Ñ;Ô;Ð;õ %+¤MÝÔ˜tÐ$:¥ZÔ%:Ð$:Ô;ñ%=ô %=ñ
	"ˆŒØ	ŒØ	ŒØ	ŒØ	ŒØ	Ô	Ø	ŒØ	Ô	!Ø	Ô	Ø	Ô	Ø	Ô	 à�jÔ3Ð4Ð4Ô5ˆŒð ”.ˆÝ�'‰lŒl˜RÒÐÝ"œM¨%°¸¸!¸´Ñ=Ô=‰MˆU�DØŒN×!Ò! 5¨'°!°A°d±F°(Ô*;Ð"<Ñ=Ô=Ð=Ø˜a ™f˜g˜gÔ&ˆGõ �'‰lŒl˜RÒÐõ ˆw‰<Œ<˜1ÒÐØˆDŒHˆHˆHÝ�‰\Œ\˜RÒÐÝÐ @ÑAÔAÐAÝ�‰\Œ\˜WÐ$Ð$ÝÐ 2Ñ3Ô3Ð3Ý�‰\Œ\˜XÐ%Ð%ØˆDŒHˆHˆHð &Ð%r   c                 ó&   — | dz  t           j        z
  S )z!Scale from NTP time to POSIX timeì        )rL   Ú
UNIX_EPOCH©Úts    r   Úntp_to_posixzSyncPacket.ntp_to_posix‚  s   € ð �U‘�zÔ4Ñ4Ð4r   c                 ó@   — t          | t          j        z   dz  ¦  «        S )z!Scale from POSIX time to NTP timers   )ÚintrL   rt   ru   s    r   r_   zSyncPacket.posix_to_ntpˆ  s   € õ
 �A�
Ô-Ñ-°Ñ6Ñ7Ô7Ð7r   c                 óÎ  — | j         sÝd| _         | xj        dz  c_        | xj        dz  c_        t                               | j        ¦  «        | _        t                               | j        ¦  «        | _        t                               | j        ¦  «        | _        t                               | j        ¦  «        | _        t                               | j	        ¦  «        | _	        dS dS )z%Rescale all timestamps to POSIX time.Tr   N)
rc   rT   rU   rL   rw   rW   rX   rY   rZ   ra   r(   s    r   ÚposixizezSyncPacket.posixize�  s×   € àŒ}ð 	CØ ˆDŒMØˆOŒO Ñ"ˆOŒOØÐ Ô  RÑ'Ð Ô Ý'1×'>Ò'>ØÔ(ñ(*ô (*ˆDÔ$å$.×$;Ò$;ØÔ%ñ%'ô %'ˆDÔ!å%/×%<Ò%<ØÔ&ñ&(ô &(ˆDÔ"å&0×&=Ò&=ØÔ'ñ')ô ')ˆDÔ#å&×3Ò3°D´MÑBÔBˆDŒMˆMˆMð	Cð 	Cr   c                 ó   — | j         S r&   )rX   r(   s    r   Út1zSyncPacket.t1Ÿ  s   € ØÔ$Ð$r   c                 ó   — | j         S r&   )rY   r(   s    r   Út2zSyncPacket.t2¢  s   € ØÔ%Ð%r   c                 ó   — | j         S r&   )rZ   r(   s    r   Út3zSyncPacket.t3¥  s   € ØÔ&Ð&r   c                 ó   — | j         S r&   )ra   r(   s    r   Út4zSyncPacket.t4¨  s
   € ØŒ}Ðr   c                 ó¨   — |                       ¦   «         |                      ¦   «         z
  |                      ¦   «         |                      ¦   «         z
  z
  S )zPacket flight time)rƒ   r}   r�   r   r(   s    r   ÚdeltazSyncPacket.delta«  s7   € à—’‘	”	˜DŸGšG™IœIÑ%¨$¯'ª'©)¬)°d·g²g±i´iÑ*?Ñ@Ð@r   c                 ó„   — t           j        |                      ¦   «         |                      ¦   «         z
  z  d| j        z  z   S )z(Residual error due to clock imprecision.é   )rL   ÚPHIrƒ   r}   rS   r(   s    r   ÚepsilonzSyncPacket.epsilon¯  s2   € õ Œ~ §¢¡¤¨T¯WªW©Y¬YÑ!6Ñ7¸!¸T¼^Ñ:KÑKÐKr   c                 ót   — t          |                      ¦   «         dz  |                      ¦   «         z   ¦  «        S )z?Synchronization distance, estimates worst-case error in secondsr‡   )Úabsr…   r‰   r(   s    r   ÚsynchdzSyncPacket.synchd´  s+   € õ �4—:’:‘<”< ‘> D§L¢L¡N¤NÑ2Ñ3Ô3Ð3r   c                 ó®   — |                       ¦   «         |                      ¦   «         z
  |                      ¦   «         |                      ¦   «         z
  z   dz  S )z9Adjustment implied by this packet - 'theta' in NTP-speak.r‡   )r   r}   r�   rƒ   r(   s    r   ÚadjustzSyncPacket.adjust¹  s<   € à—’‘”˜4Ÿ7š7™9œ9Ñ$ t§w¢w¡y¤y°·²±´Ñ':Ñ;¸QÑ>Ð>r   c                 óÖ   — t          j        t          j        | j        | j        | j        | j        | j        | j	        | j
        | j        | j        | j        | j        ¦  «        }|| j        z   S ©z*Flatten the packet into an octet sequence.)rj   ÚpackrL   rl   r   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r   ©r!   Úbodys     r   ÚflattenzSyncPacket.flatten½  sc   € åŒ{�:Ô,Øœ?Øœ<Øœ9Øœ>Øœ?ØÔ/Øœ:ØÔ3ØÔ0ØÔ1ØÔ2ñ4ô 4ˆð �d”nÑ$Ð$r   c                 ó`   — | j         dz	  dz  | j         dz	  dz  | j         dz	  dz  | j         dz  fS )zAnalyze refid into octets.rg   éÿ   r   r	   )rV   r(   s    r   Úrefid_octetszSyncPacket.refid_octetsÍ  sB   € à”˜rÑ! TÑ)Ø”˜rÑ! TÑ)Ø”˜q‘ DÑ(Ø”
˜TÑ!ð#ð 	#r   c                 ó‚   — t           j                             t          j        d|                      ¦   «         z   Ž ¦  «        S )z'Sometimes it's a clock name or KOD type)ÚBBBB)r   r*   Úpolystrrj   r‘   r—   r(   s    r   Úrefid_as_stringzSyncPacket.refid_as_stringÔ  s0   € åŒx×Ò¥¤¨i¸$×:KÒ:KÑ:MÔ:MÑ.MÐ OÑPÔPÐPr   c                 ój   — t           j                             d|                      ¦   «         z  ¦  «        S )zSometimes it's an IPV4 address.z%d.%d.%d.%d)r   r*   rš   r—   r(   s    r   Úrefid_as_addresszSyncPacket.refid_as_addressØ  s)   € åŒx×Ò °×0AÒ0AÑ0CÔ0CÑ CÑDÔDÐDr   c                 ó2   — t          | j        ¦  «        dk    S )Nr   ©rh   r\   r(   s    r   Úis_crypto_nakzSyncPacket.is_crypto_nakÜ  s   € Ý�4”8‰}Œ} Ò!Ð!r   c                 ó2   — t          | j        ¦  «        dk    S )Nr
   rŸ   r(   s    r   Úhas_MD5zSyncPacket.has_MD5ß  ó   € Ý�4”8‰}Œ} Ò"Ð"r   c                 ó2   — t          | j        ¦  «        dk    S )Nrg   rŸ   r(   s    r   Úhas_SHA1zSyncPacket.has_SHA1â  r£   r   c                 óê  — d|                       ¦   «         |                      ¦   «         |                      ¦   «         fz  }|d| j        | j        fz  z  }|                      ¦   «         }t          d„ |D ¦   «         ¦  «        s|                      ¦   «         }|d|z   z  }|dt          j	         
                    t                               | j        ¦  «        ¦  «        z   z  }|dt          j	         
                    t                               | j        ¦  «        ¦  «        z   z  }|dt          j	         
                    t                               | j        ¦  «        ¦  «        z   z  }|dt          j	         
                    t                               | j        ¦  «        ¦  «        z   z  }| j        r|dt%          | j        ¦  «        z   z  }| j        r"|dt%          | j        ¦  «        dd…         z   z  }|dz  }|S )z@Represent a posixized sync packet in an eyeball-friendly format.z<NTP:%s:%d:%d:z%f:%fc              3   ó2   K  — | ]}|t           j        v V — Œd S r&   )ÚstringÚ	printable)Ú.0Úcs     r   ú	<genexpr>z&SyncPacket.__repr__.<locals>.<genexpr>ê  s*   è è € Ð5Ð5¨Q�1�Ô(Ð(Ð5Ð5Ð5Ð5Ð5Ð5r   ú:é   éÿÿÿÿú>)r0   r#   r"   rT   rU   r›   Úallr�   r   ÚutilÚrfc3339rL   rw   rW   rX   rY   rZ   r[   Úreprr\   )r!   ÚrÚrss      r   Ú__repr__zSyncPacket.__repr__å  sÑ  € à §	¢	¡¤¨T¯\ª\©^¬^¸T¿YºY¹[¼[ÐIÑIˆØ	ˆW˜œ¨Ô)=Ð>Ñ>Ñ>ˆØ×!Ò!Ñ#Ô#ˆÝÐ5Ð5°"Ð5Ñ5Ô5Ñ5Ô5ð 	)Ø×&Ò&Ñ(Ô(ˆBØ	ˆS�2‰X‰ˆØ	ˆS•3”8×#Ò#Ý×#Ò# DÔ$<Ñ=Ô=ñ?ô ?ñ ?ñ 	?ˆà	ˆS•3”8×#Ò#Ý×#Ò# DÔ$9Ñ:Ô:ñ<ô <ñ <ñ 	<ˆà	ˆS•3”8×#Ò#Ý×#Ò# DÔ$:Ñ;Ô;ñ=ô =ñ =ñ 	=ˆà	ˆS•3”8×#Ò#Ý×#Ò# DÔ$;Ñ<Ô<ñ>ô >ñ >ñ 	>ˆàŒ>ð 	,Ø�•t˜DœNÑ+Ô+Ñ+Ñ+ˆAØŒ8ð 	,Ø�•t˜DœH‘~”~ a¨ dÔ+Ñ+Ñ+ˆAØ	ˆS‰ˆØˆr   N)rN   )r4   r5   r6   r7   rl   ri   rt   rˆ   r$   rd   r8   rw   r_   r{   r}   r   r�   rƒ   r…   r‰   rŒ   rŽ   r”   r—   r›   r�   r    r¢   r¥   r·   r   r   r   rL   rL   :  s–  € € € € € Ø;Ð;Ø€FØ€JØ€JØ
€Cð3ð 3ð 3ð 3ð0'ð 'ð 'ðR ð5ð 5ñ „\ð5ð
 ð8ð 8ñ „\ð8ðCð Cð Cð %ð %ð %ð&ð &ð &ð'ð 'ð 'ðð ð ðAð Að AðLð Lð Lð
4ð 4ð 4ð
?ð ?ð ?ð%ð %ð %ð #ð #ð #ðQð Qð QðEð Eð Eð"ð "ð "ð#ð #ð #ð#ð #ð #ðð ð ð ð r   rL   c                   ó^   — e Zd ZdZdd„ZdZdZd„ Zd„ Zd	„ Z	d
„ Z
d„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚControlPacketzMode 6 request/response.r   rN   c                 óæ   — t                                | t          j        j        |j        |¬¦  «         || _        d| _        d| _        || _	        d| _
        || _        t          |¦  «        | _        d S )N)r"   r#   r   r®   r   )r   r$   r   r   ÚMODE_CONTROLÚ
pktversionÚr_e_m_opÚsequencerP   ÚassocidÚoffsetr   rh   Úcount)r!   r   Úopcoder¿   Úqdatas        r   r$   zControlPacket.__init__   sl   € Ý�Š˜¥3¤9Ô#9Ø 'Ô 2Ø 'ð 	ñ 	)ô 	)ð 	)ð ˆŒØˆŒØˆŒØˆŒØˆŒØˆŒÝ˜‘Z”ZˆŒ
ˆ
ˆ
r   z!BBHHHHHr   c                 ó   — | j         dz  rdndS )Né€   TF©r½   r(   s    r   Úis_responsezControlPacket.is_response  ó   € Ø”} tÑ+Ð6ˆtˆt°Ð6r   c                 ó   — | j         dz  rdndS )Né@   TFrÆ   r(   s    r   Úis_errorzControlPacket.is_error  rÈ   r   c                 ó   — | j         dz  rdndS )Nr   TFrÆ   r(   s    r   ÚmorezControlPacket.more  rÈ   r   c                 ó   — | j         dz  S )Né   rÆ   r(   s    r   rÂ   zControlPacket.opcode  s   € ØŒ}˜tÑ#Ð#r   c                 ó   — | j         dz	  dz  S )Nr	   r–   )rP   r(   s    r   ÚerrcodezControlPacket.errcode  s   € Ø”˜qÑ  DÑ(Ð(r   c                 ó    — | j         | j        z   S r&   )rÁ   rÀ   r(   s    r   ÚendzControlPacket.end  s   € ØŒz˜DœKÑ'Ð'r   c                 óJ   — d| j         |                      ¦   «         | j        fz  S )z Return statistics on a fragment.z%5d %5d	%3d octets
)rÀ   rÓ   rÁ   r(   s    r   ÚstatszControlPacket.stats   s    € à&¨$¬+°t·x²x±z´zÀ4Ä:Ð)NÑNÐNr   c                 ó^  — t           j                             |¦  «        }t          j        t
          j        |d t
          j        …         ¦  «        \  | _        | _	        | _
        | _        | _        | _        | _        |t
          j        d …         | _        | j
        | j        | j        | j        fS r&   )r   r*   r+   rj   rk   r¹   rl   ri   r   r½   r¾   rP   r¿   rÀ   rÁ   r   )r!   Úrawdatas     r   rd   zControlPacket.analyze$  s“   € Ý”(×$Ò$ WÑ-Ô-ˆõ ”}¥]Ô%9Ø%,Ð-F­mÔ.FÐ-FÔ%GñIô Iñ	ˆŒØ	ŒØ	ŒØ	ŒØ	ŒØ	ŒØ	Œà ¥Ô!9Ð!:Ð!:Ô;ˆŒØ”˜tœ{¨D¬L¸$¼+ÐFÐFr   c           
      ó¦   — t          j        t          j        | j        | j        | j        | j        | j        | j	        | j
        ¦  «        }|| j        z   S r�   )rj   r‘   r¹   rl   r   r½   r¾   rP   r¿   rÀ   rÁ   r   r’   s     r   r”   zControlPacket.flatten1  sJ   € åŒ{�=Ô/Øœ?Øœ=Øœ=Øœ;Øœ<Øœ;Øœ:ñ'ô 'ˆð �d”nÑ$Ð$r   c                 ó^   — | j                              |                      ¦   «         ¦  «         d S r&   )r   Úsendpktr”   r(   s    r   ÚsendzControlPacket.send=  s&   € ØŒ×Ò˜TŸ\š\™^œ^Ñ,Ô,Ð,Ð,Ð,r   N)r   r   rN   )r4   r5   r6   r7   r$   rl   ri   rÇ   rË   rÍ   rÂ   rÑ   rÓ   rÕ   rd   r”   rÛ   r   r   r   r¹   r¹   ý  sÖ   € € € € € ØÐð
 ð 
 ð 
 ð 
 ð €FØ€Jð7ð 7ð 7ð7ð 7ð 7ð7ð 7ð 7ð$ð $ð $ð)ð )ð )ð(ð (ð (ðOð Oð OðGð Gð Gð
%ð 
%ð 
%ð-ð -ð -ð -ð -r   r¹   c                   ó(   — e Zd ZdZd„ Zd„ Zd„ ZeZdS )ÚPeerz*The information we have about an NTP peer.c                 ó>   — || _         || _        || _        i | _        d S r&   )r   r¿   rP   Ú	variables)r!   r   r¿   rP   s       r   r$   zPeer.__init__D  s"   € ØˆŒØˆŒØˆŒØˆŒˆˆr   c                 óB   — | j                              ¦   «         | _        d S r&   )r   Úreadvarrß   r(   s    r   ÚreadvarszPeer.readvarsJ  s   € Øœ×-Ò-Ñ/Ô/ˆŒˆˆr   c                 ó$   — d| j         | j        fz  S )Nz<Peer: associd=%s status=%0x>)r¿   rP   r(   s    r   rG   zPeer.__str__M  s   € Ø.°$´,ÀÄÐ1LÑLÐLr   N)r4   r5   r6   r7   r$   râ   rG   r·   r   r   r   rÝ   rÝ   A  sI   € € € € € Ø0Ð0ðð ð ð0ð 0ð 0ðMð Mð Mà€H€H€Hr   rÝ   z.***Server reports a bad format request packet
z/***Server disallowed request (authentication?)
z****Server reports a bad opcode in request
z(***Association ID {0} unknown to server
z,***A request variable unknown to the server
z/***Server indicates a request variable was bad
z(***Server returned an unspecified error
z.***Socket error; probably ntpd is not running
z***Request timed out
z'***Response from server was incomplete
z****Buffer size exceeded for returned data
z***Select call failed
z***No host open
z3***Response length should have been a multiple of 4z***Invalid key identifierz***Invalid passwordz***Key not foundz#***Unexpected nonce response formatz***Unknown parameter '%s'z***No credentialsz***Server error code %sz?***No response, probably high-traffic server with low MRU limitz***Bad MRU tag %sz#***Sort order %s is not implementedz%***No trusted keys have been declaredc                 óZ  — d}| r¦t           j                             | |¦  «        \  }} t          |¦  «        }d|z  }d„ |D ¦   «         }|t	          |¦  «        z  }||k     r|d||z
  z  z  }d„ |D ¦   «         }|d                     |¦  «        dz   z  }|                     |¦  «         | °¤dS dS )	z.Dump a packet in hex, in a familiar hex formatr   z%02x c                 óL   — g | ]!}t           j                             |¦  «        ‘Œ"S r   )r   r*   Úpolyord©rª   r,   s     r   ú
<listcomp>z&dump_hex_printable.<locals>.<listcomp>w  s(   € Ð:Ð:Ð:¨A•C”H×$Ò$ QÑ'Ô'Ð:Ð:Ð:r   z   c                 óP   — g | ]#}d |cxk    rdk     rn nt          |¦  «        nd‘Œ$S )r   é   ú.)Úchrrç   s     r   rè   z&dump_hex_printable.<locals>.<listcomp>|  s:   € ÐIÐIÐI¸1˜r Q˜}˜}š}˜}¨š}˜}˜}˜}˜}•C˜‘F”F�F°3ÐIÐIÐIr   rN   ú
N)r   r²   Ú	slicedatarh   ÚtupleÚjoinÚwrite)ÚxdataÚoutfpÚrowsizeÚlinedataÚlinelenÚlines         r   Údump_hex_printablerø   m  sß   € à€GØ
ð åœ(×,Ò,¨U°GÑ<Ô<‰ˆ�%å�h‘-”-ˆØ˜Ñ ˆà:Ð:°Ð:Ñ:Ô:ˆØ•�h‘”ÑˆØ�WÒÐØ�E˜W wÑ.Ñ/Ñ/ˆDàIÐIÀÐIÑIÔIˆØ�—’˜Ñ!Ô! DÑ(Ñ(ˆØ�Š�DÑÔÐð ð ð ð ð ð r   c                   ó*   — e Zd ZdZd„ Zd„ Zd„ Zd„ ZdS )ÚMRUEntryz A traffic entry for an MRU list.c                 óv   — d | _         d | _        d | _        d | _        d | _        d| _        d | _        d | _        d S )Nr   )ÚaddrÚlastÚfirstÚmvr¶   ÚctÚscÚdrr(   s    r   r$   zMRUEntry.__init__„  s>   € ØˆŒ	ØˆŒ	ØˆŒ
ØˆŒØˆŒØˆŒØˆŒØˆŒˆˆr   c                 ó¬   — t           j                             | j        ¦  «        }t           j                             | j        ¦  «        }||z
  | j        z  S r&   )r   ÚntpcÚ
lfptofloatrý   rþ   r   )r!   rý   rþ   s      r   ÚavgintzMRUEntry.avgintŽ  sA   € ÝŒx×"Ò" 4¤9Ñ-Ô-ˆÝ”×#Ò# D¤JÑ/Ô/ˆØ�u‘ ¤Ñ'Ð'r   c                 óh  — | j         }|d         dk    ra|d|                     d¦  «        …         }|                     d¦  «        }|dk    r
|d |…         }t          j        t          j        |¦  «        S |d |                     d¦  «        …         }dt          j        t          j        |¦  «        z   S )Nr   ú[r®   ú]ú%r­   s                   )rü   ÚfindÚsocketÚ	inet_ptonÚAF_INET6ÚAF_INET)r!   rü   Úpcts      r   ÚsortaddrzMRUEntry.sortaddr“  s¡   € ØŒyˆØ�Œ7�cŠ>ˆ>ð ˜˜$Ÿ)š) C™.œ.Ð(Ô)ˆDØ—)’)˜C‘.”.ˆCØ�QŠwˆwà˜D˜S˜D”z�ÝÔ#¥F¤O°TÑ:Ô:Ð:ð ˜˜Ÿš 3™œ˜Ô(ˆDð �fÔ.­v¬~¸tÑDÔDÑDÐDr   c                 óF   — dt          | j        ¦  «        dd…         z   dz   S )Nz<MRUEntry: r®   r¯   r°   )r´   Ú__dict__r(   s    r   r·   zMRUEntry.__repr__¥  s%   € Ø�t D¤MÑ2Ô2°1°R°4Ô8Ñ8¸3Ñ>Ð>r   N)r4   r5   r6   r7   r$   r  r  r·   r   r   r   rú   rú   �  sY   € € € € € Ø&Ð&ðð ð ð(ð (ð (ð
Eð Eð Eð$?ð ?ð ?ð ?ð ?r   rú   c                   ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )ÚMRUListzFA sequence of address-timespan pairs returned by ntpd in one response.c                 ó"   — g | _         d | _        d S r&   ©ÚentriesÚnowr(   s    r   r$   zMRUList.__init__¬  s   € ØˆŒØˆŒˆˆr   c                 ó   — | j         duS )z2Is the server done shipping entries for this span?N)r  r(   s    r   Úis_completezMRUList.is_complete°  s   € àŒx˜tÐ#Ð#r   c                 ó(   — d| j         ›d| j        ›d�S )Nz<MRUList: entries=z now=r°   r  r(   s    r   r·   zMRUList.__repr__´  s   € € Ø15´°°¸t¼x¸x¸xÐHÐHr   N)r4   r5   r6   r7   r$   r  r·   r   r   r   r  r  ©  sL   € € € € € ØLÐLðð ð ð$ð $ð $ðIð Ið Ið Ið Ir   r  c                   ó   — e Zd Zdd„Zd„ ZdS )ÚControlExceptionr   c                 ó"   — || _         || _        d S r&   r@   rC   s      r   r$   zControlException.__init__º  rD   r   c                 ó   — | j         S r&   rF   r(   s    r   rG   zControlException.__str__¾  rH   r   NrI   rJ   r   r   r   r  r  ¸  s7   € € € € € ð#ð #ð #ð #ðð ð ð ð r   r  c                   óž  — e Zd ZdZdZdZej        j        dej        j	        dej        j
        dej        j        dej        j        dej        j        d	ej        j        d
ej        j        diZd„ Zd„ Zd„ Zd„ Zd„ Zej        fd„Zd„ Zd„ Zd'd„Zd„ Zd„ Zd(d„Zd)d„Zd'd„Z ddej        j!        dfd„Z"d„ Z#d „ Z$d!„ Z%d"„ Z&d*d#„Z'd$„ Z(d%„ Z)d&„ Z*dS )+ÚControlSessionzA session to a hosté   TÚUNSPECÚ
PERMISSIONÚBADFMTÚBADOPÚBADASSOCÚ
UNKNOWNVARÚBADVALUEÚRESTRICTc                 ó®  — d| _         t          j        | _        t          | _        t          | _        t          j	        j
        dz   | _        d| _        d| _        d | _        d | _        d | _        d | _        d| _        d | _        d| _        d| _        d| _        d| _        t0          j        | _        t6          j        | _        d| _        d| _        d | _         d S )Nr   r®   FÚMD5rN   )!Údebugr  Ú	AF_UNSPECÚ	ai_familyÚ
DEFTIMEOUTÚprimary_timeoutÚDEFSTIMEOUTÚsecondary_timeoutr   r   ÚNTP_OLDVERSIONr¼   Úalways_authÚkeytypeÚkeyidÚpasswdÚauthr]   ÚisnumÚsockÚportr¾   ÚresponseÚrstatusr"  ÚMRU_ROW_LIMITÚntpd_row_limitÚsysÚstdoutÚlogfpÚ
nonce_xmitÚslotsÚflakeyr(   s    r   r$   zControlSession.__init__Ñ  s¶   € ØˆŒ
ÝÔ)ˆŒÝ)ˆÔÝ!,ˆÔåœ)Ô2°QÑ6ˆŒØ ˆÔØˆŒØˆŒ
ØˆŒØˆŒ	ØˆŒØˆŒ
ØˆŒ	ØˆŒ	ØˆŒØˆŒØˆŒÝ,Ô:ˆÔÝ”ZˆŒ
ØˆŒØˆŒ
ØˆŒˆˆr   c                 ó^   — t           j                             | j        || j        |¦  «         d S r&   ©r   r²   ÚdologrD  r.  )r!   ÚtextÚ	thresholds      r   ÚwarndbgzControlSession.warndbgê  s&   € ÝŒ�Š�t”z 4¨¬°YÑ?Ô?Ð?Ð?Ð?r   c                 óX   — | j         r"| j                              ¦   «          d | _         d S d S r&   )r<  Úcloser(   s    r   rO  zControlSession.closeí  s3   € ØŒ9ð 	ØŒI�OŠOÑÔÐØˆDŒIˆIˆIð	ð 	r   c                 ó   — | j         duS )z#Is the session connected to a host?N)r<  r(   s    r   ÚhavehostzControlSession.havehostò  s   € àŒy Ð$Ð$r   c                 óÒ  ‡ ‡— ‰                      d¦  «        r
‰dd…         Šˆˆ fd„}	  |dt          j        ¬¦  «        S # t          j        $ rA}t          j                             ‰ j        d‰›d|j        ›�‰ j	        d	¦  «         Y d
}~nd
}~ww xY w	  |dd¬¦  «        S # t          j        $ �r3}‰ j        �&‰ j         
                    d‰›d|j        ›d�¦  «         t          j        }	 |t          j        z  }n# t          $ r Y nw xY w	 t          t          d¦  «        rt          j        t          j        f}nt          j        f}|j        |v rX	  |dd¬¦  «        cY d
}~S # t          j        $ r3}‰ j        �"‰ j         
                    d|j        z  ¦  «         Y d
}~nd
}~ww xY wn1# t          $ r$ ‰ j        �‰ j         
                    d¦  «         Y nw xY wY d
}~nd
}~ww xY wd
S )z5Try different ways to interpret an address and familyr  r®   r¯   c                 óh   •— t          j        ‰| ‰j        t           j        t           j        |¦  «        S r&   )r  Úgetaddrinfor0  Ú
SOCK_DGRAMÚIPPROTO_UDP)r=  ÚhintsÚhnamer!   s     €€r   Úhinted_lookupz2ControlSession.__lookuphost.<locals>.hinted_lookup   s/   ø€ ÝÔ% e¨T°4´>Ý&,Ô&7Ý&,Ô&8Ø&+ñ-ô -ð -r   r   )r=  rW  zntpq: numeric-mode lookup of z	 failed, r   Nr   zntpq: standard-mode lookup of rí   Ú
EAI_NODATAzntpq: ndp lookup failed, %s
z+ntpq: API error, missing socket attributes
)Ú
startswithr  ÚAI_NUMERICHOSTÚgaierrorr   r²   rJ  rD  Ústrerrorr.  rñ   ÚAI_CANONNAMEÚAI_ADDRCONFIGÚAttributeErrorÚhasattrÚ
EAI_NONAMErZ  Úerrno)	r!   rX  ÚfamrY  ÚeÚe1Úfallback_hintsÚerrlistÚe2s	   ``       r   Ú__lookuphostzControlSession.__lookuphostö  s¯  øø€ à×Ò˜CÑ Ô ð 	 Ø˜!˜B˜$”KˆEð	-ð 	-ð 	-ð 	-ð 	-ð 	-ð
	AØ �= eµ6Ô3HÐIÑIÔIÐIøÝŒð 	Að 	Að 	AÝŒH�NŠN˜4œ:˜:à#˜e˜e Q¤Z Zð1Ø26´*¸añAô Að Að Að Að Að Að Aøøøøð	Aøøøð 	HØ �= e°1Ð5Ñ5Ô5Ð5øÝŒð 	Hñ 	Hð 	HØŒzÐ%Ø”
× Ò Ð à$) E E¨2¬;¨;¨;ð"8ñ 9ô 9ð 9õ $Ô0ˆNðØ¥&Ô"6Ñ6��øÝ!ð ð ð Ø�ðøøøðHÝ�6 <Ñ0Ô0ð 3Ý%Ô0µ&Ô2CÐD�G�Gå%Ô0Ð2�GØ”8˜wÐ&Ð&ð<Ø,˜}°%¸qÐAÑAÔAÐAÐAÐAÐAÐAÐAøÝ!œ?ð <ð <ð <Øœ:Ð1Ø œJ×,Ò,Ð-LØ/1¬{ñ.;ñ <ô <ð <øøøøøøøøøð<øøøøøõ "ð Hð Hð HØ”:Ð)Ø”J×$Ò$ØFñHô Hð HøøðHøøøøøøøøøøøøð7	Høøøð> ˆts¢   ©A  Á BÁ7BÂBÂB! Â!G$Â19GÃ+C;Ã:GÃ;
DÄGÄDÄGÄAF)ÅE#ÅG$Å#F%Å2)F ÆF)Æ F%Æ%F)Æ(GÆ)+GÇGÇGÇGÇG$c                 ó–  — |                       ||¦  «        }|€dS |d         \  }}}}}|€(t          j        |d         |¦  «        | _        d| _        n|p|| _        d| _        t
          j                             | j        d| j        z  | j	        d¦  «         |d         | _
        	 t          j        |||¦  «        | _        n6# t          j        $ r$}	t          d||	j        |	j        fz  ¦  «        ‚d}	~	ww xY w	 | j                             |¦  «         n6# t          j        $ r$}	t          d	||	j        |	j        fz  ¦  «        ‚d}	~	ww xY wdS )
z"openhost - open a socket to a hostNFr   TzOpening host %sr   r®   zError opening %s: %s [%d]zError connecting to %s: %s [%d])Ú_ControlSession__lookuphostr  Ú	inet_ntopr]   r;  r   r²   rJ  rD  r.  r=  r<  Úerrorr  r^  rd  Úconnect)
r!   rX  re  ÚresÚfamilyÚsocktypeÚprotocolÚ	canonnameÚsockaddrrf  s
             r   ÚopenhostzControlSession.openhost.  sŒ  € à×Ò  sÑ+Ô+ˆØˆ;Ø�5à<?À¼FÑ9ˆ�˜8 Y°ØÐÝ"Ô,¨X°a¬[¸&ÑAÔAˆDŒMØˆDŒJˆJà%Ð.¨ˆDŒMØˆDŒJÝŒ�Š�t”zÐ#4°t´}Ñ#DØ”z 1ñ	&ô 	&ð 	&à˜Q”KˆŒ	ð	CÝœ f¨h¸ÑAÔAˆDŒIˆIøÝŒ|ð 	Cð 	Cð 	CÝ"Ð#>Ø&+¨Q¬Z¸¼Ð%Añ$Bñ Cô Cð Cøøøøð	Cøøøð	CØŒI×Ò˜hÑ'Ô'Ð'Ð'øÝŒ|ð 	Cð 	Cð 	CÝ"Ð#DØ&+¨Q¬Z¸¼Ð%Añ$Bñ Cô Cð Cøøøøð	Cøøøð ˆts0   Â%C ÃC4ÃC/Ã/C4Ã8D ÄEÄ"EÅEc                 óÄ  — | j         �€0| j        €,	 t          ¦   «         | _        n# t          t          f$ r Y nw xY w| j        r\| j        dk    rQ	 | j                             ¦   «         \  | _         | _        | _        dS # t          $ r t          t          ¦  «        ‚w xY w	 t          j        d¦  «        r-t          t          j                             d¦  «        ¦  «        }nd}|dk    s|t$          k    rt          t&          ¦  «        ‚n)# t(          t          f$ r t          t&          ¦  «        ‚w xY w|| _         | j        € 	 | j        | j                  \  | _        }n{# t*          t,          f$ rg t/          j        d| j        z  ¦  «        }|€t          t0          ¦  «        ‚t3          |¦  «        dk    rt          j                             |¦  «        }Y nw xY w|| _        dS dS )z2Get a keyid and the password if we don't have one.NÚ	localhostr   zKeyid: z%s Password: r
   )r8  r:  ÚAuthenticatorÚOSErrorÚIOErrorr]   Úcontrolr7  r9  Ú
ValueErrorr  ÚSERR_NOTRUSTÚosÚisattyry   r   r*   Ú	polyinputÚ	MAX_KEYIDÚSERR_BADKEYÚSyntaxErrorÚ
IndexErrorÚ	TypeErrorÚgetpassÚSERR_INVPASSrh   r²   Úhexstr2octets)r!   Úkey_idr9  s      r   ÚpasswordzControlSession.passwordJ  sô  € àŒ:ÑØŒyÐ ðÝ -¡¤�D”I�IøÝ¥Ð)ð ð ð Ø�DðøøøàŒyð 9˜Tœ]¨kÒ9Ð9ð9àœ)×+Ò+Ñ-Ô-ñ <�T”Z ¤¨t¬{à�FøÝ!ð 9ð 9ð 9å*­<Ñ8Ô8Ð8ð9øøøð4Ý”9˜Q‘<”<ð Ý ¥¤×!3Ò!3°IÑ!>Ô!>Ñ?Ô?�F�Fà�FØ˜Q’;�; &­9Ò"4Ð"4Ý*­;Ñ7Ô7Ð7ð #5øå¥Ð,ð 4ð 4ð 4Ý&¥{Ñ3Ô3Ð3ð4øøøàˆDŒJàŒ;Ðð
<Ø'+¤y°´Ô'<Ñ$�”˜f˜føÝ¥	Ð*ð <ð <ð <Ý œ¨¸4¼<Ñ)GÑHÔH�Ø�>Ý*­<Ñ8Ô8Ð8õ �v‘;”; Ò#Ð#Ý œX×3Ò3°FÑ;Ô;�Føøð<øøøð !ˆDŒKˆKˆKð Ðs8   ‘% ¥9¸9Á,A= Á=BÂ A(D	 Ä	&D/ÅE ÅA5GÇGc                 óP  — t          |¦  «        dz  r|dz  }t          |¦  «        dz  °t          j                             | j        dt          |¦  «        | j        fz  | j        d¦  «         	 | j                             t          j	         
                    |¦  «        ¦  «         n?# t          j        $ r- | j        �"| j                             d| j        z  ¦  «         Y dS w xY w| j        dk    r6| j        �/| j                             d	¦  «         t          || j        ¦  «         d
S )zSend a packet to the host.r   ó    zSending %d octets.  seq=%dr   NzWrite to %s failed
r¯   é   zRequest packet:
r   )rh   r   r²   rJ  rD  r¾   r.  r<  Úsendallr*   r+   r  ro  rñ   r]   rø   )r!   rò   s     r   rÚ   zControlSession.sendpkts  s*  € å�%‰jŒj˜1‰nð 	Ø�WÑˆEõ �%‰jŒj˜1‰nð 	åŒ�Š�t”zØ3Ý˜e™*œ* d¤mÐ4ñ5Ø6:´jÀ!ñ	Eô 	Eð 	Eð	ØŒI×Ò�cœh×0Ò0°Ñ7Ô7Ñ8Ô8Ð8Ð8øÝŒ|ð 	ð 	ð 	àŒzÐ%Ø”
× Ò Ð!7¸$¼-Ñ!GÑHÔHÐHØ�2�2ð		øøøð
 ŒJ˜!ŠOˆO $¤*Ð"8àŒJ×ÒÐ0Ñ1Ô1Ð1Ý˜u d¤jÑ1Ô1Ð1Øˆqs   Á.7B& Â&8C"Ã!C"Fc                 ó>  — | j         dk    rL| j        �E| j         dk    r| j                             d¦  «         | j                             d|||fz  ¦  «         t          |¦  «        t          j        j        k    r3| j        �*| j                             dt          |¦  «        z  ¦  «         dS t          | |||¦  «        }| xj        dz  c_        | xj        dz  c_        | j        |_        |j	        r�t          j
                             |j	        ¦  «        |_	        t          j        t          |j	        ¦  «        z   dz  r4|xj	        d	z  c_	        t          j        t          |j	        ¦  «        z   dz  °4|s| j        s|                     ¦   «         S | j        �| j        €t#          t$          ¦  «        ‚t          j        t          |j	        ¦  «        z   d
z  r4|xj	        d	z  c_	        t          j        t          |j	        ¦  «        z   d
z  °4t&                               |                     ¦   «         | j        | j        | j        ¦  «        }|€t#          t.          ¦  «        ‚|xj	        t          j
                             |¦  «        z  c_	        |                     ¦   «         S )z(Ship an ntpq request packet to a server.r®   Nr   rí   z-sendrequest: opcode=%d, associd=%d, qdata=%s
z'***Internal error! Data too large (%d)
r¯   i   rŽ  r   )r.  rD  rñ   rh   r   r}  ÚCTL_MAX_DATA_LENr¹   r¾   r   r*   r+   ri   r6  rÛ   r8  r9  r  ÚSERR_NOCREDrz  Úcompute_macr”   r7  Ú
SERR_NOKEY)r!   rÂ   r¿   rÃ   r:  Úpktr\   s          r   ÚsendrequestzControlSession.sendrequest‡  sf  € àŒJ˜!ŠOˆO $¤*Ð"8àŒz˜QŠˆØ”
× Ò  Ñ&Ô&Ð&ØŒJ×ÒÐMØ &¨°Ð7ñ8ñ 9ô 9ð 9õ ˆu‰:Œ:�œÔ4Ò4Ð4ØŒzÐ%Ø”
× Ò Ð!KÝ!$ U¡¤ñ",ñ -ô -ð -à�2õ ˜D &¨'°5Ñ9Ô9ˆàˆŒ˜ÑˆŒØˆŒ˜Ñ ˆŒØ”}ˆŒð Œ=ð 	)ÝœH×.Ò.¨s¬}Ñ=Ô=ˆCŒMÝ!Ô,­s°3´=Ñ/AÔ/AÑAÀQÑFð )Ø�” Ñ(�”õ "Ô,­s°3´=Ñ/AÔ/AÑAÀQÑFð )ð
 ð 	˜DÔ,ð 	Ø—8’8‘:”:ÐàŒ:Ð ¤Ð!4Ý"¥;Ñ/Ô/Ð/õ
 Ô(­3¨s¬}Ñ+=Ô+=Ñ=ÀÑBð 	%ØˆMŒM˜WÑ$ˆMŒMõ Ô(­3¨s¬}Ñ+=Ô+=Ñ=ÀÑBð 	%õ ×'Ò'¨¯ª©¬Ø(,¬
°D´LÀ$Ä+ñOô Oˆàˆ;Ý"¥:Ñ.Ô.Ð.àˆMŒM�SœX×/Ò/°Ñ4Ô4Ñ4ˆMŒMØ�xŠx‰zŒzÐr   c           	      ó®  ‡ ‡— g }d‰ _         d}d}‰ j        �‰ j        j        }nd„ }ˆ fd„} |dd¦  «         	 |dz  }|d
t          z  k    rt	          t
          ¦  «        ‚|s‰ j        dz  }	n
‰ j        dz  }	 |dt          j	        ¦   «         |	fz  d¦  «         	 t          j
        ‰ j        gg g |	¦  «        \  }
}}n'# t          j        $ r t	          t          ¦  «        ‚w xY w |dt          j	        ¦   «         |	fz  d¦  «         |
sÆ|s|rt	          t          ¦  «        ‚|r˜‰ j        dk    r�‰ j        �†‰ j                             d¦  «         t!          |¦  «        D ]9\  }}‰ j                             d|dz   |                     ¦   «         fz  ¦  «         Œ:‰ j                             dd|         z  ¦  «         t	          t$          ¦  «        ‚ |dt          j	        ¦   «         z  d¦  «         	 t&          j                             ‰ j                             d¦  «        ¦  «        }n'# t.          j        $ r t	          t0          ¦  «        ‚w xY w‰ j        r*‰ j        t5          j        ¦   «         k    r |dd¦  «         d} |dt7          |¦  «        z  d¦  «         t9          ‰ ¦  «        Š	 ‰                     |¦  «         n'# t<          j        $ r t	          t>          ¦  «        ‚w xY w‰                       ‰|||¦  «        }|s�ŒË‰ j!        r¯‰ j"        r¨‰j#        tH          z   }|| tJ          z  z  }t7          |¦  «        |tL          z   tN          z   k     rD‰ j                             dt7          |¦  «        |tL          z   tN          z   fz  ¦  «         d‰ _!        n$‰ j"         (                    |||¬¦  «        sd‰ _!        ‰j)        d‰j#        …         ‰_)        ‰j#        dk    r!‰ *                    ¦   «         r |d¦  «         �ŒÆ|r!‰ *                    ¦   «         r |d¦  «         �Œéˆfd„|D ¦   «         }|r@|d         }|j+        ‰j+        k    r( |d‰j#        ‰j+        |j#        |j+        fz  ¦  «         �Œ9|rG|d         }| ,                    ¦   «         ‰j+        k    r" |d ‰j+        |j#        |j+        fz  ¦  «         �Œ‚|r?‰ ,                    ¦   «         |j+        k    r" |d!‰j#        ‰j+        |j+        fz  ¦  «         �ŒÃ |d"t7          |¦  «        dz   ‰j#        ‰j+        ‰ ,                    ¦   «         ‰ *                    ¦   «         fz  d¦  «         | -                    ‰¦  «         | .                    d#„ ¬$¦  «         ‰ *                    ¦   «         sd	}‰j/        ‰ _0        |�r¡|d         j+        dk    �r�tc          dt7          |¦  «        ¦  «        D ]O}||dz
            ,                    ¦   «         ||         j+        k    r! |d%|t7          |¦  «        fz  d¦  «          �n"ŒPd&„ |D ¦   «         }t&          j                             d 2                    |¦  «        ¦  «        ‰ _          |d't7          ‰ j         ¦  «        t7          |¦  «        fz  d¦  «         ‰ j        dk    r& |d(¦  «         tg          ‰ j         ‰ j        ¦  «         n{‰ j        dk    r! |d)ti          ‰ j         ¦  «        z  ¦  «         nO‰ j        d
k    rD‰ j          5                    d*¦  «        }‰ j         d|…         } |d+ti          |¦  «        z  ¦  «         dS n�Œ‰ j!        s |d,¦  «         dS dS )-z<Get a response expected to match a given opcode and associd.rN   Fr   Nc                 ó   — | S r&   r   ©r,   s    r   ú<lambda>z,ControlSession.getresponse.<locals>.<lambda>Ë  ó   € ˜a€ r   c                 ó\   •— t           j                             ‰j        | ‰j        |¦  «        S r&   rI  ©ÚtxtÚthr!   s     €r   r›  z,ControlSession.getresponse.<locals>.<lambda>Ì  ó&   ø€ ¥3¤8§>¢>°$´*¸cØ26´*¸bñ$Bô $B€ r   zFragment collection beginsr®   Tr‡   iè  z$At %s, select with timeout %d beginsr�  z"At %s, select with timeout %d endsz$ERR_INCOMPLETE: Received fragments:
z%d: %szlast fragment %sreceived
)znot rN   zAt %s, socket read beginsr   i   z'Flaky: I deliberately dropped a packet.zReceived %d octetsr   z(AUTH - packet too short for MAC %d < %d
)Ú
packet_endÚ	mac_beginz*Received count of 0 in non-final fragment
zReceived second last fragment
c                 ó4   •— g | ]}|j         ‰j         k    ¯|‘ŒS r   ©rÀ   )rª   ÚfragÚrpkts     €r   rè   z.ControlSession.getresponse.<locals>.<listcomp>*  s1   ø€ ð :ð :ð : DØ"œk¨T¬[Ò8Ð8ð  Ø8Ð8Ð8r   z3duplicate %d octets at %d ignored, prior  %d at %d
r¯   z6received frag at %d overlaps with %d octet frag at %d
z6received %d octet frag at %d overlaps with frag at %d
z@Recording fragment %d, size = %d offset = %d,  end = %d, more=%sc                 ó   — | j         S r&   r¥  )r¦  s    r   r›  z,ControlSession.getresponse.<locals>.<lambda>J  s   € ¨D¬K€ r   ©Úkeyz#Hole in fragment sequence, %d of %dc                 óV   — g | ]&}t           j                             |j        ¦  «        ‘Œ'S r   )r   r*   rš   r   )rª   Úfs     r   rè   z.ControlSession.getresponse.<locals>.<listcomp>[  s:   € ð $8ð $8ð $8Ø()õ %(¤H×$4Ò$4°Q´[Ñ$AÔ$Að $8ð $8ð $8r   z3Fragment collection ends. %d bytes  in %d fragmentszResponse packet:
zResponse packet:
%s
ó   
zFirst line:
%s
z7AUTH: Content untrusted due to authentication failure!
)6r>  rD  rñ   ÚMAXFRAGSr  ÚSERR_TOOMUCHr2  r4  r`   ÚasctimeÚselectr<  ro  ÚSERR_SELECTÚSERR_TIMEOUTr.  Ú	enumeraterÕ   ÚSERR_INCOMPLETEr   r*   r+   Úrecvr  ÚSERR_SOCKETrG  Úrandomrh   r¹   rd   rj   ÚSERR_UNSPECÚ _ControlSession__validate_packetÚ	_authpassr:  rÁ   ÚMODE_SIX_HEADER_LENGTHÚMODE_SIX_ALIGNMENTÚKEYID_LENGTHÚMINIMUM_MAC_LENGTHÚ
verify_macr   rÍ   rÀ   rÓ   rm   ÚsortrP   r?  Úrangerð   rø   r´   r  )r!   rÂ   r¿   ÚtimeoÚ	fragmentsÚseenlastfragÚbailÚwarnrM  ÚtvoÚrdÚ_Úir¦  r×   ÚvalidÚ_pendÚnot_earlierrý   r¬  ÚtempfraglistÚeolÚ	firstliner§  s   `                      @r   ÚgetresponsezControlSession.getresponse¼  s¦  øø€ ð ˆ	ØˆŒØˆØˆàŒ:Ð!Ø”:Ô#ˆDˆDà�KˆDðBð Bð Bð Bˆð 	ˆÐ,¨aÑ0Ô0Ð0ð\	ð �A‰IˆDØ˜�(™
Ò#Ð#Ý&¥|Ñ4Ô4Ð4àð 4ØÔ*¨TÑ1��àÔ,¨tÑ3�àˆGÐ:Ý”|‘~”~ sÐ+ñ,Ø-.ñ0ô 0ð 0ð4Ý#œ]¨D¬I¨;¸¸BÀÑDÔD‘
��Q˜˜øÝ”<ð 4ð 4ð 4Ý&¥{Ñ3Ô3Ð3ð4øøøàˆGÐ8Ý”|‘~”~ sÐ+ñ,Ø-.ñ0ô 0ð 0ð ð 8à ð =Øð =Ý.­|Ñ<Ô<Ð<Øð 	GØœ
 aš˜Øœ
Ð.àœ
×(Ò(ØCñEô Eð Eå)2°9Ñ)=Ô)=ð Mð M™I˜Q Ø œJ×,Ò,¨X¸¸1¹¸d¿jºj¹l¼lÐ8KÑ-KÑLÔLÐLÐLØœ
×(Ò(Ð)EØ+7¸Ô+Eñ*Fñ Gô Gð Gå&¥Ñ7Ô7Ð7àˆGÐ/µ$´,±.´.Ñ@À!ÑDÔDÐDð4Ýœ(×,Ò,¨T¬Y¯^ª^¸DÑ-AÔ-AÑBÔB��øÝ”<ð 4ð 4ð 4å&¥{Ñ3Ô3Ð3ð4øøøð Œ{ð ˜tœ{­f¬m©o¬oÒ=Ð=Ø�ÐAÀ1ÑEÔEÐEØ�àˆGÐ(­3¨w©<¬<Ñ7¸Ñ;Ô;Ð;Ý  Ñ&Ô&ˆDð4Ø—’˜WÑ%Ô%Ð%Ð%øÝ”<ð 4ð 4ð 4Ý&¥{Ñ3Ô3Ð3ð4øøøð ×*Ò*¨4°¸&À'ÑJÔJˆEØð Ùð Œ~ð 	+ $¤)ð 	+Øœ
Õ%;Ñ;�Ø˜5˜&Õ#5Ñ5Ñ6�Ý�w‘<”< 5­<Ñ#7Õ:LÑ#LÒMÐMØ”J×$Ò$Ð%PÝ&)¨'¡l¤l°U½\Ñ5IÕL^Ñ5^Ð%`ñ&añ bô bð bà%*�D”N�NØœ×-Ò-¨gÀ%Ø6;ð .ñ =ô =ð +à%*�D”Nð "œ^¨K¨T¬Z¨KÔ8ˆDŒNàŒz˜QŠˆ 4§9¢9¡;¤;ˆØ�ÐBÑCÔCÐCÙàð  §	¢	¡¤ð ð �Ð6Ñ7Ô7Ð7Ùð:ð :ð :ð :¨Ið :ñ :ô :ˆKàð Ø)¨!œn�ØÔ%¨¬Ò4Ð4Ø�Dð 'à œJ¨¬Ø'Ô-¨{Ô/AðCñCñ Dô Dð Dñ àð Ø  ”}�Ø—8’8‘:”: ¤Ò+Ð+Ø�Dð (à œK¨¬°T´[ÐAñBñ Cô Cð Cñ àð ˜tŸxšx™zœz¨KÔ,>Ò>Ð>Ø�ð $àœ
 D¤K°Ô1CÐDñEñ Fô Fð Fñ àˆGð )å˜9‘~”~ aÑ'¨¬Ø”{ D§H¢H¡J¤J°·	²	±´ð=ñ=ð ?@ñAô Að Að ×Ò˜TÑ"Ô"Ð"Ø�NŠNÐ7Ð7ˆNÑ8Ô8Ð8ð —9’9‘;”;ð +Ø#�Ø#œ{�”ð ñ  	¨!¤Ô 3°qÒ 8Ñ 8Ý˜q¥# i¡.¤.Ñ1Ô1ð  ð  �AØ   1¡”~×)Ò)Ñ+Ô+¨y¸¬|Ô/BÒBÐBØ˜Ð EØ#$¥c¨)¡n¤nÐ"5ñ!6Ø78ñ:ô :ð :à™ð Cð
$8ð $8Ø-6ð$8ñ $8ô $8�Lå$'¤H×$6Ò$6°r·w²w¸|Ñ7LÔ7LÑ$MÔ$M�D”MØ�Gð /å" 4¤=Ñ1Ô1µ3°y±>´>ÐBñCàDEñGô Gð Gð ”z Q’�Ø˜Ð1Ñ2Ô2Ð2Ý*¨4¬=¸$¼*ÑEÔEÐEÐEØœ qš˜à˜Ð5½¸T¼]Ñ8KÔ8KÑKÑLÔLÐLÐLØœ qš˜à"œm×0Ò0°Ñ7Ô7˜Ø$(¤M°$°3°$Ô$7˜	Ø˜Ð0µ4¸	±?´?ÑBÑCÔCÐCØ˜4Øñy\	ðz Œ~ð 	MØˆDÐKÑLÔLÐLÐLÐLð	Mð 	Ms$   Â!B< Â<$C Ç.7H& È&$I
Ê*K  Ë $K$c                 ó�  ‡ — ‰ j         �‰ j         j        }nd„ }ˆ fd„}|                     ¦   «         t          j        j        k    s'|                     ¦   «         t          j        j        k     r# |d|                     ¦   «         z  d¦  «         dS |                     ¦   «         t          j        j        k    r# |d|                     ¦   «         z  d¦  «         dS | 	                    ¦   «         s |dd¦  «         dS |j
        ‰ j
        k    r |d|j
        ‰ j
        fz  d¦  «         dS |                     ¦   «         |k    r% |d	|                     ¦   «         |fz  d¦  «         dS |                     ¦   «         rŽ|                     ¦   «         r  |d
|                     ¦   «         z  ¦  «         d x‰ _        ‰ _        t#          t$          t&          j        |                     ¦   «                  z  |                     ¦   «         ¦  «        ‚|j        |k    r |d|j        |fz  ¦  «         t-          |¦  «        dz  r |dt-          |¦  «        z  ¦  «         dS t.          j        |j        z   dz   dz  }t-          |¦  «        |k     rC |d|j        t-          |¦  «        t.          j        z
  fz  ¦  «         t#          t4          ¦  «        ‚dS )Nc                 ó   — | S r&   r   rš  s    r   r›  z2ControlSession.__validate_packet.<locals>.<lambda>w  rœ  r   c                 ó\   •— t           j                             ‰j        | ‰j        |¦  «        S r&   rI  rž  s     €r   r›  z2ControlSession.__validate_packet.<locals>.<lambda>x  r¡  r   z!Fragment received with version %dr®   FzFragment received with mode %dz!Received request, wanted responsez&Received sequence number %d, wanted %dzReceived opcode %d, wanted %dz(Error %d received on non-final fragment
z,Association ID %d doesn't match expected %d
r   z(Response fragment not padded, size = %d
éüÿÿÿz>Response fragment claims %u octets payload, above %d received
T)rD  rñ   r#   r   r   r:   r5  r"   r»   rÇ   r¾   rÂ   rË   rÍ   rÑ   r8  r9  r  ÚSERR_SERVERr"  Úserver_errorsr¿   rh   r¹   ri   rÁ   rµ  )r!   r§  r×   rÂ   r¿   rÇ  rM  Úshouldbesizes   `       r   Ú__validate_packetz ControlSession.__validate_packetr  s  ø€ àŒ:Ð!Ø”:Ô#ˆDˆDà�KˆDðBð Bð Bð Bˆð �\Š\‰^Œ^�cœiÔ3Ò3Ð3Ø�LŠL‰NŒN�SœYÔ5Ò5Ð5ØˆGÐ7Ø—l’l‘n”nñ%Ø&'ñ)ô )ð )à�5Ø�9Š9‰;Œ;�#œ)Ô0Ò0Ð0ØˆGÐ4°t·y²y±{´{ÑBÀAÑFÔFÐFØ�5Ø×ÒÑ!Ô!ð 	ØˆGÐ7¸Ñ;Ô;Ð;Ø�5ð Œ=˜DœMÒ)Ð)ØˆGÐ<Ø”] D¤MÐ2ñ3Ø45ñ7ô 7ð 7à�5Ø�;Š;‰=Œ=˜FÒ"Ð"ØˆGÐ3Ø—[’[‘]”] FÐ+ñ,Ø-.ñ0ô 0ð 0à�5ð �=Š=‰?Œ?ð 	 Ø�yŠy‰{Œ{ð 'Ø�Ð@Ø—|’|‘~”~ñ&ñ 'ô 'ð 'à'+Ð+ˆDŒJ˜œÝ"ÝÝ Ô.¨t¯|ª|©~¬~Ô>ñ?à—’‘”ñ ô  ð  ð Œ<˜7Ò"Ð"ØˆDÐ@Ø”L 'Ð*ñ+ñ ,ô ,ð ,õ
 ˆw‰<Œ<˜#Ñð 	ØˆDÐ<Ý�w‘<”<ñ ñ !ô !ð !à�5å%Ô0°4´:Ñ=ÀÑAÀRÑGˆÝˆw‰<Œ<˜,Ò&Ð&ØˆDð 'à”J¥ G¡¤­}Ô/GÑ GÐHñIñ Jô Jð Jõ #¥?Ñ3Ô3Ð3àˆtr   r   rN   c                 ó&  — |                       ¦   «         st          t          ¦  «        ‚d}	 |                      ||||¦  «         	 |                      ||| ¦  «        }n2# t          $ r%}|r|j        t          t          fv rd}Y d}~Œ[|‚d}~ww xY w	 |S )z$send a request and save the responseTFN)rQ  r  ÚSERR_NOHOSTr—  rÒ  rA   r³  rµ  )r!   rÂ   r¿   rÃ   r:  Úretryrq  rf  s           r   ÚdoqueryzControlSession.doquery²  s»   € à�}Š}‰Œð 	0Ý"¥;Ñ/Ô/Ð/Øˆð	à×Ò˜V W¨e°TÑ:Ô:Ð:ðØ×&Ò& v¨w¸E¸	ÑBÔB��øÝ#ð ð ð Øð ˜QœY­<½Ð*IÐIÐIØ!�EØ�H�H�H�Hà�Gøøøøðøøøð àˆ
s   ÁA Á
BÁ(BÂBÂBc                 óÜ  — |                       t          j        j        |¬¦  «         t	          | j        ¦  «        dz  rt          t          ¦  «        ‚g }|dk    r{t          t	          | j        ¦  «        dz  ¦  «        D ]V}| j        d|z  d|z  dz   …         }t          j
        d|¦  «        \  }}|                     t          | ||¦  «        ¦  «         ŒW|                     d„ ¬¦  «         |S )z(Read peer status, or throw an exception.)rÂ   r¿   r   r   z!HHc                 ó   — | j         S r&   )r¿   )Úas    r   r›  z)ControlSession.readstat.<locals>.<lambda>Ò  s   €  !¤)€ r   r©  )rÞ  r   r}  ÚCTL_OP_READSTATrh   r>  r  ÚSERR_BADLENGTHrÂ  rj   rk   rm   rÝ   rÁ  )r!   r¿   ÚidlistrË  re   rP   s         r   ÚreadstatzControlSession.readstatÇ  sæ   € à�Š�CœKÔ7ÀˆÑIÔIÐIÝˆtŒ}ÑÔ Ñ!ð 	3Ý"¥>Ñ2Ô2Ð2ØˆØ�aŠ<ˆ<Ý�3˜tœ}Ñ-Ô-¨qÑ0Ñ1Ô1ð ;ð ;�Ø”} Q q¡S¨¨1©¨Q© YÔ/�Ý$*¤M°%¸Ñ$>Ô$>Ñ!�˜&Ø—’�d 4¨°&Ñ9Ô9Ñ:Ô:Ð:Ð:Ø�ŠÐ+Ð+ˆÑ,Ô,Ð,Øˆr   c                 ó^  — g }d}d}t           j                             | j        ¦  «        | _        | j        D ]w}t           j                             |¦  «        }|dk    r	||z  }| }Œ0|s0|dk    r*|                     |                     ¦   «         ¦  «         d}Œbd|cxk     rdk     rn Œr||z  }Œx|r'|                     |                     ¦   «         ¦  «         g }|D �]2}d|v rAt           j                             || 	                    d¦  «        ¦  «        \  }	}
|
dd	…         }
n|d}
}	|	                     ¦   «         |
                     ¦   «         }
}	|
r†	 t          |
d¦  «        }nv# t          $ rg 	 t          |
¦  «        }|	d
k    r|s|                     d|
f¦  «         n4# t          $ r' |
d         dk    r|
d         dk    r
|
dd…         }
|
}Y nw xY wY nw xY w|
}|r|                     |	||
ff¦  «         �Œ|                     |	|f¦  «         �Œ4t           j                             |¦  «        S )z&Parse a response as a textual varlist.FrN   ú"ú,r   rê   ú=r®   NÚdelayzdelay-sr¯   )r   r*   rš   r>  ræ   rm   Ústripr²   rî   Úindexry   r~  ÚfloatÚOrderedDict)r!   ÚrawÚkvpairsÚinstringr>  r«   ÚcordÚitemsÚpairrª  ÚvalueÚcastedvalues               r   Ú__parse_varlistzControlSession.__parse_varlistÕ  sr  € ð
 ˆØˆØˆÝœ×(Ò(¨¬Ñ7Ô7ˆŒØ”ð 	ð 	ˆAÝ”8×#Ò# AÑ&Ô&ˆDØ�CŠxˆxØ˜A‘�Ø'˜<��Øð  ! s¢( (à—’˜xŸ~š~Ñ/Ô/Ñ0Ô0Ð0Ø��Ø�T��’�˜C’����à˜A‘�øØð 	-Ø�NŠN˜8Ÿ>š>Ñ+Ô+Ñ,Ô,Ð,ØˆØð 	1ñ 	1ˆDØ�dˆ{ˆ{Ý œX×/Ò/°°d·j²jÀ±o´oÑFÔF‘
��UØ˜a˜b˜bœ	��à! 2�U�ØŸš™œ e§k¢k¡m¤m�ˆCàð $ð,Ý"% e¨Q¡-¤-�K�KøÝ!ð 	,ð 	,ð 	,ð,Ý&+¨E¡l¤l˜Ø 'š>˜>°#˜>à!ŸLšL¨)°UÐ);Ñ<Ô<Ð<øøÝ%ð ,ð ,ð ,Ø! !œH¨šO˜O°%¸´)¸sÒ2BÐ2BØ$)¨!¨B¨$¤K˜EØ&+˜˜˜ð,øøøøøð	,øøøð $�Øð 1Ø—’˜c K°Ð#7Ð8Ñ9Ô9Ð9Ñ9à—’˜c ;Ð/Ñ0Ô0Ð0Ñ0ÝŒx×#Ò# EÑ*Ô*Ð*s6   ÅE$Å$
GÅ/.FÆGÆ.GÇGÇGÇGÇGNc                 ó�   — |€d}nd                      |¦  «        }|                      |||¬¦  «         |                      |¦  «        S )z@Read system vars from the host as a dict, or throw an exception.NrN   rè  )r¿   rÃ   )rð   rÞ  Ú_ControlSession__parse_varlist)r!   r¿   ÚvarlistrÂ   rï  rÃ   s         r   rá   zControlSession.readvar
  sM   € ð ˆ?ØˆEˆEà—H’H˜WÑ%Ô%ˆEØ�Š�V W°EˆÑ:Ô:Ð:Ø×#Ò# CÑ(Ô(Ð(r   c                 ó|  — |                       t          j        j        |d¬¦  «         | j        st          t          ¦  «        ‚d| j        v r,| j        d| j                             d¦  «        …         | _        | j                             ¦   «         | _        | j        t          j	         
                    d¦  «        k    S )z?Send configuration text to the daemon. Return True if accepted.T©rÂ   rÃ   r:  rŽ  NzConfig Succeeded)rÞ  r   r}  ÚCTL_OP_CONFIGUREr>  r  ÚSERR_PERMISSIONrì  Úrstripr*   r+   )r!   Ú
configtexts     r   ÚconfigzControlSession.config  s¨   € à�Š�CœKÔ8Ø%¨Dð 	ñ 	2ô 	2ð 	2ð Œ}ð 	IÝ"¥?Ñ3Ô3Ð3Ø˜œÐ%Ð%Ø œMÐ*G¨4¬=×+>Ò+>¸wÑ+GÔ+GÐ*GÔHˆDŒMØœ×,Ò,Ñ.Ô.ˆŒØŒ}¥¤× 2Ò 2Ð3EÑ FÔ FÒFÐFr   c                 ó>  — t          d¦  «        D ]®}|                      t          j        j        ¬¦  «         t          j        ¦   «         | _        | j                             t          j	         
                    d¦  «        ¦  «        r8t          j	                             | j                             ¦   «         ¦  «        c S Œ¯t          t          u r| j        }n| j                             ¦   «         }| j                             d|z  ¦  «         t%          t&          ¦  «        ‚)zV
Ask for, and get, a nonce that can be replayed.
This combats source address spoofing
r   )rÂ   znonce=z## Nonce expected: %s)rÂ  rÞ  r   r}  ÚCTL_OP_REQ_NONCEr`   rE  r>  r[  r*   r+   rš   rë  ÚstrÚbytesÚdecoderD  rñ   r  ÚSERR_BADNONCE)r!   rË  Úresps      r   Úfetch_noncezControlSession.fetch_nonce!  sç   € õ
 �q‘”ð 	?ð 	?ˆAà�LŠL¥¤Ô <ˆLÑ=Ô=Ð=Ý"œi™kœkˆDŒOØŒ}×'Ò'­¬×(:Ò(:¸8Ñ(DÔ(DÑEÔEð ?Ý”x×'Ò'¨¬×(;Ò(;Ñ(=Ô(=Ñ>Ô>Ð>Ð>Ð>ð?õ •%ˆ<ˆ<Ø”=ˆDˆDà”=×'Ò'Ñ)Ô)ˆDØŒ
×ÒÐ0°4Ñ7Ñ8Ô8Ð8Ý�}Ñ-Ô-Ð-r   c           
      ó(  — d}d}t          |                     ¦   «         ¦  «        }g }i }|r|                     t          ¬¦  «         |D �]\  }	}
|                      d|	›d|
›�d¦  «         |	dk    r|	›d|
›�}n|	dk    rŒ7|	d	k    rŒ>|	d
k    r%t
          j                             |
¦  «        |_        Œi|	dk    rŒpdD ]«}|	 	                    |dz   ¦  «        r‘|	 
                    d¦  «        \  }}	 t          |¦  «        }n%# t          $ r t          t          |	z  ¦  «        ‚w xY w||vr'i |t          |¦  «        <   |                     |¦  «         |
|t          |¦  «                 |<   Œ¬�Œ |                     ¦   «          |D ]€}t#          ¦   «         }| xj        dz  c_        dD ]C}||t          |¦  «                 v r*t'          |||t          |¦  «                 |         ¦  «         ŒD|j                             |¦  «         Œ�|� ||j        ¦  «         |S )z=Extracts data from the key/value list into a more useful formNr©  ztag=z, val=r   Únonceré  z
last.olderz
addr.olderr  zlast.newest)rü   rý   rþ   r   rÿ   r¶   r  r  rë   r®   )Úlistró  rÁ  Ú
mru_kv_keyrM  r   r  r  r  r[  Úsplitry   r~  r  ÚSERR_BADTAGr  rm   rú   rF  Úsetattrr  )r!   rß   ÚspanÚdirectÚmrur  ró  Ú	fake_listÚ	fake_dictÚtagÚvalÚprefixÚmemberÚidxs                 r   Ú__mru_analyzezControlSession.__mru_analyze7  sl  € àˆØˆÝ�Y—_’_Ñ&Ô&Ñ'Ô'ˆØˆ	Øˆ	Øð 	'Ø�JŠJ�:ˆJÑ&Ô&Ð&Øð 	6ñ 	6‰JˆS�#Ø�LŠLˆL¨S¨S¨S°#°#Ð6¸Ñ:Ô:Ð:Ø�gŠ~ˆ~Ø#& 3 3¨¨Ð,��Ø˜Ò$Ð$ØØ˜Ò$Ð$ØØ�eŠ|ˆ|åœ8×.Ò.¨sÑ3Ô3�”ØØ˜Ò%Ð%àØQð 6ð 6�Ø—>’> &¨3¡,Ñ/Ô/ð 
6Ø$'§I¢I¨c¡N¤N‘M�V˜SðBÝ! #™hœh˜˜øÝ%ð Bð Bð BÝ.­{¸SÑ/@ÑAÔAÐAðBøøøð  )Ð+Ð+Ø.0˜	¥# c¡(¤(Ñ+Ø!×(Ò(¨Ñ-Ô-Ð-Ø25�I�c #™hœhÔ'¨Ñ/øñ6ð 	�ŠÑÔÐØð 		%ð 		%ˆCÝ‘*”*ˆCØˆJŒJ˜!‰OˆJŒJð Rð Fð F�Ø˜Y¥s¨3¡x¤xÔ0Ð0Ð0Ý˜C ¨µ3°s±8´8Ô)<¸VÔ)DÑEÔEÐEøØŒL×Ò Ñ$Ô$Ð$Ð$ØÐØˆF�4”<Ñ Ô Ð Øˆs   Ã.C>Ã>"D c                 óÎ  — |j         €|‚|j         t          j        j        k    rO|                      dd¦  «         |dz  }|dk    rt          t          ¦  «        ‚|                      d|z  d¦  «         nî|j         t          j        j        k    rZ|rd}|                      dd¦  «         n¹| xj        dz  c_        t          || j        ¦  «        }|                      d|z  d¦  «         nz|j         t          t          fv r\|r-t          d|dz  ¦  «        }|                      d	|z  d¦  «         n6t          d|dz  ¦  «        }|                      d
|z  d¦  «         n	|j         r|‚||||fS )Nz4no overlap between prior entries and server MRU listr®   r	   z/--->   Restarting from the beginning, retry #%uFz+Reverted to row limit from fragments limit.z0Row limit reduced to %d following CERR_BADVALUE.r‡   z7Frag limit reduced to %d following incomplete response.z7Row limit reduced to %d following  incomplete response.)rB   r   r}  ÚCERR_UNKNOWNVARrM  r  Ú
SERR_STALLÚCERR_BADVALUErA  Úminrµ  r³  Úmax)r!   rf  Úrestarted_countÚ	cap_fragsÚlimitÚfragss         r   Ú__mru_query_errorz ControlSession.__mru_query_errorj  så  € ØŒ;ÐØˆGØŒ[�CœKÔ7Ò7Ð7ð �LŠLð +Ø,-ñ/ô /ð /à˜qÑ ˆOØ Ò"Ð"Ý&¥zÑ2Ô2Ð2Ø�LŠLð %Ø'6ñ7Ø89ñ;ô ;ð ;ð ;àŒ[�CœKÔ5Ò5Ð5Øð 	:Ø!�	Ø—’ð 0Ø12ñ4ô 4ð 4ð 4ð Ð#Ô# qÑ(Ð#Ô#Ý˜E 4Ô#6Ñ7Ô7�Ø—’ð .Ø05ñ6Ø78ñ:ô :ð :ð :àŒ[�_­lÐ;Ð;Ð;ð ð AÝ˜A˜u q™yÑ)Ô)�Ø—’ð 4Ø6;ñ<Ø=>ñ@ô @ð @ð @õ ˜A˜u q™yÑ)Ô)�Ø—’ð 5Ø7<ñ=Ø>?ñAô Að Að AàŒ[ð 	ØˆGØ 	¨5°%Ð7Ð7r   c           	      óÔ  — d}d}d}d}t           }|€i }|rt          |¦  «        \  }}}|                      ¦   «         }	t          ¦   «         }
	 t	          dt           z  | j        ¦  «        }d|	|fz  }|r8d|v rt          |d         ¦  «        |d<   d|v rt          |d         ¦  «        |d<   t          |¦  «        \  }}||z  }	 	 |                      t          j
        j        |¬¦  «         d	}n9# t          $ r,}d}|                      |||||¦  «        }|\  }}}}Y d}~nd}~ww xY w|                      ¦   «         }|r ||¦  «         |                      ||
|¦  «        }|r|}	|
                     ¦   «         rnÐ|sP|rt	          t           |d
z   ¦  «        }n5t	          dt           z  | j        t#          |d
z   |dz  dz  ¦  «        ¦  «        }t%          j        ¦   «         | j        z
  t          j
        j        k    r|                      ¦   «         }	d|	|rdnd|r|n||fz  }|t+          |
t-          |¦  «        ¦  «        z  }|�g |
_        �Œ„n# t0          $ r Y nw xY wt3          |
||¦  «         |
S )zRetrieve MRU list datar   TNr   z%s, frags=%dÚresallÚresany)rÂ   rÃ   Fr®   é!   r   z%s, %s=%d%sr%  r$  )r®  Úparse_mru_variablesr	  r  r   rA  ÚhexÚgenerate_mru_parmsrÞ  r   r}  ÚCTL_OP_READ_MRUr  Ú _ControlSession__mru_query_errorrù  Ú_ControlSession__mru_analyzer  r!  r`   rE  ÚNONCE_TIMEOUTÚgenerate_mru_lastseenrh   r  ÚKeyboardInterruptÚ
stitch_mru)r!   rß   Úrawhookr  r"  r#  ÚsorterÚsortkeyr%  r  r  r$  Úreq_bufÚparmsÚ
firstParmsÚrecoverable_read_errorsrf  rq  ÚnewNonces                      r   ÚmrulistzControlSession.mrulist‘  s)  € àˆØˆ	ØˆØˆÝˆØÐØˆIàð 	DÝ%8¸Ñ%CÔ%CÑ"ˆF�G˜Uà× Ò Ñ"Ô"ˆå‰yŒyˆðU	å˜�H™ dÔ&9Ñ:Ô:ˆEØ$¨¨u ~Ñ5ˆGØð CØ˜yÐ(Ð(Ý*-¨i¸Ô.AÑ*BÔ*B�I˜hÑ'Ø˜yÐ(Ð(Ý*-¨i¸Ô.AÑ*BÔ*B�I˜hÑ'Ý 2°9Ñ =Ô =ÑˆE�:Ø�zÑ!ˆGðG&ðCØ—L’L­¬Ô(CØ'.ð !ñ 0ô 0ð 0à.3Ð+Ð+øÝ'ð Cð Cð CØ.2Ð+Ø×0Ò0°°OØ1:¸EÀ5ñJô J�Cà?BÑ<�O Y°°u°u°u°u°u°uøøøøð	Cøøøð !×0Ò0Ñ2Ô2�	ð ð 'Ø�G˜IÑ&Ô&Ð&ð  ×-Ò-¨i¸¸vÑFÔF�Øð %Ø$�Eð ×#Ò#Ñ%Ô%ð Øð" /ð :Ø ð :Ý #¥H¨e°a©iÑ 8Ô 8˜˜å # A­¡LØ$(Ô$7Ý$'¨°©	Ø(-°©
°R©ñ%9ô %9ñ!:ô !:˜õ ”9‘;”; ¤Ñ0µC´KÔ4MÒMÐMØ ×,Ò,Ñ.Ô.�EØ'Ø Ø&/Ð<˜7˜7°WØ$-Ð8˜5˜5°5Ø ð"ñ"�ð
 Õ0°µs¸7±|´|ÑDÔDÑD�ØÐ%Ø#%�D”LñOG&ðB øõN !ð 	ð 	ð 	ØˆDð	øøøõ 	�4˜ Ñ)Ô)Ð)Øˆs>   ÁA6I Ã(C, Ã+I Ã,
D"Ã6"DÄI ÄD"Ä"D$I É
IÉIc                 ó$  — |                       t          j        j        |d¬¦  «         g }|                      ¦   «                              ¦   «         D ]¿\  }}|d                              ¦   «         r d|v rœ|                     d¦  «        \  }}t          |¦  «        }|t          |¦  «        dz
  k    rTt          t          |¦  «        |dz   ¦  «        D ]3}|                     t          j                             ¦   «         ¦  «         Œ4|||         |<   ŒÀ|S )zRetrieve ordered-list data.Trü  r¯   rë   r®   )rÞ  r   r}  ÚCTL_OP_READ_ORDLIST_Arù  ró  Úisdigitr  ry   rh   rÂ  rm   r²   rî  )r!   ÚlisttypeÚstanzasrª  rõ  ÚstemÚstanzarË  s           r   Ú	__ordlistzControlSession.__ordlistû  s  € à�Š�CœKÔ=Ø#¨$ð 	ñ 	0ô 	0ð 	0àˆØ ×0Ò0Ñ2Ô2×8Ò8Ñ:Ô:ð 	.ð 	.‰LˆS�%Ø�2Œw�ŠÑ Ô ð . S¨C Z ZØ!$§¢¨3¡¤‘��vÝ˜V™œ�Ø�C ™LœL¨1Ñ,Ò,Ð,Ý"¥3 w¡<¤<°¸!±Ñ<Ô<ð ?ð ?˜ØŸš¥s¤x×';Ò';Ñ'=Ô'=Ñ>Ô>Ð>Ð>Ø(-�˜” Ñ%øØˆr   c                 ó,   — |                       d¦  «        S )zRetrieve reslist data.Úaddr_restrictions©Ú_ControlSession__ordlistr(   s    r   ÚreslistzControlSession.reslist
  s   € à�~Š~Ð1Ñ2Ô2Ð2r   c                 ó,   — |                       d¦  «        S )zRetrieve ifstats data.ÚifstatsrH  r(   s    r   rL  zControlSession.ifstats  s   € à�~Š~˜iÑ(Ô(Ð(r   )F)r   rN   FrI   )NNN)+r4   r5   r6   r7   r@  r»  r   r}  ÚCERR_UNSPECÚCERR_PERMISSIONÚCERR_BADFMTÚ
CERR_BADOPÚCERR_BADASSOCr  r  ÚCERR_RESTRICTrØ  r$   rM  rO  rQ  rm  r  r/  rw  rŒ  rÚ   r—  rÒ  rº  rÞ  rå  rù  ÚCTL_OP_READVARrá   r  r	  r0  r/  r=  rI  rJ  rL  r   r   r   r"  r"  Â  s)  € € € € € ØÐØ€MØ€IàŒÔ ØŒÔ# \ØŒÔ ØŒÔ ØŒÔ! :ØŒÔ# \ØŒÔ! :ØŒÔ! :ð	
€Mðð ð ð2@ð @ð @ðð ð ð
%ð %ð %ð6ð 6ð 6ðp #)Ô"2ð ð ð ð ð8'!ð '!ð '!ðRð ð ð(3ð 3ð 3ð 3ðjtMð tMð tMðl>ð >ð >ð@ð ð ð ð*ð ð ð ð3+ð 3+ð 3+ð 3+ðj  ¨Ø”{Ô1°uð)ð )ð )ð )ðGð Gð Gð.ð .ð .ð,1ð 1ð 1ðf%8ð %8ð %8ðNhð hð hð hðTð ð ð3ð 3ð 3ð)ð )ð )ð )ð )r   r"  c                 óÀ  — d }d }t           }d| v r^| d         }| d= d„ d„ d„ d„ d„ d„ d„ d	„ d
„ d„ d„ d„ dœ}|dk    rd }|�.|                     |¦  «        }|€t          t          |z  ¦  «        ‚t	          |                      ¦   «         ¦  «        D ]¾}|dv rŒ|                     d¦  «        s|                     d¦  «        rw|                     d¦  «        }t          |¦  «        dk    s7|d         t          t          t	          t          d¦  «        ¦  «        ¦  «        vrt          t          |z  ¦  «        ‚Œ¨t          t          |z  ¦  «        ‚d| v r%t          |                      d¦  «        ¦  «        }| d= d| v r.|                      dd¦  «        t          j        j        z  | d<   | d= d| v r.|                      dd¦  «        t          j        j        z  | d<   | d= |||fS )NrÁ  c                 óJ   — t           j                             | j        ¦  «        S r&   ©r   r  r  rý   ©rf  s    r   r›  z%parse_mru_variables.<locals>.<lambda>"  s   € ¥¤× 3Ò 3°A´FÑ ;Ô ;€ r   c                 óL   — t           j                             | j        ¦  «         S r&   rV  rW  s    r   r›  z%parse_mru_variables.<locals>.<lambda>$  s   € ¥#¤(×"5Ò"5°a´fÑ"=Ô"=Ð!=€ r   c                 ó,   — |                       ¦   «          S r&   ©r  rW  s    r   r›  z%parse_mru_variables.<locals>.<lambda>&  s   €  §¢¡¤ € r   c                 ó*   — |                       ¦   «         S r&   rZ  rW  s    r   r›  z%parse_mru_variables.<locals>.<lambda>(  s   €  §¢¡¤€ r   c                 ó*   — |                       ¦   «         S r&   ©r  rW  s    r   r›  z%parse_mru_variables.<locals>.<lambda>*  s   € ˜aŸjšj™lœl€ r   c                 ó*   — |                       ¦   «         S r&   r]  rW  s    r   r›  z%parse_mru_variables.<locals>.<lambda>,  s   € ˜qŸzšz™|œ|€ r   c                 ó   — | j          S r&   ©r   rW  s    r   r›  z%parse_mru_variables.<locals>.<lambda>.  ó
   €  ¤˜u€ r   c                 ó   — | j         S r&   r`  rW  s    r   r›  z%parse_mru_variables.<locals>.<lambda>0  ó   €  ¤€ r   c                 ó   — | j          S r&   ©r  rW  s    r   r›  z%parse_mru_variables.<locals>.<lambda>2  ra  r   c                 ó   — | j         S r&   re  rW  s    r   r›  z%parse_mru_variables.<locals>.<lambda>4  rc  r   c                 ó   — | j          S r&   ©r  rW  s    r   r›  z%parse_mru_variables.<locals>.<lambda>6  s
   € ˜qœt˜e€ r   c                 ó   — | j         S r&   rh  rW  s    r   r›  z%parse_mru_variables.<locals>.<lambda>8  s   € ˜qœt€ r   )Úlstintz-lstintr  z-avgintrü   z-addrrÁ   z-countÚscorez-scoreÚdropz-droprj  )ÚmincountÚmindropÚminscorer(  r)  ÚkodÚlimitedÚ	maxlstintÚ	minlstintÚladdrÚrecentrÁ  r%  r$  zaddr.zlast.rë   r‡   r®   r   r%  rp  r)  r   rq  )r®  Úgetr  ÚSERR_BADSORTr  Úkeysr[  r  rh   Úmapr  rÂ  ÚSERR_BADPARAMry   r   r   ÚRES_KODÚRES_LIMITED)rß   r6  r7  r%  ÚsortdictÚkÚkns          r   r+  r+    s2  € Ø€FØ€GÝ€EØ�ÐÐØ˜FÔ#ˆØ�fÐð <Ð;à=Ð=à+Ð+à+Ð+à*Ð*à+Ð+à$�_à$�nà$�_à$�nà#�Oà#�^ð1
ð 
ˆð4 �hÒÐØˆGØÐØ—\’\ 'Ñ*Ô*ˆFØˆ~Ý&¥|°gÑ'=Ñ>Ô>Ð>Ý�)—.’.Ñ"Ô"Ñ#Ô#ð 6ð 6ˆØð +ð +ð +ð Ø�\Š\˜'Ñ"Ô"ð 	6 a§l¢l°7Ñ&;Ô&;ð 	6Ø—’˜‘”ˆBÝ�2‰wŒw˜!Š|ˆ|˜r !œu­CµµT½%À¹)¼)±_´_Ñ,EÔ,EÐEÐEÝ&¥}°qÑ'8Ñ9Ô9Ð9Øå"¥=°1Ñ#4Ñ5Ô5Ð5Ø�)ÐÐÝ�I—M’M 'Ñ*Ô*Ñ+Ô+ˆØ�gÐØ�	ÐÐØ'Ÿmšm¨H°aÑ8Ô8Ý #¤	Ô 1ñ2ˆ	�(Ñà�eÐØ�IÐÐØ'Ÿmšm¨H°aÑ8Ô8Ý #¤	Ô 5ñ6ˆ	�(Ñà�iÐ Ø�7˜EÐ!Ð!r   c                 ó  — i }g }t          | j        ¦  «        D ]?\  }}|j        |vr
g ||j        <   ||j                                      ||j        f¦  «         Œ@|D ]%}|t          ||         d„ ¬¦  «        d d…         z  }Œ&d„ |D ¦   «         }|                     d¬¦  «         |D ]}| j                             |¦  «         Œ|r<| j                             |¬¦  «         |dk    r| j                             ¦   «          d S d S d S )Nc                 ó   — | d         S )Nr®   r   rš  s    r   r›  zstitch_mru.<locals>.<lambda>i  s
   € ¸¸!¼€ r   r©  r¯   c                 ó   — g | ]
}|d          ‘ŒS rI   r   rç   s     r   rè   zstitch_mru.<locals>.<listcomp>j  s   € Ð%Ð%Ð%˜ˆq�ŒtÐ%Ð%Ð%r   T)Úreverserü   )	r´  r  rü   rm   rý   ÚsortedrÁ  Úpoprƒ  )r  r6  r7  ÚaddrdictÚdeletiarË  Úentryrü   s           r   r4  r4  [  sH  € ð €HØ€GÝ ¤Ñ-Ô-ð 5ð 5‰
ˆˆEØŒ:˜XÐ%Ð%Ø#%ˆH�U”ZÑ Ø�”Ô×#Ò# Q¨¬
 OÑ4Ô4Ð4Ð4Øð Cð CˆØ•6˜( 4œ.¨n¨nÐ=Ñ=Ô=¸c¸r¸cÔBÑBˆˆØ%Ð%˜WÐ%Ñ%Ô%€GØ‡L‚L˜€LÑÔÐØð ð ˆØŒ×Ò˜ÑÔÐÐð ð #ØŒ×Ò˜fÐÑ%Ô%Ð%Ø�fÒÐàŒL× Ò Ñ"Ô"Ð"Ð"Ð"ð	#ð #àÐr   c                 óÆ   — | sdS d„ t          |                      ¦   «         ¦  «        D ¦   «         }dd                     |¦  «        z   }d| v rd| d         z  }||z  }n|}||fS )N)rN   rN   c                 ó0   — g | ]}|d          dk    ¯d|z  ‘ŒS )r   ru  z%s=%sr   )rª   Úits     r   rè   z&generate_mru_parms.<locals>.<listcomp>{  s7   € ð Jð Jð JØ°b¸´e¸xÒ6GÐ6Gð ˜2‘Ø6GÐ6GÐ6Gr   z, ru  z, recent=%s)r  ró  rð   )rß   ÚparmStrsr9  r:  s       r   r-  r-  w  s�   € Øð ØˆvðJð JÝ˜yŸšÑ0Ô0Ñ1Ô1ðJñ Jô J€Hà�4—9’9˜XÑ&Ô&Ñ&€Eà�9ÐÐØ" Y¨xÔ%8Ñ8ˆ
Ø�eÑˆ
ˆ
àˆ
Ø�*ÐÐr   c                 ó:  — d}t          t          | j        ¦  «        ¦  «        D ]v}| j        t          | j        ¦  «        |z
  dz
           }d||j        ||j        fz  }|t          |¦  «        z   t          |¦  «        z   t
          j        j        k    r n||z  }Œw|S )NrN   r®   z, addr.%d=%s, last.%d=%s)rÂ  rh   r  rü   rý   r   r}  r’  )r  ÚexistingBufferSizeÚbufrË  rf  Úincrs         r   r2  r2  ‡  sŸ   € Ø
€CÝ•3�t”|Ñ$Ô$Ñ%Ô%ð ð ˆØŒL�˜Tœ\Ñ*Ô*¨QÑ.°Ñ2Ô3ˆØ)¨Q°´¸¸1¼6Ð,BÑBˆØ¥ S¡¤Ñ)­C°©I¬IÑ5Ý”Ô,ò-ð -àˆEà�4‰KˆCˆCØ€Jr   c                 ó°   — | d                               d¦  «        }t          |¦  «        dk    rdS 	 t          |d         ¦  «        S # t          $ r Y dS w xY w)Nr   rë   r®   éþÿÿÿr¯   )r  rh   ry   r~  )ÚtokenÚbitss     r   r  r  ”  sb   € Ø�Œ8�>Š>˜#ÑÔ€DÝ
ˆ4�y„y�A‚~€~ØˆrðÝ�4˜”7‰|Œ|ÐøÝð ð ð Øˆrˆrðøøøs   ²A Á
AÁAc                   ób   — e Zd ZdZdd„Zd„ Zd„ Zdd„Zed„ ¦   «         Z	ed„ ¦   «         Z
dd
„ZdS )rz  z+MAC authentication manager for NTP packets.Nc                 ó¶  — i | _         |�Ít          |¦  «        D ]¿}d|v r|d |                     d¦  «        …         }|                     ¦   «         }|sŒ:|                     ¦   «         \  }}}|                     ¦   «         dv rd}t          |¦  «        dk    r't          j         	                    |d d…         ¦  «        }||f| j         t          |¦  «        <   Œ¾d S d S )Nú#)ÚAESÚ
AES128CMACzAES-128r
   rÊ   )Ú	passwordsÚopenrì  rë  r  Úupperrh   r   r²   rŠ  ry   )r!   Úkeyfiler÷   r8  r7  r9  s         r   r$   zAuthenticator.__init__¡  sè   € àˆŒØÐÝ˜W™œð ?ð ?�Ø˜$�;�;ØÐ 0 §¢¨C¡¤Ð 0Ô1�DØ—z’z‘|”|�Øð ØØ+/¯:ª:©<¬<Ñ(�˜ Ø—=’=‘?”?Ð&;Ð;Ð;Ø'�GÝ�v‘;”; Ò#Ð#õ !œX×3Ò3°F¸3¸B¸3´KÑ@Ô@�FØ.5°vÐ->�”�s 5™zœzÑ*Ð*ð Ðð?ð ?r   c                 ó*   — t          | j        ¦  «        S )z1return the number of keytype/passwd tuples stored)rh   rš  r(   s    r   Ú__len__zAuthenticator.__len__´  s   € å�4”>Ñ"Ô"Ð"r   c                 ó6   — | j                              |¦  «        S )z#get a keytype/passwd tuple by keyid)rš  rv  )r!   r8  s     r   Ú__getitem__zAuthenticator.__getitem__¸  s   € àŒ~×!Ò! %Ñ(Ô(Ð(r   c                 ó’  — |�|| j         v r|f| j         |         z   S |ddfS t          d¦  «        D ]�}|                     d¦  «        ryt          |                     ¦   «         d         ¦  «        }| j         |         \  }}|€t
          ‚t          |¦  «        dk    rt          j         	                    |¦  «        }|||fc S Œ‘t
          ‚)z?Get the keytype/passwd tuple that controls localhost and its idNz/etc/ntpsec/ntp.confr}  r®   r
   )
rš  r›  r[  ry   r  r~  rh   r   r²   rŠ  )r!   r8  r÷   r7  r9  s        r   r}  zAuthenticator.control¼  sÝ   € àÐØ˜œÐ&Ð&Ø�x $¤.°Ô"7Ñ7Ð7à˜t TÐ*Ð*ÝÐ/Ñ0Ô0ð 		0ð 		0ˆDØ�Š˜yÑ)Ô)ð 0Ý˜DŸJšJ™LœL¨œOÑ,Ô,�Ø$(¤N°5Ô$9Ñ!�˜&Ø�>å$Ð$Ý�v‘;”; Ò#Ð#Ý œX×3Ò3°FÑ;Ô;�FØ˜w¨Ð/Ð/Ð/Ð/ð0õ Ðr   c                 óX  — t           j                             |¦  «        sdS t           j                             t           j                             | ¦  «        t           j                             |¦  «        |¦  «        }|rt          |¦  «        dk    rdS t          j        d|¦  «        |z   S )z)Create the authentication payload to sendFr   r   ú!I)	r   r  Ú	checknamer\   r*   r+   rh   rj   r‘   )ro   r8  r7  r9  Úmac2s        r   r”  zAuthenticator.compute_macÐ  s‘   € õ Œx×!Ò! 'Ñ*Ô*ð 	Ø�5ÝŒx�|Š|�CœH×.Ò.¨wÑ7Ô7ÝœH×.Ò.¨vÑ6Ô6¸ñAô Aˆàð 	•s˜4‘y”y A’~�~Ø�3ÝŒ{˜4 Ñ'Ô'¨$Ñ.Ð.r   c                 óF   — t          | ¦  «        t          j        j        k    S )zDoes this packet have a MAC?)rh   r   r   ÚLEN_PKT_NOMAC)Úpackets    r   Úhave_maczAuthenticator.have_macÛ  s   € õ �6‰{Œ{�SœYÔ4Ò4Ð4r   rM   c                 ó  — |d|…         }|||t           z   …         }||t           z   d…         }t          j        d|¦  «        \  }|| j        vrdS | j        |         \  }}t          j                             |¦  «        sdS t          j                             t          j         	                    |¦  «        t          j         	                    |¦  «        |¦  «        }	|	sdS 	 t          j        ||	¦  «        S # t          $ r	 ||	k    cY S w xY w)zDDoes the MAC on this packet verify according to credentials we have?Nr¤  F)r¾  rj   rk   rš  r   r  r¥  r\   r*   r+   ÚhmacÚcompare_digestra  )
r!   r©  r¢  r£  ro   r8  r\   r7  r9  r¦  s
             r   rÀ  zAuthenticator.verify_macã  s  € à˜˜*˜Ô%ˆØ�y ­<Ñ!7Ð7Ô8ˆØ�Y�|Ñ+Ð,Ð,Ô-ˆÝ”=  uÑ-Ô-‰ˆØ˜œÐ&Ð&à�5Ø œN¨5Ô1Ñˆ�&ÝŒx×!Ò! 'Ñ*Ô*ð 	Ø�5ÝŒx�|Š|�CœH×.Ò.¨wÑ7Ô7ÝœH×.Ò.¨vÑ6Ô6¸ñAô Aˆàð 	Ø�5ð	ÝÔ& s¨DÑ1Ô1Ð1øÝð 	ð 	ð 	Ø˜$’;ÐÐÐð	øøøs   Ã"C7 Ã7D
Ä	D
r&   )rM   rM   )r4   r5   r6   r7   r$   rŸ  r¡  r}  r8   r”  rª  rÀ  r   r   r   rz  rz  ž  sª   € € € € € Ø1Ð1ð?ð ?ð ?ð ?ð&#ð #ð #ð)ð )ð )ðð ð ð ð( ð/ð /ñ „\ð/ð ð5ð 5ñ „\ð5ðð ð ð ð ð r   rz  )Hr7   Ú
__future__r   r   rˆ  r¬  r€  r¸  r±  r  r¨   rj   rB  r`   Úntp.controlr   Ú	ntp.magicÚntp.ntpcÚntp.utilÚntp.polyr®  r1  r3  rƒ  r¼  r¿  r¾  r½  ÚMAX_BARE_MAC_LENGTHr   ÚBaseExceptionr>   rL   r¹   rÝ   ÚSERR_BADFMTrþ  Ú
SERR_BADOPÚSERR_BADASSOCÚSERR_UNKNOWNVARÚSERR_BADVALUEr¹  r·  r³  rµ  r¯  r²  rÜ  rã  r„  r‰  r•  r  rz  r“  r×  r  r  rw  r  rC  rø   rú   r  r  r"  r+  r4  r-  r2  r  rz  r   r   r   ú<module>r»     s­  ððIð IðV 0Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ø €€€Ø €€€Ø 	€	€	€	Ø €€€Ø €€€Ø €€€Ø €€€Ø €€€Ø 
€
€
€
Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ø €€€Ø €€€Ø €€€ð( €ð €
Ø€ð €	ð Ð ØÐ Ø€ØÐ ØÐ ð%%ð %%ð %%ð %%ð %%ñ %%ô %%ð %%ðPð ð ð ð �Mñ ô ð ð@ð @ð @ð @ð @�ñ @ô @ð @ðFA-ð A-ð A-ð A-ð A-�Fñ A-ô A-ð A-ðHð ð ð ð ñ ô ð ð" @€ØD€Ø:€
Ø;€ØA€ØB€Ø9€Ø?€Ø'€Ø<€Ø<€Ø'€Ø!€ØF€Ø)€Ø$€Ø€
Ø5€Ø+€Ø!€Ø'€ØN€
Ø!€Ø4€Ø6€ð %(¤Jð ð ð ð ð(%?ð %?ð %?ð %?ð %?ñ %?ô %?ð %?ðPIð Ið Ið Ið Iñ Iô Ið Iðð ð ð ð �}ñ ô ð ðN)ð N)ð N)ð N)ð N)ñ N)ô N)ð N)ðbE"ð E"ð E"ðP#ð #ð #ð8ð ð ð 
ð 
ð 
ðð ð ðYð Yð Yð Yð Yñ Yô Yð Yð Yð Yr   