
    h              #          U d 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mZmZmZmZ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 Z&d Z'ejP                  jS                  d      Z*e*rUddl+Z,ddl-Z-e,j\                  Z/e,j`                  jb                  jd                  Z3 G d de/      Z4 G d	 d
e-jj                        Z6n
 G d d
      Z6e*Z7dejp                  e9z  dejt                  de9dej                  fdZ;e;Z<eejp                  e9z  ejt                  e9gej                  f   e=d<    G d dej|                  j~                        Z@ G d dej|                  j                        ZB G d dej|                  j~                        ZC G d dej|                  j~                        ZDej                  j                  ZFd ZGd ZHd ZId ZJd ZKd ZL	 d{d!ZM	 d|dejp                  e9z  d"ejt                  d#edz  dej                  fd$ZN	 	 d}dejp                  e9z  d"ejt                  d%e"j                  d&ej                  j                  eRz  dz  d#edz  de"j                  fd'ZTd( ZUd)ed*   dd*fd+ZV G d, d-ej                        ZXdd.ddd/d/dd0d dd dej                  eXj                  fd1ej                  j                  d2eRd3e]dz  d4e9d#eRdz  d5e9d6e^d7e^d8edz  d9eRd:e^d;eRdz  d<e^eRz  e"j                  z  d)ed*   d=e9d>eXdej                  j                  f"d?Z_d@ej                  j                  dAebdebfdBZcd@ej                  j                  dCeRdDebddfdEZd	 	 	 	 	 	 	 	 	 d~d1ej                  j                  d2eRdFeRd3e]dz  d4e9d#eRdz  d5e9d6e^d7e^d<e^eRz  e"j                  z  d:e^dGej                  j                  dz  dej                  j                  fdHZfdI ZgdJ Zh	 d|dKedLej                  j                  ebz  dMedNe]dz  dee9e]f   f
dOZi	 	 	 	 	 	 	 	 	 	 ddKedMedz  dNe]dz  dPe^d6e^dQeej                  j                  ej                  j                  f   dz  dRebdz  d7e^dSe^dTe^dUej                  j                  dz  defdVZl	 	 	 	 	 	 	 	 	 	 dd1ej                  j                  d2eRd3e]dz  d4e9d#eRdz  d5e9dPe^d6e^d7e^dSe^dKedz  dTe^dej                  j                  fdXZm	 	 	 	 	 	 	 	 	 	 dd1ej                  j                  d2eRd3e]dz  d4e9d#eRdz  d5e9dPe^d6e^d7e^dYedz  dZedz  dTe^deej                  j                  e^f   fd[Znd\ Zod] Zp	 d|dKedLej                  j                  ebz  dNe]dz  dee9e]f   fd^Zq	 	 	 	 	 ddKedNe]dz  d6e^dQeej                  j                  ej                  j                  f   dz  dRebdz  d7e^deej                  j                  e]f   fd_Zrd` Zs	 	 	 	 	 	 	 dd1ej                  j                  d2eRd3e]dz  d4e9d#eRdz  d5e9d6e^d7e^dKedz  dej                  j                  fdaZtdb Zu	 	 	 dd<e^eRz  dce^ddeveR   dz  de"j                  fdeZwd&eRdz  d<e^eRz  de"j                  fdfZx	 	 	 	 	 	 	 	 	 	 dd1ej                  j                  d2eRd3e]dz  d4e9d#eRdz  d5e9d6e^d7e^dKe"j                  dz  d%e"j                  dz  d&eRdz  d<e^eRz  dej                  j                  fdgZy	 	 	 	 	 	 	 	 	 	 dd1ej                  j                  d2eRd3e]dz  d4e9d#eRdz  d5e9d6e^d7e^dGej                  j                  dz  d<e^eRz  dheRdz  d&eRdz  dej                  j                  fdiZ` G dj dkej                        Zzdlej                  j                  dmej                  e"j                  z  dUej                  j                  dne9dz  d3e]dz  dNe]dz  defdoZ}ej                  j                  ej                   j                  ddWddd ddddd/ej                  j                  fd2eRdpej                  j                  eRz  dqej                  j                  eRz  drej                   j                  eRz  d3e]dz  d4e9dQeej                  j                  ej                  j                  f   dz  dsej                  j                  eRz  dz  dte^due]dz  d#eRdz  d5e9dne9dve^dwej                  j                  eRz  def dxZEddWddddezj
                  fd2eRdlej                  j                  dUej                  j                  dz  d4e9d3e]dz  due]dz  d#eRdz  d5e9dyezddfdzZy# e#$ r
 ddl$m%Z" Y 		w xY w)zTalk to a DNS server.    N)AnyCallableDictOptionalTuplecastc                 x    | y | t        j                          z
  }|dk  rt        j                  j                  |S )N        )timedns	exceptionTimeout)
expirationtimeouts     G/var/www/html/eduruby.in/venv/lib/python3.12/site-packages/dns/query.py
_remainingr   5   s7    499;&G#~mm###N    c                 J    |y t        t        j                         | z   |      S N)minr   )r   r   s     r   _expiration_for_this_attemptr   >   s#    tyy{W$j11r   dohc                   2     e Zd Z fdZ	 ddZ	 ddZ xZS )_NetworkBackendc                 Z    t         |           || _        || _        || _        || _        y r   )super__init___local_port	_resolver_bootstrap_address_family)selfresolver
local_portbootstrap_addressfamily	__class__s        r   r   z_NetworkBackend.__init__M   s,    G)D%DN&7D#!DLr   c                 t   g }t        |      \  }}t        j                  j                  |      r|j	                  |       n| j
                  |j	                  | j
                         nft        |      }| j                  }	|rt        j                  j                  |      }	| j                  j                  ||	|      }
