
    gB              
          % S r SSKrSSKrSSKrSSKrSSKJrJrJrJ	r	  SSK
rSSKrSSKrSSKr " S S\R                  R                   5      r " S S5      r " S S	\5      r " S
 S\5      r " S S\R                  R                   5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r\R4                  \\R6                  \\R8                  \\R:                  \\R<                  \0r\\\4   \ S'   S\S\4S jr!S\	\\"4   SSS\4S jr#S\	\\"4   S\$S\%S\%S\4
S  jr&S!\S\SS4S" jr'\R8                  r\RP                  r(\RR                  r)\RT                  r*\R4                  r\RV                  r+\R:                  r\RX                  r,\RZ                  r-\R\                  r.\R6                  r\R<                  rg)#zEDNS Options    N)AnyDictOptionalUnionc                   T    \ rS rSrSrSrSrSrSrSr	Sr
S	rS
rSrSrSr\S 5       rSrg)
OptionType                   	   
                  c                     gNi   clss    A/home/matz/Project1/venv/lib/python3.13/site-packages/dns/edns.py_maximumOptionType._maximum:           r   N)__name__
__module____qualname____firstlineno__NSIDDAUDHUN3UECSEXPIRECOOKIE	KEEPALIVEPADDINGCHAINEDEREPORTCHANNELclassmethodr   __static_attributes__r   r   r   r   r       sP    D
C
C
C
CFFIGE
CM r   r   c                       \ rS rSrSrS\\\4   4S jrSS\	\
   S\	\   4S jjrS\4S	 jr\S\S
SSS 4S j5       rS rS rS rS rS rS rS rS rSrg)Option?   z%Base class for all EDNS option types.otypec                 8    [         R                  U5      U l        g)zOInitialize an option.

*otype*, a ``dns.edns.OptionType``, is the option type.
N)r   maker5   )selfr5   s     r   __init__Option.__init__B   s    
  __U+
r   Nfilereturnc                     [         e)zEConvert an option to wire format.

Returns a ``bytes`` or ``None``.

NotImplementedErrorr8   r;   s     r   to_wireOption.to_wireI   s
     "!r   c                     [         eNr>   r8   s    r   to_textOption.to_textQ   s    !!r   parserdns.wire.Parserc                     [         e)zBuild an EDNS option object from wire format.

*otype*, a ``dns.edns.OptionType``, is the option type.

*parser*, a ``dns.wire.Parser``, the parser, which should be
restructed to the option length.

Returns a ``dns.edns.Option``.
r>   r   r5   rH   s      r   from_wire_parserOption.from_wire_parserT   s
     "!r   c                 \    U R                  5       nUR                  5       nX#:X  a  gX#:  a  gg)zCompare an EDNS option with another option of the same type.

