
    8j<Q                    .   d Z ddlmZ ddlZddlZddlmZmZmZ ddl	m
Z
 ddlmZ ddlmZ dd	lmZmZmZmZmZ dZd
ZdZeez   ez   ez   Zed
z  ZdZdZdZeZeZ erddl!m"Z" ddl#m$Z$ ej%         G d dej&                              Z' G d d          Z( G d de(          Z) G d de(          Z* G d de*          Z+ G d de*          Z, G d de*          Z- G d d e*          Z. G d! d"e*          Z/ G d# d$e*          Z0e*Z1 G d% d&          Z2dS )'a  Multicast DNS Service Discovery for Python, v0.14-wmcbrine
Copyright 2003 Paul Scott-Murphy, 2014 William McBrine

This module provides a framework for the use of DNS Service Discovery
using IP multicast.

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
USA
    )annotationsN)TYPE_CHECKINGAnycast   AbstractMethodException)_is_v6_address)current_time_millis)_CLASS_MASK_CLASS_UNIQUE_CLASSES	_TYPE_ANY_TYPES      i  i     )DNSIncoming)DNSOutgoingc                      e Zd ZdZdZdZdS )DNSQuestionTypezAn MDNS question type.

    "QU" - questions requesting unicast responses
    "QM" - questions requesting multicast responses
    https://datatracker.ietf.org/doc/html/rfc6762#section-5.4
    r   r   N)__name__