|
j                         }|D ]  }t        j                  j                  |      }|| j                  dk7  r1|d}t        j                  j                  || j                  f|      }nd }	 t        |t        j                   |      }t#        d|      }t%        |t        j                  j                  ||f|      |       t'        |      c S  t*        j,                  # t(        $ r Y w xY w)N)r&   lifetimer   z0.0.0.0g       @)_compute_timesr   inet
is_addressappendr    r   r!   af_for_addressr   resolve_name	addressesr   low_level_address_tuplemake_socketsocketSOCK_STREAMr   _connect_CoreSyncStream	ExceptionhttpcoreConnectError)r"   hostportr   local_addresssocket_optionsr0   _r   r&   answersaddressafsourcesockattempt_expirations                   r   connect_tcpz_NetworkBackend.connect_tcpT   s    I*73MAzxx""4(  &((4  !8!89$Z0  XX44]CF..55' 6  $--/	$ XX,,W5 ,0@0@A0E$,(1 XX==&(8(892F "F
&r6+=+=vFD)Ec:)V&88'4"M*
 +400%* ''' ! s   9AF++	F76F7c                     t         r   NotImplementedError)r"   pathr   r=   s       r   connect_unix_socketz#_NetworkBackend.connect_unix_socket}   s
     &%r   )NNNNN)__name__
__module____qualname__r   rE   rJ   __classcell__r'   s   @r   r   r   L   s    	" PT'	(T 6:	&r   r   c                   >     e Zd Zdddej                  d fd
Z xZS )_HTTPTransportr   Nr$   r%   r#   r&   c                    | |dd l }|j                  j                         }t        |   |i | t        ||||      | j                  _        y Nr   )dns.resolverr#   Resolverr   r   r   _pool_network_backend)	r"   r$   r%   r#   r&   argskwargsr   r'   s	           r   r   z_HTTPTransport.__init__   sS     $5$=#<<002Gd-f-*9*&7+DJJ'r   )rL   rM   rN   r3   	AF_UNSPECr   rO   rP   s   @r   rR   rR      s!     "##	 	r   rR   c                   8    e Zd Zdddej                  ddZd Zy)rR   r   NrS   c                     y r    )r"   r$   r%   r#   r&   rZ   r[   s          r   r   z_HTTPTransport.__init__   s     r   c                     t         r   rG   )r"   r:   r;   r   r<   s        r   rE   z_HTTPTransport.connect_tcp       %%r   )rL   rM   rN   r3   r\   r   rE   r_   r   r   rR   rR      s      "##			&r   rA   kindprotoreturnc                 0    t        j                   | ||      S r   )r3   )rA   rb   rc   s      r   default_socket_factoryrf      s    
 ==T5))r   socket_factoryc                       e Zd ZdZy)UnexpectedSourcez=A DNS query response came from an unexpected address or port.NrL   rM   rN   __doc__r_   r   r   ri   ri      s    Gr   ri   c                       e Zd ZdZy)BadResponsez<A DNS query response does not respond to the question asked.Nrj   r_   r   r   rm   rm      s    Fr   rm   c                       e Zd ZdZy)NoDOHzMDNS over HTTPS (DOH) was requested but the httpx module is not
    available.Nrj   r_   r   r   ro   ro          r   ro   c                       e Zd ZdZy)NoDOQzNDNS over QUIC (DOQ) was requested but the aioquic module is not
    available.Nrj   r_   r   r   rr   rr      rp   r   rr   c                 D    t        j                          }| |d fS ||| z   fS r   )r   )r   nows     r   r*   r*      s+    
))+CT{S7]##r   c                    |r.t        | t        j                        r| j                         dkD  ryt	        j
                         5 }d}|r|t        j                  z  }|r|t        j                  z  }|r|j                  | |       |d }n6|t        j                         z
  }|dk  rt        j                  j                  |j                  |      st        j                  j                  	 d d d        y # 1 sw Y   y xY w)Nr   Tr
   )
isinstancessl	SSLSocketpending	selectorsDefaultSelector
EVENT_READEVENT_WRITEregisterr   r   r   r   select)fdreadablewritabler>   r   seleventsr   s           r   	_wait_forr      s     Jr3==1bjjlQ6F		"	"	$ (i***Fi+++FLLV$G 499;.G#~mm+++zz'"--''' #( ( (s   B'C66C?c                 "    t        | ddd|       y )NTFr   sr   s     r   _wait_for_readabler      s    audJ/r   c                 "    t        | ddd|       y )NFTr   r   s     r   _wait_for_writabler      s    adJ/r   c                     	 t         j                  j                  | |d         }t         j                  j                  | |d         }||k(  xr |dd  |dd  k(  S # t         j                  j                  $ r Y yw xY w)Nr   F   )r   r+   	inet_ptonr   SyntaxError)rA   a1a2n1n2s        r   _addresses_equalr      s{    XXBqE*XXBqE* 8(12"QR&(( ==$$ s   AA A:9A:c                     |syt        | ||      s-t        j                  j                  |d         r|dd  |dd  k(  ry|ryt	        d| d|       )NTr   r   Fzgot a response from z instead of )r   r   r+   is_multicastri   )rA   from_addressdestinationignore_unexpecteds       r   _matches_destinationr     sh     L+6k!n-,qr2BkRSRTo2U	

|nL[MJ r   Tc                    d }d }	 t         j                  j                  |       }| }|r3t         j                  j                  |      }|r||k7  rt	        d      |}|r"|s 	 t         j                  j                  |      }|r"t         j                  j                  ||f|      }|r"t         j                  j                  ||f|      }|||fS # t        $ r |r Y w xY w# t        $ r t	        d      w xY w)Nz5different address families for source and destinationz3source_port specified but address family is unknown)r   r+   r.   r7   
ValueError
any_for_afr1   )wherer;   rB   source_portwhere_must_be_addressrA   r   safs           r   _destination_and_sourcer     s
   
 
BKXX$$U+
 hh%%f-by K  B6	TXX((,F hh66T7JBO116;2GLV$$?    !,  	TRSS	Ts   !C !C CCC4typerB   c                     t        | |d      }	 |j                  d       ||j                  |       |S # t        $ r |j	                           w xY w)aQ  Make a socket.

    This function uses the module's ``socket_factory`` to make a socket of the
    specified address family and type.

    *af*, a ``socket.AddressFamily`` or ``int`` is the address family, either
    ``socket.AF_INET`` or ``socket.AF_INET6``.

    *type*, a ``socket.SocketKind`` is the type of socket, e.g. ``socket.SOCK_DGRAM``,
    a datagram socket, or ``socket.SOCK_STREAM``, a stream socket.  Note that the
    ``proto`` attribute of a socket is always zero with this API, so a datagram socket
    will always be a UDP socket, and a stream socket will always be a TCP socket.

    *source* is the source address and port to bind to, if any.  The default is
    ``None`` which will bind to the wildcard address and a randomly chosen port.
    If not ``None``, it should be a (low-level) address tuple appropriate for *af*.
    r   F)rg   setblockingbindr7   close)rA   r   rB   r   s       r   r2   r2   D  sT    , 	r4#A	eFF6N 		s	   %5 Assl_contextserver_hostnamec                     t        | ||      }t        |t        j                  j                        r|j                         }|j                  |d|      S )a  Make a socket.

    This function uses the module's ``socket_factory`` to make a socket of the
    specified address family and type.

    *af*, a ``socket.AddressFamily`` or ``int`` is the address family, either
    ``socket.AF_INET`` or ``socket.AF_INET6``.

    *type*, a ``socket.SocketKind`` is the type of socket, e.g. ``socket.SOCK_DGRAM``,
    a datagram socket, or ``socket.SOCK_STREAM``, a stream socket.  Note that the
    ``proto`` attribute of a socket is always zero with this API, so a datagram socket
    will always be a UDP socket, and a stream socket will always be a TCP socket.

    If *ssl_context* is not ``None``, then it specifies the SSL context to use,
    typically created with ``make_ssl_context()``.

    If *server_hostname* is not ``None``, then it is the hostname to use for server
    certificate validation.  A valid hostname must be supplied if *ssl_context*
    requires hostname checking.

    *source* is the source address and port to bind to, if any.  The default is
    ``None`` which will bind to the wildcard address and a randomly chosen port.
    If not ``None``, it should be a (low-level) address tuple appropriate for *af*.
    F)do_handshake_on_connectr   )r2   rv   r   nameNameto_textwrap_socket)rA   r   r   r   rB   rC   s         r   make_ssl_socketr   e  sS    > r4(D/388==1)113"" %' #  r   c                 >    |t        | ||||      S t        | ||      S r   )r   r2   )rA   r   rB   r   r   s        r   _make_socketr     s,     r4ovNN2tV,,r   r#   zdns.resolver.Resolverc                 F    | dd l }|j                  j                         } | S rU   )rV   r#   rW   )r#   r   s     r   _maybe_get_resolverr     s$     <<((*Or   c                   ,    e Zd ZdZdZdZdZdZdZdZ	dZ