Returns < 0 if < *other*, 0 if == *other*, and > 0 if > *other*.
r      )rA   )r8   otherwireowires       r   _cmpOption._cmpa   s-    
 ||~=<r   c                     [        U[        5      (       d  gU R                  UR                  :w  a  gU R                  U5      S:H  $ )NFr   
isinstancer3   r5   rT   r8   rQ   s     r   __eq__Option.__eq__n   s9    %((::$yy1$$r   c                     [        U[        5      (       d  gU R                  UR                  :w  a  gU R                  U5      S:g  $ )NTr   rW   rY   s     r   __ne__Option.__ne__u   s9    %((::$yy1$$r   c                     [        U[        5      (       a  U R                  UR                  :w  a  [        $ U R	                  U5      S:  $ Nr   rX   r3   r5   NotImplementedrT   rY   s     r   __lt__Option.__lt__|   8    %((DJJ%++,E!!yy!##r   c                     [        U[        5      (       a  U R                  UR                  :w  a  [        $ U R	                  U5      S:*  $ r`   ra   rY   s     r   __le__Option.__le__   8    %((DJJ%++,E!!yy1$$r   c                     [        U[        5      (       a  U R                  UR                  :w  a  [        $ U R	                  U5      S:  $ r`   ra   rY   s     r   __ge__Option.__ge__   ri   r   c                     [        U[        5      (       a  U R                  UR                  :w  a  [        $ U R	                  U5      S:  $ r`   ra   rY   s     r   __gt__Option.__gt__   re   r   c                 "    U R                  5       $ rD   )rF   rE   s    r   __str__Option.__str__   s    ||~r   r5   rD   )r    r!   r"   r#   __doc__r   r   strr9   r   r   bytesrA   rF   r0   rL   rT   rZ   r]   rc   rg   rk   rn   rq   r1   r   r   r   r3   r3   ?   s    /,eJO4 ,"HSM "Xe_ "" " 
"Z 
"9J 
"x 
" 
"%%$
%
%
$
r   r3   c                      ^  \ rS rSrSrS\\\4   S\\\4   4U 4S jjr	SS\
\   S\
\   4S jjrS\4S	 jr\S\\\4   S
SS\4S j5       rSrU =r$ )GenericOption   zkGeneric Option Class

This class is used for EDNS option types for which we have no better
implementation.
r5   datac                    > [         TU ]  U5        [        R                  R                  R                  US5      U l        g )NT)superr9   dnsrdataRdata	_as_bytesrz   )r8   r5   rz   	__class__s      r   r9   GenericOption.__init__   s,    IIOO--dD9	r   r;   r<   c                 `    U(       a  UR                  U R                  5        g U R                  $ rD   )writerz   r@   s     r   rA   GenericOption.to_wire   "    JJtyy!99r   c                      SU R                   -  $ )Nz
Generic %drs   rE   s    r   rF   GenericOption.to_text   s    djj((r   rH   rI   c                 .    U " XR                  5       5      $ rD   get_remainingrK   s      r   rL   GenericOption.from_wire_parser   s     5..011r   )rz   rD   )r    r!   r"   r#   rt   r   r   ru   rv   r9   r   r   rA   rF   r0   r3   rL   r1   __classcell__r   s   @r   rx   rx      s    :eJO4 :E%*<M :HSM Xe_ ) ) 2*c/*24E2	2 2r   rx   c                      ^  \ rS rSrSrSS\S\\   S\4U 4S jjjrS\4S jr	\
S	\S\4S
 j5       rSS\\   S\\   4S jjr\S\\\4   SSS\4S j5       rSrU =r$ )	ECSOption   z!EDNS Client Subnet (ECS, RFC7871)addresssrclenscopelenc                   > [         T	U ]  [        R                  5        [        R
                  R                  U5      nU[        R                  :X  a  SU l	        Uc  Sn[        R                  R                  R                  U5      n[        R                  R                  R                  USS5      n[        R                  R                  R                  USS5      nOU[        R                  :X  a  SU l	        Uc  Sn[        R                  R                  R                  U5      n[        R                  R                  R                  USS5      n[        R                  R                  R                  USS5      nO[!        S	5      eUc   eXl        X l        X0l        [        R
                  R)                  XA5      n[+        [,        R.                  " US
-  5      5      nUSU U l        US-  nUS:w  aN  [2        R4                  " S[7        U R0                  SS 5      SSU-
  -  -  5      nU R0                  SS U-   U l        gg)aZ  *address*, a ``str``, is the client address information.

*srclen*, an ``int``, the source prefix length, which is the
leftmost number of bits of the address to be used for the
lookup.  The default is 24 for IPv4 and 56 for IPv6.

*scopelen*, an ``int``, the scope prefix length.  This value
must be 0 in queries, and should be set in responses.
   N8   r      rO      r	   zBad address family       @r   BrP      )r|   r9   r   r(   r}   inetaf_for_addresssocketAF_INET6familyr~   r   _as_ipv6_address_as_intAF_INET_as_ipv4_address
ValueErrorr   r   r   	inet_ptonintmathceiladdrdatastructpackord)
r8   r   r   r   afr   nbytesnbitslastr   s
            r   r9   ECSOption.__init__   s    	(XX$$W- DK~iioo66w?GYY__,,VQ<Fyy..xC@H6>>!DK~iioo66w?GYY__,,VQ;Fyy..xB?H122!!! 88%%b2TYYv|,- !&)
A:;;sCbc(:$;tE	?R$STD MM#2.5DM r   r<   c                 T    SU R                    SU R                   SU R                   3$ )NzECS /z scope/)r   r   r   rE   s    r   rF   ECSOption.to_text   s'    dll^1T[[MHHr   textc                 B   SnU R                  5       nSn[        U5      S:X  a  US   nO<[        U5      S:X  a  US   U:w  a  [        SU  S35      eUS   nO[        SU  S35      eUR                  S5      nUS:X  a  UR                  S5      u  pVS	nO*US:X  a  UR                  S5      u  pVnO[        SU  S35      e [	        U5      n [	        U5      n	[        XYU5      $ ! [         a    [        S
SU S3-   5      ef = f! [         a    [        SSU S3-   5      ef = f)a  Convert a string into a `dns.edns.ECSOption`

*text*, a `str`, the text form of the option.

Returns a `dns.edns.ECSOption`.

Examples:

>>> import dns.edns
>>>
>>> # basic example
>>> dns.edns.ECSOption.from_text('1.2.3.4/24')
>>>
>>> # also understands scope
>>> dns.edns.ECSOption.from_text('1.2.3.4/24/32')
>>>
>>> # IPv6
>>> dns.edns.ECSOption.from_text('2001:4b98::1/64/64')
>>>
>>> # it understands results from `dns.edns.ECSOption.to_text()`
>>> dns.edns.ECSOption.from_text('ECS 1.2.3.4/24/32')
r(   NrO   r   r   zcould not parse ECS from ""r   0zinvalid scope z": scope must be an integerzinvalid srclen z": srclen must be an integer)splitlenr   countr   r   )
r   optional_prefixtokensecs_text	n_slashesr   tsrclentscopescoper   s
             r   	from_textECSOption.from_text   s\   0  v;!ayH[AayO+ #=dV1!EFFayH9$qABBNN3'	>'~~c2GF!^'/~~c':$Gf9$qABB	YKE	\F
 %00  	Y-!F8;V0WWXX	Y  	!ay0L$MM 	s   >C! 
D !C>Dr;   c                     [         R                  " SU R                  U R                  U R                  5      U R
                  -   nU(       a  UR                  U5        g U$ )N!HBB)r   r   r   r   r   r   r   r8   r;   values      r   rA   ECSOption.to_wire  sG    KKT[[$--H4==X 	 JJuLr   r5   rH   rI   c                 |   UR                  S5      u  p4n[        [        R                  " US-  5      5      nUR	                  U5      nUS:X  a+  SU-
  n[
        R                  R                  USU-  -   5      n	O<US:X  a+  SU-
  n[
        R                  R                  USU-  -   5      n	O[        S5      eU " XU5      $ )	Nr   r   rO          r      zunsupported family)

get_structr   r   r   	get_bytesr}   ipv4	inet_ntoaipv6r   )
r   r5   rH   r   srcr   addrlenprefixpadaddrs
             r   rL   ECSOption.from_wire_parser&  s     $..v6Udiic	*+!!'*Q;g+C88%%fw}&<=Dq[w,C88%%fw}&<=D1224e$$r   )r   r   r   r   r   r`   rD   )r    r!   r"   r#   rt   ru   r   r   r9   rF   staticmethodr3   r   r   rv   rA   r0   r   r   rL   r1   r   r   s   @r   r   r      s    +-6 -6Xc] -6S -6 -6^I I 41 41 41 41lHSM Xe_  %*c/*%4E%	% %r   r   c                       \ rS rSrSrSrSrSrSrSr	Sr
S	rS
rSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSr\S 5       rSrg)EDECodei9  r   rO   r   r
   r   r   r   r   r   r   r   r   r   r      r   r      r                  r   c                     gr   r   r   s    r   r   EDECode._maximumT  r   r   r   N) r    r!   r"   r#   OTHERUNSUPPORTED_DNSKEY_ALGORITHMUNSUPPORTED_DS_DIGEST_TYPESTALE_ANSWERFORGED_ANSWERDNSSEC_INDETERMINATEDNSSEC_BOGUSSIGNATURE_EXPIREDSIGNATURE_NOT_YET_VALIDDNSKEY_MISSINGRRSIGS_MISSINGNO_ZONE_KEY_BIT_SETNSEC_MISSINGCACHED_ERROR	NOT_READYBLOCKEDCENSOREDFILTERED
PROHIBITEDSTALE_NXDOMAIN_ANSWERNOT_AUTHORITATIVENOT_SUPPORTEDNO_REACHABLE_AUTHORITYNETWORK_ERRORINVALID_DATAr0   r   r1   r   r   r   r   r   9  s    E#$ !"LMLNNLLIGHHJMML r   r   c                      ^  \ rS rSrSr1 SkrSS\\\4   S\	\   4U 4S jjjr
S\4S jrSS	\	\   S\	\   4S
 jjr\S\\\4   SSS\4S j5       rSrU =r$ )	EDEOptioniY  z!Extended DNS Error (EDE, RFC8914)>   DSNSECDNSKEYDNSSECRRSIGsNXDOMAINcoder   c                    > [         TU ]  [        R                  5        [        R                  U5      U l        Ub   [        U[        5      (       d  [        S5      eX l
        g)z*code*, a ``dns.edns.EDECode`` or ``str``, the info code of the
extended error.

*text*, a ``str`` or ``None``, specifying additional information about
the error.
Nztext must be string or None)r|   r9   r   r.   r   r7   r  rX   ru   r   r   )r8   r  r   r   s      r   r9   EDEOption.__init__^  sI     	(LL&	JtS$9$9:;;	r   r<   c                 0  ^  ST R                    3nT R                   [        ;   aR  [        R                  T R                   5      nSR                  U 4S jUR	                  S5       5       5      nUSU S3-  nT R
                  b  UST R
                   3-  nU$ )NzEDE  c              3   h   >#    U  H'  nUTR                   ;   a  UOUR                  5       v   M)     g 7frD   )_preserve_casetitle).0wordr8   s     r   	<genexpr>$EDEOption.to_text.<locals>.<genexpr>q  s0      +D  3 33E+s   /2_z ()z: )r  r   rF   joinr   r   )r8   outputdescs   `  r   rF   EDEOption.to_textm  s    		{#99??499-D88  JJsO D 4&l"F99 499+&&Fr   r;   c                     [         R                  " SU R                  5      nU R                  b  X R                  R	                  S5      -  nU(       a  UR                  U5        g U$ )Nz!Hutf8)r   r   r  r   encoder   r   s      r   rA   EDEOption.to_wirez  sN    D$)),99 YY%%f--EJJuLr   r5   rH   rI   c                     [         R                  UR                  5       5      nUR                  5       nU(       a   US   S:X  a  US S nUR	                  S5      nOS nU " X55      $ )NrP   r   r  )r   r7   
get_uint16r   decode)r   r5   rH   r  r   btexts         r   rL   EDEOption.from_wire_parser  s`     ||F--/0##%Bx1}CRyKK'EE4r   )r  r   rD   )r    r!   r"   r#   rt   r  r   r   ru   r   r9   rF   r   rv   rA   r0   r   r3   rL   r1   r   r   s   @r   r  r  Y  s    +MNU7C<0    	HSM 	Xe_ 	  *c/* 4E 	   r   r  c                      ^  \ rS rSrS\4U 4S jjrSS\S\\   4S jjrS\	4S jr
\S\\\	4   S	\R                  R                   S\4S
 j5       rSrU =r$ )
NSIDOptioni  nsidc                 L   > [         TU ]  [        R                  5        Xl        g rD   )r|   r9   r   r$   r%  )r8   r%  r   s     r   r9   NSIDOption.__init__  s    )	r   r;   r<   c                 `    U(       a  UR                  U R                  5        g U R                  $ rD   )r   r%  r@   s     r   rA   NSIDOption.to_wire  r   r   c                     [        S U R                   5       5      (       a  U R                  R                  5       nO.[        R                  " U R                  5      R                  5       nSU 3$ )Nc              3   B   #    U  H  oS :  =(       a    US:*  v   M     g7f)r	   ~   Nr   )r  cs     r   r  %NSIDOption.to_text.<locals>.<genexpr>  s     :	1Dy&Q$Y&	s   zNSID )allr%  r   binasciihexlify)r8   r   s     r   rF   NSIDOption.to_text  sR    :		:::II$$&E$$TYY/668Eugr   r5   rH   c                 .    U " UR                  5       5      $ rD   r   rK   s      r   rL   NSIDOption.from_wire_parser  s     6'')**r   )r%  rD   r    r!   r"   r#   rv   r9   r   r   rA   ru   rF   r0   r   r   r}   rR   Parserr3   rL   r1   r   r   s   @r   r$  r$    so    U C 8E?   +*c/*+47HHOO+	+ +r   r$  c                      ^  \ rS rSrS\S\4U 4S jjrSS\S\\   4S jjrS\	4S jr
\S	\\\	4   S
\R                  R                   S\4S j5       rSrU =r$ )CookieOptioni  clientserverc                 &  > [         TU ]  [        R                  R                  R
                  5        Xl        X l        [        U5      S:w  a  [        S5      e[        U5      S:w  a*  [        U5      S:  d  [        U5      S:  a  [        S5      eg g )Nr   zclient cookie must be 8 bytesr   r	   z5server cookie must be empty or between 8 and 32 bytes)
r|   r9   r}   ednsr   r*   r9  r:  r   r   )r8   r9  r:  r   s      r   r9   CookieOption.__init__  sx    ,,334v;!<==v;!VqCK"4DTUU 5Er   r;   r<   c                     U(       aP  UR                  U R                  5        [        U R                  5      S:  a  UR                  U R                  5        g U R                  U R                  -   $ r`   )r   r9  r   r:  r@   s     r   rA   CookieOption.to_wire  sL    JJt{{#4;;!#

4;;';;,,r   c                     [         R                  " U R                  5      R                  5       n[	        U R
                  5      S:  a/  [         R                  " U R
                  5      R                  5       nOSnSU U 3$ )Nr    zCOOKIE )r0  r1  r9  r   r   r:  )r8   r9  r:  s      r   rF   CookieOption.to_text  sc    !!$++.557t{{a%%dkk299;FF))r   r5   rH   c                 N    U " UR                  S5      UR                  5       5      $ )Nr   )r   r   rK   s      r   rL   CookieOption.from_wire_parser  s%     6##A&(<(<(>??r   )r9  r:  rD   r5  r   s   @r   r8  r8    s~    Vu Ve V-C -8E? -* * @*c/*@47HHOO@	@ @r   r8  c                      ^  \ rS rSrS\R
                  R                  4U 4S jjrSS\S\	\
   4S jjrS\4S jr\S\\\4   S	\R"                  R$                  S\4S
 j5       rSrU =r$ )ReportChannelOptioni  agent_domainc                 L   > [         TU ]  [        R                  5        Xl        g rD   )r|   r9   r   r/   rG  )r8   rG  r   s     r   r9   ReportChannelOption.__init__  s    112(r   r;   r<   c                 8    U R                   R                  U5      $ rD   )rG  rA   r@   s     r   rA   ReportChannelOption.to_wire  s      ((..r   c                 <    SU R                   R                  5       -   $ )NzREPORTCHANNEL )rG  rF   rE   s    r   rF   ReportChannelOption.to_text  s    $"3"3";";"===r   r5   rH   c                 .    U " UR                  5       5      $ rD   )get_namerK   s      r   rL   $ReportChannelOption.from_wire_parser  s     6??$%%r   )rG  rD   )r    r!   r"   r#   r}   nameNamer9   r   r   rv   rA   ru   rF   r0   r   r   rR   r6  r3   rL   r1   r   r   s   @r   rF  rF    sw    )SXX]] )/C /8E? /> > &*c/*&47HHOO&	& &r   rF  _type_to_classr5   r<   c                 B    [         R                  U 5      nUc  [        nU$ )zxReturn the class for the specified option type.

The GenericOption class is used if a more specific class is not
known.
)rS  getrx   )r5   r   s     r   get_option_classrV    s#     

U
#C
{Jr   rH   rI   c                 d    [         R                  U 5      n [        U 5      nUR                  X5      $ )zBuild an EDNS option object from wire format.

*otype*, an ``int``, is the option type.

*parser*, a ``dns.wire.Parser``, the parser, which should be
restricted to the option length.

Returns an instance of a subclass of ``dns.edns.Option``.
)r   r7   rV  rL   )r5   rH   r   s      r   option_from_wire_parserrX    s-     OOE"E
5
!C..r   rR   currentolenc                     [         R                  R                  X5      nUR                  U5         [	        X5      sSSS5        $ ! , (       d  f       g= f)aV  Build an EDNS option object from wire format.

*otype*, an ``int``, is the option type.

*wire*, a ``bytes``, is the wire-format message.

*current*, an ``int``, is the offset in *wire* of the beginning
of the rdata.

*olen*, an ``int``, is the length of the wire-format option data

Returns an instance of a subclass of ``dns.edns.Option``.
N)r}   rR   r6  restrict_torX  )r5   rR   rY  rZ  rH   s        r   option_from_wirer]    s8      XX__T+F			D	!&u5 
"	!	!s   A
Aimplementationc                     U [         U'   g)zRegister the implementation of an option type.

*implementation*, a ``class``, is a subclass of ``dns.edns.Option``.

*otype*, an ``int``, is the option type.
N)rS  )r^  r5   s     r   register_typer`  "  s     +N5r   )/rt   r0  r   r   r   typingr   r   r   r   dns.enumr}   dns.inet	dns.rdatadns.wireenumIntEnumr   r3   rx   r   r   r  r$  r8  rF  r(   r.   r$   r*   r/   rS  __annotations__rV  ru   rX  rv   r   r]  r`  r%   r&   r'   r)   r+   r,   r-   r   r   r   <module>ri     s  $      - -    !! >R Rj2F 28F% F%Rchh @:  : z+ +6@6 @D&& &( NNINNIOOZ|1)Z_% 
J 
3 
/S!/+<//"6S!6).69<6DG66*+# +j +T + nnnnnnnn						  	


nn((r   