__module____qualname____doc__QUQM     C/home/user/adhan/venv/lib/python3.11/site-packages/zeroconf/_dns.pyr   r   5   s$          
B	
BBBr   r   c                  n    e Zd ZdZdZdd
ZddZddZddZe	dd            Z
e	dd            ZddZdS ) DNSEntryzA DNS entry)class_keynametypeuniquer%   strtype_intr#   returnNonec                4    |                      |||           d S N)_fast_init_entryselfr%   r)   r#   s       r    __init__zDNSEntry.__init__G   s     dE622222r   _intc                    || _         |                                | _        || _        |t          z  | _        |t          z  dk    | _        dS )Fast init for reuse.r   N)r%   lowerr$   r&   r   r#   r   r'   r0   s       r    r/   zDNSEntry._fast_init_entryJ   s@    	::<<	{*-!3r   otherboolc                b    | j         |j         k    o| j        |j        k    o| j        |j        k    S r.   )r$   r&   r#   r1   r7   s     r    _dns_entry_matcheszDNSEntry._dns_entry_matchesR   s/    x59$`ej)@`T[TYT`E``r   r   c                V    t          |t                    o|                     |          S )z6Equality test on key (lowercase name), type, and class)
isinstancer"   r;   r:   s     r    __eq__zDNSEntry.__eq__U   s%    %**Mt/F/Fu/M/MMr   c                4    t          j        | d|  d          S )zClass accessor?())r   get)r#   s    r    
get_class_zDNSEntry.get_class_Y   s     |FNNNN333r   tc                4    t          j        | d|  d          S )zType accessorr@   rA   )r   rB   )rD   s    r    get_typezDNSEntry.get_type^   s     z!Y!YYY'''r   hdrbytes | str | Nonec                    d                     ||                     | j                  |                     | j                  | j        rdnd| j        |dt          t          |           nd          S )1String representation with additional informationz{}[{},{}{},{}]{}z-unique N=)	formatrF   r&   rC   r#   r'   r%   r   r   )r1   rG   r7   s      r    entry_to_stringzDNSEntry.entry_to_stringc   sr    !((MM$)$$OODK((,II"I&+&7"S%  """R
 
 	
r   Nr%   r(   r)   r*   r#   r*   r+   r,   r%   r(   r)   r3   r#   r3   r+   r,   )r7   r"   r+   r8   r7   r   r+   r8   )r#   r*   r+   r(   )rD   r*   r+   r(   )rG   r(   r7   rH   r+   r(   )r   r   r   r   	__slots__r2   r/   r;   r>   staticmethodrC   rF   rN   r   r   r    r"   r"   B   s        ;I3 3 3 34 4 4 4a a a aN N N N 4 4 4 \4 ( ( ( \(	
 	
 	
 	
 	
 	
r   r"   c                      e Zd ZdZdZdd
ZddZddZddZddZ	e
dd            Ze
d d            Zej        d!d            Zd"dZdS )#DNSQuestionzA DNS question entry_hashr%   r(   r)   r*   r#   r+   r,   c                4    |                      |||           d S r.   )
_fast_initr0   s       r    r2   zDNSQuestion.__init__t   s    eV,,,,,r   r3   c                v    |                      |||           t          | j        || j        f          | _        dS r5   N)r/   hashr$   r#   rW   r0   s       r    rY   zDNSQuestion._fast_initw   s8    dE622248UDK899


r   rec	DNSRecordr8   c                l    | j         |j         k    o$| j        |j        t          fv o| j        |j        k    S )z6Returns true if the question is answered by the record)r#   r&   r   r%   )r1   r]   s     r    answered_byzDNSQuestion.answered_by|   s6    {cj(iTY38Y:O-OiTXT]adaiTiir   c                    | j         S r.   rV   r1   s    r    __hash__zDNSQuestion.__hash__   s
    zr   r7   r   c                V    t          |t                    o|                     |          S )zTests equality on dns question.)r=   rU   r;   r:   s     r    r>   zDNSQuestion.__eq__   s%    %--P$2I2I%2P2PPr   c                    t          | j                            d                    t          z   t          z   t          z   S )z+Maximum size of the question in the packet.utf-8)lenr%   encode	_LEN_BYTE
_LEN_SHORTrb   s    r    max_sizezDNSQuestion.max_size   s1     49##G,,--	9JFSSr   c                    | j         S )zzReturns true if the QU (not QM) is set.

        unique shares the same mask as the one
        used for unicast.
        r'   rb   s    r    unicastzDNSQuestion.unicast   s     {r   valuec                    || _         dS )zSets the QU bit (not QM).Nrm   )r1   ro   s     r    rn   zDNSQuestion.unicast   s     r   c                    d                     |                     | j                  | j        rdnd|                     | j                  | j                  S )String representationz{}[question,{},{},{}]r   r   )rM   rF   r&   rn   rC   r#   r%   rb   s    r    __repr__zDNSQuestion.__repr__   sO    &--MM$)$$L*DDdOODK((I	
 
 	
r   NrO   rP   )r]   r^   r+   r8   r+   r*   rQ   )r+   r8   )ro   r8   r+   r,   r+   r(   )r   r   r   r   rR   r2   rY   r`   rc   r>   propertyrk   rn   setterrs   r   r   r    rU   rU   o   s       I- - - -: : : :
j j j j   Q Q Q Q T T T XT    X ^   ^
 
 
 
 
 
r   rU   c                      e Zd ZdZdZ	 d*d+dZd,dZd-dZd.dZd/dZ	d.dZ
d0dZd1d Zd2d!Zd2d"Zd2d#Zd3d$Zd4d'Zd5d)ZdS )6r^   z.A DNS record - like a DNS entry, but has a TTLcreatedttlNr%   r(   r)   r*   r#   r{   r3   rz   float | Noner+   r,   c                T    |                      |||||pt                                 d S r.   )_fast_init_recordr   r1   r%   r)   r#   r{   rz   s         r    r2   zDNSRecord.__init__   s2     	tUFC9YDWDYDYZZZZZr   _floatc                P    |                      |||           || _        || _        dS r[   )r/   r{   rz   r   s         r    r~   zDNSRecord._fast_init_record   s,    dE6222r   r7   r   r8   c                    t           zAbstract methodr   r:   s     r    r>   zDNSRecord.__eq__       %%r   c                "    | j         |j         k     S r.   r{   r:   s     r    __lt__zDNSRecord.__lt__   s    x%)##r   msgr   c                h    |                                 }|D ]}|                     |          r dS dS )zdReturns true if any answer in a message can suffice for the
        information held in this record.TF)answers_suppressed_by_answer)r1   r   r   records       r    suppressed_byzDNSRecord.suppressed_by   sG     ++-- 	 	F))&11 ttur   c                4    | |k    o|j         | j         dz  k    S )zwReturns true if another record has same name, type and class,
        and if its TTL is at least half of this record's.r   r   r:   s     r    r   zDNSRecord._suppressed_by_answer   s      u};dhl!;;r   percentfloatc                ,    | j         || j        z  dz  z   S )zXReturns the time at which this record will have expired
        by a certain percentage.
   ry   )r1   r   s     r    get_expiration_timezDNSRecord.get_expiration_time   s     |w1B677r   nowint | floatc                P    | j         t          | j        z  z   |z
  dz  }|dk     rdn|S )z%Returns the remaining TTL in seconds.g     @@r   rz   _EXPIRE_FULL_TIME_MSr{   )r1   r   remains      r    get_remaining_ttlzDNSRecord.get_remaining_ttl   s2    ,"6"ABSHFRQJJqqF*r   c                8    | j         t          | j        z  z   |k    S )z(Returns true if this record has expired.r   r1   r   s     r    
is_expiredzDNSRecord.is_expired   s    |3dh>?3FFr   c                8    | j         t          | j        z  z   |k    S )z9Returns true if this record is at least half way expired.)rz   _EXPIRE_STALE_TIME_MSr{   r   s     r    is_stalezDNSRecord.is_stale   s    |4tx?@CGGr   c                8    | j         t          | j        z  z   |k    S )zFReturns true if the record more than one quarter of its TTL remaining.)rz   _RECENT_TIME_MSr{   r   s     r    	is_recentzDNSRecord.is_recent   s    |9:S@@r   c                "    || _         || _        dS )z$Set the created and ttl of a record.Nry   )r1   rz   r{   s      r    _set_created_ttlzDNSRecord._set_created_ttl   s     r   outr   c                    t           r   r   r1   r   s     r    writezDNSRecord.write   r   r   bytes | strc                    | j          dt          |                     t                                           dt	          t
          |           }t                              | d|          S )rJ   /,r   )r{   r*   r   r   r   r   r"   rN   )r1   r7   args      r    	to_stringzDNSRecord.to_string   sa    ccC 6 67J7L7L M MNNccQUVY[`QaQacc''h<<<r   r.   )r%   r(   r)   r*   r#   r*   r{   r3   rz   r|   r+   r,   )r%   r(   r)   r3   r#   r3   r{   r3   rz   r   r+   r,   rQ   )r7   r^   r+   r8   )r   r   r+   r8   )r   r3   r+   r   )r   r   r+   r   )r   r   r+   r8   )rz   r   r{   r3   r+   r,   r   r   r+   r,   )r7   r   r+   r(   )r   r   r   r   rR   r2   r~   r>   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r^   r^      sR       88"I !%[ [ [ [ [   & & & &$ $ $ $   < < < <
8 8 8 8+ + + +
G G G GH H H HA A A A   & & & &= = = = = =r   r^   c                  T    e Zd ZdZdZ	 	 d!d"dZd#dZd$dZd%dZd&dZ	d'dZ
d(d ZdS ))
DNSAddresszA DNS address record)rW   addressscope_idNr%   r(   r)   r*   r#   r{   r   bytesr   
int | Nonerz   r|   r+   r,   c           
     X    |                      |||||||pt                                 d S r.   rY   r   r1   r%   r)   r#   r{   r   r   rz   s           r    r2   zDNSAddress.__init__   s4     	eVS'8WEePcPePefffffr   r3   _int | Noner   c                    |                      |||||           || _        || _        t          | j        || j        ||f          | _        dS r[   )r~   r   r   r\   r$   r#   rW   r   s           r    rY   zDNSAddress._fast_init  sP     	tUFCAAA 48UDK(KLL


r   r   r   c                :    |                     | j                   dS 'Used in constructing an outgoing packetN)write_stringr   r   s     r    r   zDNSAddress.write  s    &&&&&r   r7   r   r8   c                V    t          |t                    o|                     |          S )zTests equality on address)r=   r   _eqr:   s     r    r>   zDNSAddress.__eq__  !    %,,@%@r   c                l    | j         |j         k    o$| j        |j        k    o|                     |          S r.   )r   r   r;   r:   s     r    r   zDNSAddress._eq  s:    LEM) ///''..	
r   c                    | j         S )z"Hash to compare like DNSAddresses.rV   rb   s    r    rc   zDNSAddress.__hash__&  
    zr   c                .   	 |                      t          j        t          | j                  rt          j        nt          j        | j                            S # t          t          f$ r* |                      t          | j                            cY S w xY wrr   )
r   socket	inet_ntopr
   r   AF_INET6AF_INET
ValueErrorOSErrorr(   rb   s    r    rs   zDNSAddress.__repr__*  s    	5>> '5dl'C'CWFOOL    G$ 	5 	5 	5>>#dl"3"344444	5s   AA 8BB)NN)r%   r(   r)   r*   r#   r*   r{   r*   r   r   r   r   rz   r|   r+   r,   )r%   r(   r)   r3   r#   r3   r{   r3   r   r   r   r   rz   r   r+   r,   r   rQ   )r7   r   r+   r8   rt   ru   r   r   r   r   rR   r2   rY   r   r>   r   rc   rs   r   r   r    r   r      s        0I  $ $
g 
g 
g 
g 
gM M M M ' ' ' 'A A A A
 
 
 
   
5 
5 
5 
5 
5 
5r   r   c                  R    e Zd ZdZdZ	 dddZd dZd!dZd"dZd#dZ	d$dZ
d%dZdS )&DNSHinfozA DNS host information record)rW   cpuosNr%   r(   r)   r*   r#   r{   r   r   rz   r|   r+   r,   c           
     X    |                      |||||||pt                                 d S r.   r   r1   r%   r)   r#   r{   r   r   rz   s           r    r2   zDNSHinfo.__init__<  s4     	eVS#r7;[FYF[F[\\\\\r   r3   r   c                    |                      |||||           || _        || _        t          | j        || j        ||f          | _        dS r[   )r~   r   r   r\   r$   r#   rW   r   s           r    rY   zDNSHinfo._fast_initH  sP     	tUFCAAA48UDKbABB


r   r   r   c                    |                     | j                            d                     |                     | j                            d                     dS )r   rf   N)write_character_stringr   rh   r   r   s     r    r   zDNSHinfo.writeQ  sL    ""48??7#;#;<<<""47>>'#:#:;;;;;r   r7   r   r8   c                V    t          |t                    o|                     |          S zTests equality on cpu and os.)r=   r   r   r:   s     r    r>   zDNSHinfo.__eq__V  s!    %**>txx>r   c                l    | j         |j         k    o$| j        |j        k    o|                     |          S r   )r   r   r;   r:   s     r    r   zDNSHinfo._eqZ  s3    x59$_EH)<_AXAXY^A_A__r   c                    | j         S )zHash to compare like DNSHinfo.rV   rb   s    r    rc   zDNSHinfo.__hash__^  r   r   c                L    |                      | j        dz   | j        z             S )rr    )r   r   r   rb   s    r    rs   zDNSHinfo.__repr__b  s!    ~~dhntw6777r   r.   )r%   r(   r)   r*   r#   r*   r{   r*   r   r(   r   r(   rz   r|   r+   r,   )r%   r(   r)   r3   r#   r3   r{   r3   r   r(   r   r(   rz   r   r+   r,   r   rQ   )r7   r   r+   r8   rt   ru   r   r   r   r    r   r   7  s        ''&I !%
] 
] 
] 
] 
]C C C C< < < <
? ? ? ?` ` ` `   8 8 8 8 8 8r   r   c                  j    e Zd ZdZdZ	 dddZd dZed!d            Zd"dZ	d#dZ
d$dZd!dZd%dZdS )&
DNSPointerzA DNS pointer record)rW   alias	alias_keyNr%   r(   r)   r*   r#   r{   r   rz   r|   r+   r,   c           	     V    |                      ||||||pt                                 d S r.   r   r1   r%   r)   r#   r{   r   rz   s          r    r2   zDNSPointer.__init__l  s2     	eVS%9YDWDYDYZZZZZr   r3   r   c                    |                      |||||           || _        |                                | _        t	          | j        || j        | j        f          | _        d S r.   )r~   r   r6   r   r\   r$   r#   rW   r   s          r    rY   zDNSPointer._fast_initw  sX     	tUFCAAA
48UDKHII


r   c                    t           t          z   t          | j                  t          | j                  z
  z   t          z   S )zOMaximum size of the record in the packet assuming the name has been compressed.)_BASE_MAX_SIZE_NAME_COMPRESSION_MIN_SIZErg   r   r%   rb   s    r    max_size_compressedzDNSPointer.max_size_compressed  s;     ()4:TY/1 ))	
r   r   r   c                :    |                     | j                   dS r   )
write_namer   r   s     r    r   zDNSPointer.write  s    tz"""""r   r7   r   r8   c                V    t          |t                    o|                     |          S zTests equality on alias.)r=   r   r   r:   s     r    r>   zDNSPointer.__eq__  r   r   c                L    | j         |j         k    o|                     |          S r   )r   r;   r:   s     r    r   zDNSPointer._eq  s$    ~0ST5L5LU5S5SSr   c                    | j         S )z Hash to compare like DNSPointer.rV   rb   s    r    rc   zDNSPointer.__hash__  r   r   c                6    |                      | j                  S r   )r   r   rb   s    r    rs   zDNSPointer.__repr__  s    ~~dj)))r   r.   )r%   r(   r)   r*   r#   r*   r{   r*   r   r(   rz   r|   r+   r,   )r%   r(   r)   r3   r#   r3   r{   r3   r   r(   rz   r   r+   r,   rt   r   rQ   )r7   r   r+   r8   ru   )r   r   r   r   rR   r2   rY   rv   r   r   r>   r   rc   rs   r   r   r    r   r   g  s        /I !%	[ 	[ 	[ 	[ 	[J J J J 
 
 
 X
# # # #A A A AT T T T   * * * * * *r   r   c                  R    e Zd ZdZdZ	 dddZd dZd!dZd"dZd#dZ	d$dZ
d%dZdS )&DNSTextzA DNS text record)rW   textNr%   r(   r)   r*   r#   r{   r   r   rz   r|   r+   r,   c           	     V    |                      ||||||pt                                 d S r.   r   r1   r%   r)   r#   r{   r   rz   s          r    r2   zDNSText.__init__  s2     	eVS$8XCVCXCXYYYYYr   r3   r   c                    |                      |||||           || _        t          | j        || j        |f          | _        d S r.   )r~   r   r\   r$   r#   rW   r   s          r    rY   zDNSText._fast_init  sG     	tUFCAAA	48UDK>??


r   r   r   c                :    |                     | j                   dS r   )r   r   r   s     r    r   zDNSText.write  s    #####r   c                    | j         S )zHash to compare like DNSText.rV   rb   s    r    rc   zDNSText.__hash__  r   r   r7   r   r8   c                V    t          |t                    o|                     |          S zTests equality on text.)r=   r   r   r:   s     r    r>   zDNSText.__eq__  !    %))=dhhuoo=r   c                L    | j         |j         k    o|                     |          S r   )r   r;   r:   s     r    r   zDNSText._eq  s$    yEJ&I4+B+B5+I+IIr   c                    t          | j                  dk    r%|                     | j        dd                   dz   S |                     | j                  S )rr   r   N   z...)rg   r   r   rb   s    r    rs   zDNSText.__repr__  sJ    ty>>B>>$)BQB-00588~~di(((r   r.   )r%   r(   r)   r*   r#   r*   r{   r*   r   r   rz   r|   r+   r,   )r%   r(   r)   r3   r#   r3   r{   r3   r   r   rz   r   r+   r,   r   rt   rQ   )r7   r   r+   r8   ru   )r   r   r   r   rR   r2   rY   r   rc   r>   r   rs   r   r   r    r   r     s        !I !%	Z 	Z 	Z 	Z 	Z@ @ @ @$ $ $ $   > > > >J J J J) ) ) ) ) )r   r   c                  R    e Zd ZdZdZ	 d d!dZd"dZd#dZd$dZd%dZ	d&dZ
d'dZdS )(
DNSServicezA DNS service record)rW   portpriorityserver
server_keyweightNr%   r(   r)   r*   r#   r{   r  r  r   r  rz   r|   r+   r,   c
                \    |                      |||||||||	pt                      	  	         d S r.   r   
r1   r%   r)   r#   r{   r  r  r   r  rz   s
             r    r2   zDNSService.__init__  sC     	%hfgFfQdQfQf	
 	
 	
 	
 	
r   r3   r   c
           	         |                      |||||	           || _        || _        || _        || _        |                                | _        t          | j        || j	        |||| j        f          | _
        d S r.   )r~   r  r  r   r  r6   r  r\   r$   r#   rW   r  s
             r    rY   zDNSService._fast_init  su     	tUFCAAA 	 ,,..48UDK64QUQ`abb


r   r   r   c                    |                     | j                   |                     | j                   |                     | j                   |                    | j                   dS r   )write_shortr  r  r   r   r  r   s     r    r   zDNSService.write  sX    &&&$$$	"""t{#####r   r7   r   r8   c                V    t          |t                    o|                     |          S )z3Tests equality on priority, weight, port and server)r=   r   r   r:   s     r    r>   zDNSService.__eq__  r   r   c                    | j         |j         k    oD| j        |j        k    o4| j        |j        k    o$| j        |j        k    o|                     |          S )z4Tests equality on priority, weight, port and server.)r  r  r   r  r;   r:   s     r    r   zDNSService._eq   sc     MU^+ /u|+/	UZ'/ 5#33/ ''..	
r   c                    | j         S )z Hash to compare like DNSService.rV   rb   s    r    rc   zDNSService.__hash__
  r   r   c                J    |                      | j         d| j                   S )rr   :)r   r  r   rb   s    r    rs   zDNSService.__repr__  s&    ~~::ty::;;;r   r.   )r%   r(   r)   r*   r#   r*   r{   r*   r  r*   r  r*   r   r*   r  r(   rz   r|   r+   r,   )r%   r(   r)   r3   r#   r3   r{   r3   r  r3   r  r3   r   r3   r  r(   rz   r   r+   r,   r   rQ   )r7   r   r+   r8   rt   ru   r   r   r   r    r   r     s        OI !%
 
 
 
 
 c c c c($ $ $ $A A A A
 
 
 
   < < < < < <r   r   c                  R    e Zd ZdZdZ	 d d!dZd"dZd#dZd$dZd%dZ	d&dZ
d'dZdS )(DNSNseczA DNS NSEC record)rW   	next_namerdtypesNr%   r(   r)   r*   r#   r{   r3   r  r  	list[int]rz   r|   r+   r,   c           
     X    |                      |||||||pt                                 d S r.   r   r1   r%   r)   r#   r{   r  r  rz   s           r    r2   zDNSNsec.__init__  s4     	eVS)WgFfQdQfQfgggggr   
list[_int]r   c                    |                      |||||           || _        t          |          | _        t	          | j        || j        |g| j        R           | _        d S r.   )r~   r  sortedr  r\   r$   r#   rW   r  s           r    rY   zDNSNsec._fast_init$  s^     	tUFCAAA"g48UDKRT\RRSS


r   r   r   c                   t          d          }d}| j        D ];}|dk    rt          d| d          |dz  }|dz   }||xx         d|dz  z	  z  cc<   <|dk    rt          d	          t          |d|                   }|                    | j                   |                    d           |                    t          |                     |                    |           d
S )z(Used in constructing an outgoing packet.s                                    r      zrdtype z is too large for NSEC   r      z"NSEC must have at least one rdtypeN)		bytearrayr  r   r   r   r  _write_byterg   r   )r1   r   bitmaptotal_octetsrdtypebyte	out_bytess          r    r   zDNSNsec.write3  s   :&&l 	1 	1F|| !I6!I!I!IJJJQ;D!8L4LLLDVaZ00LLLL1 ABBB&<011	t~&&&I'''#####r   r7   r   r8   c                V    t          |t                    o|                     |          S z(Tests equality on next_name and rdtypes.)r=   r  r   r:   s     r    r>   zDNSNsec.__eq__G  r   r   c                l    | j         |j         k    o$| j        |j        k    o|                     |          S r%  )r  r  r;   r:   s     r    r   zDNSNsec._eqK  s<     Neo- /-/''..	
r   c                    | j         S )zHash to compare like DNSNSec.rV   rb   s    r    rc   zDNSNsec.__hash__S  r   r   c                                            j        dz   d                     fd j        D                       z             S )rr   r   |c                :    g | ]}                     |          S r   )rF   ).0r)   r1   s     r    
<listcomp>z$DNSNsec.__repr__.<locals>.<listcomp>Z  s%    ,\,\,\eT]]5-A-A,\,\,\r   )r   r  joinr  rb   s   `r    rs   zDNSNsec.__repr__W  sK    ~~NS 388,\,\,\,\t|,\,\,\#]#]]
 
 	
r   r.   )r%   r(   r)   r*   r#   r*   r{   r3   r  r(   r  r  rz   r|   r+   r,   )r%   r(   r)   r3   r#   r3   r{   r3   r  r(   r  r  rz   r   r+   r,   r   rQ   )r7   r  r+   r8   rt   ru   r   r   r   r    r  r    s        1I !%
h 
h 
h 
h 
hT T T T$ $ $ $(> > > >
 
 
 
   
 
 
 
 
 
r   r  c                  N    e Zd ZdZdZddZedd	            ZddZddZ	ddZ
dS )DNSRRSetz2A set of dns records with a lookup to get the ttl._lookup_recordsrecordslist[DNSRecord]r+   r,   c                "    || _         d| _        dS )z"Create an RRset from records sets.N)r2  r1  )r1   r3  s     r    r2   zDNSRRSet.__init__f  s    :>r   dict[DNSRecord, DNSRecord]c                *    |                                  S )zReturn the lookup table.)_get_lookuprb   s    r    lookupzDNSRRSet.lookupk  s     !!!r   set[DNSRecord]c                D    t          |                                           S )z Return the lookup table as aset.)setr8  rb   s    r    
lookup_setzDNSRRSet.lookup_setp  s    4##%%&&&r   c                J    | j         d | j        D             | _         | j         S )z/Return the lookup table, building it if needed.Nc                    i | ]}||S r   r   )r+  r   s     r    
<dictcomp>z(DNSRRSet._get_lookup.<locals>.<dictcomp>x  s    GGGvFFGGGr   r0  rb   s    r    r8  zDNSRRSet._get_lookupt  s)    <GGGGGDL|r   r   
_DNSRecordr8   c                    |                                  }|                    |          }|dS |j        |j        dz  k    S )zdReturns true if any answer in the rrset can suffice for the
        information held in this record.NFr   )r8  rB   r{   )r1   r   r9  r7   s       r    
suppresseszDNSRRSet.suppresses{  sC     !!##

6""=5yFJN++r   N)r3  r4  r+   r,   )r+   r6  )r+   r:  )r   rA  r+   r8   )r   r   r   r   rR   r2   rv   r9  r=  r8  rC  r   r   r    r/  r/  a  s        <<'I? ? ? ?
 " " " X"' ' ' '   , , , , , ,r   r/  )3r   
__future__r   enumr   typingr   r   r   _exceptionsr	   
_utils.netr
   _utils.timer   constr   r   r   r   r   ri   rj   _LEN_INTr   r   r   r   r   r   r   r*   r3   _protocol.incomingr   _protocol.outgoingr   r'   Enumr   r"   rU   r^   r   r   r   r   r   r  rA  r/  r   r   r    <module>rO     s3   , # " " " " "   + + + + + + + + + + 0 0 0 0 0 0 & & & & & & , , , , , , J J J J J J J J J J J J J J	
j(83j@&]   	
 0//////////// 	 	 	 	 	di 	 	 	*
 *
 *
 *
 *
 *
 *
 *
Z2
 2
 2
 2
 2
( 2
 2
 2
jO= O= O= O= O= O= O= O=d>5 >5 >5 >5 >5 >5 >5 >5B-8 -8 -8 -8 -8y -8 -8 -8`4* 4* 4* 4* 4* 4* 4* 4*n+) +) +) +) +)i +) +) +)\D< D< D< D< D< D< D< D<NH
 H
 H
 H
 H
i H
 H
 H
V 
!, !, !, !, !, !, !, !, !, !,r   