y)HTTPVersionzWhich version of HTTP should be used?

    DEFAULT will select the first version from the list [2, 1.1, 3] that
    is available.
    r   r         N)rL   rM   rN   rk   DEFAULTHTTP_1H1HTTP_2H2HTTP_3H3r_   r   r   r   r     s,     GF	
BF	
BF	
Br   r     Fz
/dns-queryqr   r   r;   r   one_rr_per_rrsetignore_trailingsessionrI   postr%   verifyr&   http_versionc                 H   t        ||||d      \  }}}|}|Zt        j                  j                  |      r;|t        j
                  k(  rd| d| |	 }n|t        j                  k(  r
d| d| |	 }i }|t        j                  j                  |      }|j                  t        d      t        j                  j                  |j                        r|j                  }|j                  |d<   |j                  |j                  }|t        j                  k(  s|t        j                  k(  rt         s|at#        |      }j                  J |j%                  |j                  |      }t'        j(                  t+        |j-                                     }|r/t/        |t        j0                  j2                        st        d	      t5        | ||||||||||
|
      S t         st6        |r%t/        |t8        j:                        st        d      | j=                         }ddi}|t        j>                  t        j                  fv }|t        j@                  t        j                  fv }|d}d}n
|d   }|d   }|rtC        jD                  |      }n,tG        ||||||||      }t9        j:                  ||||      }|5 }|J |
r=|jI                  dtK        tM        |            d       |jO                  |||||      }nLtQ        jR                  |      jU                  d      }|jW                         } |jY                  |||d| i|      }ddd       jZ                  dk  s|jZ                  dkD  r't        | d|jZ                   d|j\                         t        j^                  ja                  |j\                  | jb                  | jd                  ||      }!|jf                  ji                         |!_5        | jm                  |!      stn        |!S # 1 sw Y   xY w)a	  Return the response obtained after sending a query via DNS-over-HTTPS.

    *q*, a ``dns.message.Message``, the query to send.

    *where*, a ``str``, the nameserver IP address or the full URL. If an IP address is
    given, the URL will be constructed using the following schema:
    https://<IP-address>:<port>/<path>.

    *timeout*, a ``float`` or ``None``, the number of seconds to wait before the query
    times out. If ``None``, the default, wait forever.

    *port*, a ``int``, the port to send the query to. The default is 443.

    *source*, a ``str`` containing an IPv4 or IPv6 address, specifying the source
    address.  The default is the wildcard address.

    *source_port*, an ``int``, the port from which to send the message. The default is
    0.

    *one_rr_per_rrset*, a ``bool``. If ``True``, put each RR into its own RRset.

    *ignore_trailing*, a ``bool``. If ``True``, ignore trailing junk at end of the
    received message.

    *session*, an ``httpx.Client``.  If provided, the client session to use to send the
    queries.

    *path*, a ``str``. If *where* is an IP address, then *path* will be used to
    construct the URL to send the DNS query to.

    *post*, a ``bool``. If ``True``, the default, POST method will be used.

    *bootstrap_address*, a ``str``, the IP address to use to bypass resolution.

    *verify*, a ``bool`` or ``str``.  If a ``True``, then TLS certificate verification
    of the server is done using the default CA bundle; if ``False``, then no
    verification is done; if a `str` then it specifies the path to a certificate file or
    directory which will be used for verification.

    *resolver*, a ``dns.resolver.Resolver`` or ``None``, the resolver to use for
    resolution of hostnames in URLs.  If not specified, a new resolver with a default
    configuration will be used; note this is *not* the default resolver as that resolver
    might have been configured to use DoH causing a chicken-and-egg problem.  This
    parameter only has an effect if the HTTP library is httpx.

    *family*, an ``int``, the address family.  If socket.AF_UNSPEC (the default), both A
    and AAAA records will be retrieved.

    *http_version*, a ``dns.query.HTTPVersion``, indicating which HTTP version to use.

    Returns a ``dns.message.Message``.
    FNzhttps://:z	https://[z]:zno hostname in URLsni_hostnamez8session parameter must be a dns.quic.SyncQuicConnection.)r   r   
connectionz)session parameter must be an httpx.Clientacceptzapplication/dns-messager   r   )r<   http1http2r   r$   r%   r#   r&   )r   r   r   	transport)zcontent-typezcontent-length)headerscontentr   
extensions   =r   )r   r   paramsr      +   responded with status code z
Response body: keyringrequest_macr   r   )8r   r   r+   r,   r3   AF_INETAF_INET6urllibparseurlparsehostnamer   r;   r   r   r   have_dohr   r/   randomchoicelistr0   rv   quicSyncQuicConnection_http3ro   httpxClientto_wirer   r   
contextlibnullcontextrR   updatestrlenr   base64urlsafe_b64encoderstripdecodegetstatus_coder   message	from_wirer   r   elapsedtotal_secondsr   is_responserm   )"r   r   r   r;   rB   r   r   r   r   rI   r   r%   r   r#   r&   r   rA   r>   
the_sourceurlr   parsedr?   wirer   h1h2r<   r$   cmr   responsetwirers"                                     r   httpsr    s   N 2tV[%RJ C	~#((--e4UG1TF4&1C6??"eWBtfTF3CJ &&s+??"12288v/ &)/J~&;;";;D{~~%+++H$*84H??...++FOOVDG &d73D3D3F.G H:SXX00
 WXX
 	
 z'5<<8DEE99;D23G	+..+*=*=>	>B	+..+*=*=>	>B 
"1]
0:0F0Fw0O"'!/	
	 \\Bv
 
 w """NN$=&)#d)n ||% $ H ++D188>DKKME{{u~% # H+> c!X%9%9C%?g1(2F2F1G 0 013
 	
 			MM)' 	 	A ++-AF==H] s   BPP!r   r   c                 D    | t         | D ]  \  }}||k(  s|c S  t         r   )KeyError)r   r   headervalues       r   _find_headerr    s2      T>L Nr   peerr   c                 
   t        | d      }|t        d      t        |      }|dk  rt        d      |dk  s|dkD  r6d}t        |      dkD  r	 d|j	                         z   }t        | d	| |       y # t
        $ r Y w xY w)
Ns   :statuszno :status header in responser   zstatus is negativer   r    z: r   )r  r   intr   r   r7   r   )r   r  r   r
  statuserrors         r   _check_statusr    s    *-E}9::ZFz.//|v|t9q=t{{}, D6!=fXeWMNN $
  s   A6 6	BBr   r   c                    t         j                  j                  st        d      t        j
                  j                  |      }|j                  }|J |j                  |j                  }d| _	        | j                         }|rt        j                  d       }n$t         j                  j                  |	|d      }|}|5  |r|}nj                  ||||      }t        |      \  }}|j!                  |      5 }|j#                  |||
       |j%                  t'        |            }t)        |j+                         ||       d d d        t-        j,                         }d d d        t         j.                  j1                  || j2                  | j4                  ||      }t7        z
  d      |_        | j9                  |      st:        |S # 1 sw Y   xY w# 1 sw Y   zxY w)Nz DNS-over-HTTP3 is not available.r   T)verify_modeserver_nameh3r   r
   )r   r   	have_quicro   r   r   r   r   r;   idr   r   r   SyncQuicManagerconnectr*   make_streamsend_h3receiver   r  r   r   r   r   r   r   maxr   rm   )r   r   r   r   r;   rB   r   r   r   r   r   r   	url_partsr   r   managerthe_managerthe_connectionstartr   streamfinishr  s                          r   r   r     s    88677%%c*I!!H~~!~~AD99;D 5?5K5KD5Q((**H + 
 	 'N(00tV[N -W5
''0 	9FNN3d+>>*Z"89D&..*E48	9  			MM)' 	 	A %%AF==H	9 	9 s%   9G;A	GGG	GG"c                 `    	 	 | j                  |      S # t        $ r t        | |       Y nw xY w.)zReads a datagram from the socket.
    A Timeout exception will be raised if the operation is not completed
    by the expiration time.
    )recvfromBlockingIOErrorr   )rC   max_sizer   s      r   	_udp_recvr*    s9    
 	1==** 	1tZ0	1 s    ,,c                     	 	 |r| j                  ||      S | j                  |      S # t        $ r t        | |       Y nw xY wB)zSends the specified datagram to destination over the socket.
    A Timeout exception will be raised if the operation is not completed
    by the expiration time.
    )sendtosendr(  r   )rC   datar   r   s       r   	_udp_sendr/    sL    
 	1{{455yy& 	1tZ0	1 s   ( ( A A rC   whatr   r   c                     t        |t        j                  j                        r|j	                         }t        j
                         }t        | |||      }||fS )a  Send a DNS message to the specified UDP socket.

    *sock*, a ``socket``.

    *what*, a ``bytes`` or ``dns.message.Message``, the message to send.

    *destination*, a destination tuple appropriate for the address family
    of the socket, specifying where to send the query.

    *expiration*, a ``float`` or ``None``, the absolute time at which
    a timeout exception should be raised.  If ``None``, no timeout will
    occur.

    Returns an ``(int, float)`` tuple of bytes sent and the sent time.
    )rv   r   r   Messager   r   r/  )rC   r0  r   r   	sent_timens         r   send_udpr5    sH    , $++,||~		I$k:6Ay>r   r   r   r   raise_on_truncationignore_errorsqueryc                    d}	 t        | d|      \  }}t        | j                  |||      s*t        j                         }	 t        j
                  j                  ||||||      }|	r|
|
j                  |      sz|r||fS |||fS # t        j
                  j                  $ r.}|	r&|
$|
j                  |j                               sY d}~ʂ d}~wt        $ r |	rY ۂ w xY w)a  Read a DNS message from a UDP socket.

    *sock*, a ``socket``.

    *destination*, a destination tuple appropriate for the address family
    of the socket, specifying where the message is expected to arrive from.
    When receiving a response, this would be where the associated query was
    sent.

    *expiration*, a ``float`` or ``None``, the absolute time at which
    a timeout exception should be raised.  If ``None``, no timeout will
    occur.

    *ignore_unexpected*, a ``bool``.  If ``True``, ignore responses from
    unexpected sources.

    *one_rr_per_rrset*, a ``bool``.  If ``True``, put each RR into its own
    RRset.

    *keyring*, a ``dict``, the keyring to use for TSIG.

    *request_mac*, a ``bytes`` or ``None``, the MAC of the request (for TSIG).

    *ignore_trailing*, a ``bool``.  If ``True``, ignore trailing
    junk at end of the received message.

    *raise_on_truncation*, a ``bool``.  If ``True``, raise an exception if
    the TC bit is set.

    Raises if the message is malformed, if network errors occur, of if
    there is a timeout.

    If *destination* is not ``None``, returns a ``(dns.message.Message, float)``
    tuple of the received message and the received time.

    If *destination* is ``None``, returns a
    ``(dns.message.Message, float, tuple)``
    tuple of the received message, the received time, and the address where
    the message arrived from.

    *ignore_errors*, a ``bool``.  If various format errors or response
    mismatches occur, ignore them and keep listening for a valid response.
    The default is ``False``.

    *query*, a ``dns.message.Message`` or ``None``.  If not ``None`` and
    *ignore_errors* is ``True``, check that the received message is a response
    to this query, and if not keep listening for a valid response.
    r     )r   r   r   r   r6  N)
r*  r   r&   r   r   r   r   	Truncatedr   r7   )rC   r   r   r   r   r   r   r   r6  r7  r8  r   r   received_timer  es                   r   receive_udpr>    s    | D
(ujA|#KK{4E
 			%%'!1 /$7 & A6 U.u7H7H7K}%%}l331 {{$$ 	 %))!))+6 			s$   %B C %#CCC C 5   c                    | j                         }t        ||||d      \  }}}t        |      \  }}|
rt        j                  |
      }n|J t        |t        j                  |      }|5 }t        ||||       t        |||||| j                  | j                  ||	||       \  }}||z
  |_        |s| j                  |      st        |cddd       S # 1 sw Y   nxY w	 J )a  Return the response obtained after sending a query via UDP.

    *q*, a ``dns.message.Message``, the query to send

    *where*, a ``str`` containing an IPv4 or IPv6 address,  where
    to send the message.

    *timeout*, a ``float`` or ``None``, the number of seconds to wait before the
    query times out.  If ``None``, the default, wait forever.

    *port*, an ``int``, the port send the message to.  The default is 53.

    *source*, a ``str`` containing an IPv4 or IPv6 address, specifying
    the source address.  The default is the wildcard address.

    *source_port*, an ``int``, the port from which to send the message.
    The default is 0.

    *ignore_unexpected*, a ``bool``.  If ``True``, ignore responses from
    unexpected sources.

    *one_rr_per_rrset*, a ``bool``.  If ``True``, put each RR into its own
    RRset.

    *ignore_trailing*, a ``bool``.  If ``True``, ignore trailing
    junk at end of the received message.

    *raise_on_truncation*, a ``bool``.  If ``True``, raise an exception if
    the TC bit is set.

    *sock*, a ``socket.socket``, or ``None``, the socket to use for the
    query.  If ``None``, the default, a socket is created.  Note that
    if a socket is provided, it must be a nonblocking datagram socket,
    and the *source* and *source_port* are ignored.

    *ignore_errors*, a ``bool``.  If various format errors or response
    mismatches occur, ignore them and keep listening for a valid response.
    The default is ``False``.

    Returns a ``dns.message.Message``.
    TN)r   r   r*   r   r   r2   r3   
SOCK_DGRAMr5  r>  r   macr   r   rm   )r   r   r   r;   rB   r   r   r   r   r6  rC   r7  r   rA   r   
begin_timer   r  r   r  r<  s                        r   udprD    s   p 99;D 7tV[$!Rf  .g6Z0:0F0Ft0L~~V..7	 qD+z2(IIEE
M + q!1)  , 	s   +ACCudp_socktcp_sockc                     	 t        | ||||||||d|	|      }|dfS # t        j                  j                  $ r t	        | ||||||||
	      }|dfcY S w xY w)a|  Return the response to the query, trying UDP first and falling back
    to TCP if UDP results in a truncated response.

    *q*, a ``dns.message.Message``, the query to send

    *where*, a ``str`` containing an IPv4 or IPv6 address,  where to send the message.

    *timeout*, a ``float`` or ``None``, the number of seconds to wait before the query
    times out.  If ``None``, the default, wait forever.

    *port*, an ``int``, the port send the message to.  The default is 53.

    *source*, a ``str`` containing an IPv4 or IPv6 address, specifying the source
    address.  The default is the wildcard address.

    *source_port*, an ``int``, the port from which to send the message. The default is
    0.

    *ignore_unexpected*, a ``bool``.  If ``True``, ignore responses from unexpected
    sources.

    *one_rr_per_rrset*, a ``bool``.  If ``True``, put each RR into its own RRset.

    *ignore_trailing*, a ``bool``.  If ``True``, ignore trailing junk at end of the
    received message.

    *udp_sock*, a ``socket.socket``, or ``None``, the socket to use for the UDP query.
    If ``None``, the default, a socket is created.  Note that if a socket is provided,
    it must be a nonblocking datagram socket, and the *source* and *source_port* are
    ignored for the UDP query.

    *tcp_sock*, a ``socket.socket``, or ``None``, the connected socket to use for the
    TCP query.  If ``None``, the default, a socket is created.  Note that if a socket is
    provided, it must be a nonblocking connected stream socket, and *where*, *source*
    and *source_port* are ignored for the TCP query.

    *ignore_errors*, a ``bool``.  If various format errors or response mismatches occur
    while listening for UDP, ignore them and keep listening for a valid response. The
    default is ``False``.

    Returns a (``dns.message.Message``, tcp) tuple where tcp is ``True`` if and only if
    TCP was used.
    TF)rD  r   r   r;  tcp)r   r   r   r;   rB   r   r   r   r   rE  rF  r7  r  s                r   udp_with_fallbackrI    s    r 
 %  ;;    

 $ s    4AAc                     d}|dkD  r;	 | j                  |      }|dk(  rt        d      |t        |      z  }||z  }|dkD  r;|S # t        t        j
                  f$ r t        | |       Y /t        j                  $ r t        | |       Y Ow xY w)zRead the specified number of bytes from sock.  Keep trying until we
    either get the desired amount, or we hit EOF.
    A Timeout exception will be raised if the operation is not completed
    by the expiration time.
    r   r   EOF)	recvEOFErrorr   r(  rw   SSLWantReadErrorr   SSLWantWriteErrorr   )rC   countr   r   r4  s        r   	_net_readrQ  7  s     	A
!)		1		% ACxuo%SVOEFA !) H	  !5!56 	1tZ0$$ 	1tZ0	1s   4A %B,BBc                     d}t        |      }||k  r	 || j                  ||d       z  }||k  ryy# t        t        j                  f$ r t        | |       Y /t        j                  $ r t        | |       Y Ow xY w)zWrite the specified data to the socket.
    A Timeout exception will be raised if the operation is not completed
    by the expiration time.
    r   N)r   r-  r(  rw   rO  r   rN  r   )rC   r.  r   currentls        r   
_net_writerU  L  s~    
 GD	A
A+	1tyygh00G A+  !6!67 	1tZ0## 	1tZ0	1s   3 %A;A;:A;c                    t        |t        j                  j                        r|j	                  d      }nt        |      j                  dd      |z   }t        j                         }t        | ||       t        |      |fS )a{  Send a DNS message to the specified TCP socket.

    *sock*, a ``socket``.

    *what*, a ``bytes`` or ``dns.message.Message``, the message to send.

    *expiration*, a ``float`` or ``None``, the absolute time at which
    a timeout exception should be raised.  If ``None``, no timeout will
    occur.

    Returns an ``(int, float)`` tuple of bytes sent and the sent time.
    T)prepend_lengthr   big)	rv   r   r   r2  r   r   to_bytesr   rU  )rC   r0  r   tcpmsgr3  s        r   send_tcpr[  \  sk    $ $++,T2
 T##Au-4		ItVZ(K##r   c                     t        | d|      }t        j                  d|      \  }t        | ||      }t        j                         }	t        j
                  j                  |||||      }
|
|	fS )a  Read a DNS message from a TCP socket.

    *sock*, a ``socket``.

    *expiration*, a ``float`` or ``None``, the absolute time at which
    a timeout exception should be raised.  If ``None``, no timeout will
    occur.

    *one_rr_per_rrset*, a ``bool``.  If ``True``, put each RR into its own
    RRset.

    *keyring*, a ``dict``, the keyring to use for TSIG.

    *request_mac*, a ``bytes`` or ``None``, the MAC of the request (for TSIG).

    *ignore_trailing*, a ``bool``.  If ``True``, ignore trailing
    junk at end of the received message.

    Raises if the message is malformed, if network errors occur, of if
    there is a timeout.

    Returns a ``(dns.message.Message, float)`` tuple of the received message
    and the received time.
    r   !Hr   )rQ  structunpackr   r   r   r   )rC   r   r   r   r   r   ldatarT  r   r<  r  s              r   receive_tcpra  z  ss    B dAz*E==u%DQT1j)DIIKM)' 	 	A }r   c                 P   | j                  |      }|dk(  ry |t        j                  t        j                  t        j                  fv r:t        | |       | j                  t        j                  t        j                        }|dk7  rt        |t        j                  |            y rU   )
connect_exerrnoEINPROGRESSEWOULDBLOCKEALREADYr   
getsockoptr3   
SOL_SOCKETSO_ERROROSErrorosstrerror)r   r@   r   errs       r   r5   r5     s    
,,w
C
ax
u  %"3"3U^^DD1j)ll6,,foo>
axc2;;s+,, r   c	           	         | j                         }	t        |      \  }
}|rt        j                  |      }n2t	        ||||d      \  }}}|J t        |t        j                  |      }|5 }|st        ||       t        ||	|       t        |||| j                  | j                  |      \  }}||
z
  |_        | j                  |      st        |cddd       S # 1 sw Y   nxY w	 J )a  Return the response obtained after sending a query via TCP.

    *q*, a ``dns.message.Message``, the query to send

    *where*, a ``str`` containing an IPv4 or IPv6 address, where
    to send the message.

    *timeout*, a ``float`` or ``None``, the number of seconds to wait before the
    query times out.  If ``None``, the default, wait forever.

    *port*, an ``int``, the port send the message to.  The default is 53.

    *source*, a ``str`` containing an IPv4 or IPv6 address, specifying
    the source address.  The default is the wildcard address.

    *source_port*, an ``int``, the port from which to send the message.
    The default is 0.

    *one_rr_per_rrset*, a ``bool``.  If ``True``, put each RR into its own
    RRset.

    *ignore_trailing*, a ``bool``.  If ``True``, ignore trailing
    junk at end of the received message.

    *sock*, a ``socket.socket``, or ``None``, the connected socket to use for the
    query.  If ``None``, the default, a socket is created.  Note that
    if a socket is provided, it must be a nonblocking connected stream
    socket, and *where*, *port*, *source* and *source_port* are ignored.

    Returns a ``dns.message.Message``.
    TN)r   r*   r   r   r   r2   r3   r4   r5   r[  ra  r   rB  r   r   rm   )r   r   r   r;   rB   r   r   r   rC   r   rC  r   r  rA   r   r   r  r<  s                     r   rH  rH    s    V 99;D-g6Z0:0F0Ft0L$;4d%
![& ~~V//8	 qQZ0D*%(z+QYY
M +}}Q   	s   +A&CC$c                     	 	 | j                          y # t        j                  $ r t        | |       Y n$t        j                  $ r t        | |       Y nw xY wXr   )do_handshakerw   rN  r   rO  r   r   s     r   _tls_handshakerr    sS    
	.NN## 	.q*-$$ 	.q*-	. s    AAAcheck_hostnamealpnsc                    t         j                  j                  |       \  }}t        j                  ||      }t        j
                  j                  |_        ||_        | du rt        j                  |_
        ||j                  |       |S )aQ  Make an SSL context

    If *verify* is ``True``, the default, then certificate verification will occur using
    the standard CA roots.  If *verify* is ``False``, then certificate verification will
    be disabled.  If *verify* is a string which is a valid pathname, then if the
    pathname is a regular file, the CA roots will be taken from the file, otherwise if
    the pathname is a directory roots will be taken from the directory.

    If *check_hostname* is ``True``, the default, then the hostname of the server must
    be specified when connecting and the server's certificate must authorize the
    hostname.  If ``False``, then hostname checking is disabled.

    *aplns* is ``None`` or a list of TLS ALPN (Application Layer Protocol Negotiation)
    strings to use in negotiation.  For DNS-over-TLS, the right value is `["dot"]`.
    )cafilecapathF)r   	_tls_util#convert_verify_to_cafile_and_capathrw   create_default_context
TLSVersionTLSv1_2minimum_versionrs  	CERT_NONEr  set_alpn_protocols)r   rs  rt  rv  rw  r   s         r   make_ssl_contextr    sw    ( ]]FFvNNFF,,F6JK #&.."8"8K!/K"%--&&u-r   c                 "    t        || d udg      S )Ndot)r  )r   r   s     r   _make_dot_ssl_contextr  '  s     FO4$?%IIr   c                    |rt        | ||||||||	      S | j                         }t        |      \  }}t        ||||d      \  }}}|J |	t	        ||
dudg      }	t        |t        j                  |	|
|      5 }t        |||       t        ||       t        |||       t        |||| j                  | j                  |      \  }}||z
  |_        | j                  |      st         |cddd       S # 1 sw Y   nxY w	 J )ak  Return the response obtained after sending a query via TLS.

    *q*, a ``dns.message.Message``, the query to send

    *where*, a ``str`` containing an IPv4 or IPv6 address,  where
    to send the message.

    *timeout*, a ``float`` or ``None``, the number of seconds to wait before the
    query times out.  If ``None``, the default, wait forever.

    *port*, an ``int``, the port send the message to.  The default is 853.

    *source*, a ``str`` containing an IPv4 or IPv6 address, specifying
    the source address.  The default is the wildcard address.

    *source_port*, an ``int``, the port from which to send the message.
    The default is 0.

    *one_rr_per_rrset*, a ``bool``.  If ``True``, put each RR into its own
    RRset.

    *ignore_trailing*, a ``bool``.  If ``True``, ignore trailing
    junk at end of the received message.

    *sock*, an ``ssl.SSLSocket``, or ``None``, the socket to use for
    the query.  If ``None``, the default, a socket is created.  Note
    that if a socket is provided, it must be a nonblocking connected
    SSL stream socket, and *where*, *port*, *source*, *source_port*,
    and *ssl_context* are ignored.

    *ssl_context*, an ``ssl.SSLContext``, the context to use when establishing
    a TLS connection. If ``None``, the default, creates one with the default
    configuration.

    *server_hostname*, a ``str`` containing the server's hostname.  The
    default is ``None``, which means that no hostname is known, and if an
    SSL context is created, hostname checking will be disabled.

    *verify*, a ``bool`` or ``str``.  If a ``True``, then TLS certificate verification
    of the server is done using the default CA bundle; if ``False``, then no
    verification is done; if a `str` then it specifies the path to a certificate file or
    directory which will be used for verification.

    Returns a ``dns.message.Message``.

    TNr  )r   r   rB   )rH  r   r*   r   r  r   r3   r4   r5   rr  r[  ra  r   rB  r   r   rm   )r   r   r   r;   rB   r   r   r   rC   r   r   r   r   rC  r   rA   r   r   r  r<  s                       r   tlsr  -  s?   z  

 
	
 99;D-g6Z 7tV[$!Rf >>&vd/JUGT	
'
  
K,q*%D*%(z+QYY
M +}}Q!  $ 	s   ;A0C55C>r   c                    t         j                  j                  st        d      ||
|}
d| _        | j                         }|rt        j                  d      }|}n#t         j                  j                  |	|
      }|}|5  |sj                  ||||      }t        |      \  }}j                  |      5 }|j                  |d       |j                  t        |            }ddd       t        j                         }ddd       t         j                   j#                  || j$                  | j&                  ||      }t)        z
  d      |_        | j+                  |      st,        |S # 1 sw Y   xY w# 1 sw Y   zxY w)a  Return the response obtained after sending a query via DNS-over-QUIC.

    *q*, a ``dns.message.Message``, the query to send.

    *where*, a ``str``, the nameserver IP address.

    *timeout*, a ``float`` or ``None``, the number of seconds to wait before the query
    times out. If ``None``, the default, wait forever.

    *port*, a ``int``, the port to send the query to. The default is 853.

    *source*, a ``str`` containing an IPv4 or IPv6 address, specifying the source
    address.  The default is the wildcard address.

    *source_port*, an ``int``, the port from which to send the message. The default is
    0.

    *one_rr_per_rrset*, a ``bool``. If ``True``, put each RR into its own RRset.

    *ignore_trailing*, a ``bool``. If ``True``, ignore trailing junk at end of the
    received message.

    *connection*, a ``dns.quic.SyncQuicConnection``.  If provided, the connection to use
    to send the query.

    *verify*, a ``bool`` or ``str``.  If a ``True``, then TLS certificate verification
    of the server is done using the default CA bundle; if ``False``, then no
    verification is done; if a `str` then it specifies the path to a certificate file or
    directory which will be used for verification.

    *hostname*, a ``str`` containing the server's hostname or ``None``.  The default is
    ``None``, which means that no hostname is known, and if an SSL context is created,
    hostname checking will be disabled.  This value is ignored if *url* is not
    ``None``.

    *server_hostname*, a ``str`` or ``None``.  This item is for backwards compatibility
    only, and has the same meaning as *hostname*.

    Returns a ``dns.message.Message``.
    zDNS-over-QUIC is not available.Nr   )r  r  Tr   r
   )r   r   r  rr   r  r   r   r   r  r  r*   r  r-  r  r   r   r   r   r   r   r  r   rm   )r   r   r   r;   rB   r   r   r   r   r   r   r   r   r   r"  r!  r#  r   r$  r%  r  s                        r   r   r     st   n 88566"x'7"AD99;D 5?5K5KD5Q#((**H + 
 	 	(00tV[N -W5
''0 	:FKKd#>>*Z"89D	: 	 			MM)' 	 	A %%AF==H	: 	:	 	s$   6E:8-E.%E:.E7	3E::Fc                       e Zd ZdZdZdZdZy)UDPModea  How should UDP be used in an IXFR from :py:func:`inbound_xfr()`?

    NEVER means "never use UDP; always use TCP"
    TRY_FIRST means "try to use UDP but fall back to TCP if needed"
    ONLY means "raise ``dns.xfr.UseTCP`` if trying UDP does not succeed"
    r   r   r   N)rL   rM   rN   rk   NEVER	TRY_FIRSTONLYr_   r   r   r  r    s     EIDr   r  txn_managerr   serialc              #     K   |j                   d   j                  }|t        j                  j                  k(  }| j                         }|j                         }	t        |t        j                        xr |j                  t        j                  k(  }
|
rt        ||	d|       n/t        j                  dt        |	            |	z   }t        |||       t        j                   j#                  | |||
      5 }d}d}d}|st%        |      \  }}||||kD  r|}|
rt'        |d|      \  }}n2t)        |d|      }t        j*                  d|      \  }t)        |||      }t        j,                  j/                  ||j0                  |j2                  d|||
 |      }|j5                  |      }| |j6                  }|s|j0                  r-|+|j8                  st        j:                  j=                  d	      ddd       y# 1 sw Y   yxY ww)
z'Given a socket, does the zone transfer.r   Nr]  Fr:  r   T)r   r   xfrorigintsig_ctxmultir   zmissing TSIG)questionrdtyper   	rdatatypeIXFRfrom_wire_originr   rv   r3   r   rA  r/  r^  packr   rU  r  Inboundr*   r*  rQ  r_  r   r   r   rB  process_messager  had_tsigr   	FormError)r  r   r8  r  r   r   r  is_ixfrr  r   is_udprZ  inbounddoner  r  r>   mexpirationrwirer`  rT  s                        r   _inbound_xfrr    s     ^^A%%F***G))+F==?D6==)Iaff8I8I.IF!T4,T3t9-41fj)	fff	= :(,-g6Q"&;+C(&q%=
!!Q4}}T51!!Q4%%!II!!z!( & 	A **1-DGzzH1 2 ==Q]1::--)).99=: : :s%   C2H	4CG=;9G=4	H	=HH	zoner  rdclasskeyname
relativizer)   use_udpkeyalgorithmc           	   #   >  K    G d dt         j                  j                        }t        |t              rt         j
                  j                  |      }t         j                  j                  j                  |      }t         j                  j                  |||      }|t         j                  j                  k(  r|j                  |j                  |t         j                  j                   t         j                  j"                  d      }t         j$                  j                  ddd| d      }|j'                  |d	       ||j)                  |||       t+        | ||
|d      \  }}}
|J t-        |	      \  }} |||      }|r(|t         j                  j                  k7  rt/        d      |rt0        j2                  nt0        j4                  }t7        |||
      5 }t9        |||       t;        ||||||      E d
{    d
d
d
       y
7 # 1 sw Y   y
xY ww)a  Return a generator for the responses to a zone transfer.

    *where*, a ``str`` containing an IPv4 or IPv6 address,  where
    to send the message.

    *zone*, a ``dns.name.Name`` or ``str``, the name of the zone to transfer.

    *rdtype*, an ``int`` or ``str``, the type of zone transfer.  The
    default is ``dns.rdatatype.AXFR``.  ``dns.rdatatype.IXFR`` can be
    used to do an incremental transfer instead.

    *rdclass*, an ``int`` or ``str``, the class of the zone transfer.
    The default is ``dns.rdataclass.IN``.

    *timeout*, a ``float``, the number of seconds to wait for each
    response message.  If None, the default, wait forever.

    *port*, an ``int``, the port send the message to.  The default is 53.

    *keyring*, a ``dict``, the keyring to use for TSIG.

    *keyname*, a ``dns.name.Name`` or ``str``, the name of the TSIG
    key to use.

    *relativize*, a ``bool``.  If ``True``, all names in the zone will be
    relativized to the zone origin.  It is essential that the
    relativize setting matches the one specified to
    ``dns.zone.from_xfr()`` if using this generator to make a zone.

    *lifetime*, a ``float``, the total number of seconds to spend
    doing the transfer.  If ``None``, the default, then there is no
    limit on the time the transfer may take.

    *source*, a ``str`` containing an IPv4 or IPv6 address, specifying
    the source address.  The default is the wildcard address.

    *source_port*, an ``int``, the port from which to send the message.
    The default is 0.

    *serial*, an ``int``, the SOA serial number to use as the base for
    an IXFR diff sequence (only meaningful if *rdtype* is
    ``dns.rdatatype.IXFR``).

    *use_udp*, a ``bool``.  If ``True``, use UDP (only meaningful for IXFR).

    *keyalgorithm*, a ``dns.name.Name`` or ``str``, the TSIG algorithm to use.

    Raises on errors, and so does the generator.

    Returns a generator of ``dns.message.Message`` objects.
    c                       e Zd Zd Zd Zdej                  j                  fdZd Z	d	de
dej                  j                  fdZy)
$xfr.<locals>.DummyTransactionManagerc                 ^    |||r!t         j                  j                  f| _        y |f| _        y r   )r   r   emptyinfo)r"   r  r  s      r   r   z-xfr.<locals>.DummyTransactionManager.__init__  s#    zSXX^^VDIvVDIr   c                     | j                   S r   )r  r"   s    r   origin_informationz7xfr.<locals>.DummyTransactionManager.origin_information  s    99r   rd   c                     t         r   rG   r  s    r   	get_classz.xfr.<locals>.DummyTransactionManager.get_class  ra   r   c                     t         r   rG   r  s    r   readerz+xfr.<locals>.DummyTransactionManager.reader  ra   r   replacementc                 h     G d d      }t        t        j                  j                   |             S )Nc                       e Zd Zd Zd Zy)Exfr.<locals>.DummyTransactionManager.writer.<locals>.DummyTransactionc                      y r   r_   )r"   rZ   kws      r   nopzIxfr.<locals>.DummyTransactionManager.writer.<locals>.DummyTransaction.nop  s    r   c                     | j                   S r   )r  )r"   r>   s     r   __getattr__zQxfr.<locals>.DummyTransactionManager.writer.<locals>.DummyTransaction.__getattr__  s    88Or   N)rL   rM   rN   r  r  r_   r   r   DummyTransactionr    s    $r   r  )r   r   transactionTransaction)r"   r  r  s      r   writerz+xfr.<locals>.DummyTransactionManager.writer  s)    $ $ 335E5GHHr   N)F)rL   rM   rN   r   r  r   
rdataclass
RdataClassr  r  boolr  r  r  r_   r   r   DummyTransactionManagerr    sH    	W		&s~~88 	&	&	Id 	Is7R7R 	Ir   r  T)createINSOAz. . z 0 0 0 0r   N)	algorithmzcannot do a UDP AXFR)r   r  TransactionManagerrv   r   r   	from_textr  	RdataTypemaker   
make_queryr  
find_rrset	authorityr  r  r  rdataadduse_tsigr   r*   r   r3   rA  r4   r2   r5   r  )r   r  r  r  r   r;   r   r  r  r)   rB   r   r  r  r  r  r   rrsetsoarA   r   r>   r   tm	sock_typer   s                             r   r  r  ;  s    JI#//"D"D I. $xx!!$']]$$))&1FtVW5A###KKs~~00#--2C2CD  
 ii!!$fXX/FG		#q	

7G|
< 7tV[$!Rf >>$X.OQ
	 z	2B6S]]////00%,!!&2D2DI	RF	+ GqK,Aq&':FFFG GFG Gs0   GH !HHH	HHHHudp_modec	           	      6   |#t         j                  j                  |      \  }}	nt         j                  j                  |      }	t	        | |||d      \  }
}}|
J t        |      \  }}|j                  d   j                  t         j                  j                  k(  r\|t        j                  k7  rIt        |
t        j                  |      5 }t        |||       	 t!        ||||	||      D ]  } 	 ddd       yt        |
t        j&                  |      5 }t        |||       t!        ||||	||      D ]  } 	 ddd       y# t         j                  j"                  $ r |t        j$                  k(  r Y nw xY w	 ddd       # 1 sw Y   xY w# 1 sw Y   yxY w)a  Conduct an inbound transfer and apply it via a transaction from the
    txn_manager.

    *where*, a ``str`` containing an IPv4 or IPv6 address,  where
    to send the message.

    *txn_manager*, a ``dns.transaction.TransactionManager``, the txn_manager
    for this transfer (typically a ``dns.zone.Zone``).

    *query*, the query to send.  If not supplied, a default query is
    constructed using information from the *txn_manager*.

    *port*, an ``int``, the port send the message to.  The default is 53.

    *timeout*, a ``float``, the number of seconds to wait for each
    response message.  If None, the default, wait forever.

    *lifetime*, a ``float``, the total number of seconds to spend
    doing the transfer.  If ``None``, the default, then there is no
    limit on the time the transfer may take.

    *source*, a ``str`` containing an IPv4 or IPv6 address, specifying
    the source address.  The default is the wildcard address.

    *source_port*, an ``int``, the port from which to send the message.
    The default is 0.

    *udp_mode*, a ``dns.query.UDPMode``, determines how UDP is used
    for IXFRs.  The default is ``dns.query.UDPMode.NEVER``, i.e. only use
    TCP.  Other possibilities are ``dns.query.UDPMode.TRY_FIRST``, which
    means "try UDP but fallback to TCP if needed", and
    ``dns.query.UDPMode.ONLY``, which means "try UDP and raise
    ``dns.xfr.UseTCP`` if it does not succeed.

    Raises on errors.
    NTr   )r   r  r  extract_serial_from_queryr   r*   r  r  r  r  r  r  r2   r3   rA  r5   r  UseTCPr  r4   )r   r  r8  r;   r   r)   rB   r   r  r  rA   r   r>   r   r   s                  r   inbound_xfrr    s   ^ }'',,[92259 7tV[$!Rf >>$X.OQ
~~a3==#5#55(gmm:SV..7 
	1QZ0%E67J A  
	 
	 
R++V	4 K,k1eVWjQ 	A	 	 77>> w||+ ,+
	 
	 
	 s6   FE#F1E63F5E66FFF)Tr   rK   )	Nr   Nr   FFTTN)
NNFFNr   FFFN)
Nr?  Nr   FFFFNF)
Nr?  Nr   FFFNNF)NFNr   F)Nr?  Nr   FFN)TTN)
NU  Nr   FFNNNT)
Nr  Nr   FFNTNN)rk   r   r   enumrd  rl  r   rz   r3   r^  r   urllib.parser   typingr   r   r   r   r   r   dns._featuresr   dns._tls_utildns.exceptiondns.inetdns.messagedns.namedns.quic	dns.rdatadns.rdataclassdns.rdatatypedns.transactiondns.tsigdns.xfrrw   ImportErrordns._no_ssl_no_sslr   r   	_featureshave_have_httpxhttpcore._backends.syncr8   r   NetworkBackend_CoreNetworkBackend	_backendssync
SyncStreamr6   r   HTTPTransportrR   r   AddressFamilyr  
SocketKindrf   rg   __annotations__r   DNSExceptionri   r  rm   ro   rr   r  TransferErrorr*   r   r   r   r   r   r   r2   
SSLContextr   r   r   rx   r   r   r   IntEnumr   r\   r   r   r2  floatr  r  r   Headersbytesr  r  r   r   r*  r/  r5  tsigKeyr>  rD  rI  rQ  rU  r[  ra  r5   rH  rr  r   r  r  r  r  r  r  r  r  AXFRr  r  default_algorithmr  r  r  r  r_   r   r   <module>r     s  $      	       = =             
2 mm  '""11((--88O4&- 4&l,, ,& &  *s"*


* * ]]	*  C!2!2C8&--G 
Hs}}11 HG#--)) GCMM&& 
CMM&&  %%$(800	)" =A)%^ s"


 $J ]]	J 37's"'


' ' XX]]S(4/	'
 $J' 	]]'V
-./$,, & !"!$(*.26"" + 3 3!L
{{LL T\L 	L
 $JL L L L 4ZL L L TzL 3J'L ./L L  !L" 	[[#L^#((** % E O388++ O3 Oe O O* !"!*.59:
{{:: 
: T\	:
 : $J: : : : 3J': : ++d2: 	[[:z	11&  $	

++


%  	
 3:> ###"8< #! %(,g4
g4tg4 g4 	g4
 g4 #((---.5g4 g4 g4 g4 g4 ;;%g4 	g4Z !#"! %Y
{{YY T\Y 	Y
 $JY Y Y Y Y Y *Y Y 	[[Y~ !#"!U 
{{U U  T\U  	U 
 $JU  U  U  U  U  DjU  DjU  U  3;;$%U p*1&  $$
$
++


%$ $ 3:	$@  $"8< #!,
,, , #((---.5	,
 , , 3;;%&,^- !"!C
{{CC T\C 	C
 $JC C C C *C 	[[CL. "3J 9t 	^^	DJ4ZJ)-J^^J !"!!%)-"&i
{{ii T\i 	i
 $Ji i i i --$
i $&i 4Zi 3Ji 	[[i^ !"!59"&^
{{^^ T\^ 	^
 $J^ ^ ^ ^ ++d2^ 3J^ Dj^ 4Z^ 	[[^B
dll 
1:331:}}s}}$1: ;;1: $J	1:
 T\1: 1: 	1:n -0MM,>,>/2~~/@/@ 8<*.!(+(B(BsGsG
((--#
sG MM##c)sG ^^&&,	sG
 T\sG sG #((---.5sG XX]]S 4'sG sG dlsG $JsG sG sG sG ((--#%sG  	!sGr )- !II33I ;;%I 	I
 T\I dlI $JI I I 
IA4  s   5e4 4ff