
    *DCfh              !          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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mZ ddlmZmZmZmZmZmZm Z m!Z!m"Z"m#Z# e"rddl$Z$ejJ                  jL                  Z'd Z(d>dZ)	 d>dejT                  jV                  d	eejX                  jZ                  e.f   d
ede	e/   de
e0e/f   f
dZ1	 	 	 	 	 	 	 	 	 	 d?dejT                  jV                  d
e	e   de	e/   de2de2de	eejf                  jh                  ejj                  jl                  f      de	e.   de2de2de2de	ejX                  jZ                     defdZ7	 	 	 	 	 	 	 	 	 	 	 d@dejX                  jZ                  de8de	e/   de0de	e8   de0de2de2de2de2de	ejT                  jV                     de	ejT                  jr                     de2dejX                  jZ                  fd Z:	 	 	 	 	 	 	 	 	 	 	 dAdejX                  jZ                  de8de	e/   de0de	e8   de0de2de2de2d!e	ejT                  jV                     d"e	ejT                  jv                     de	ejT                  jr                     de2de
ejX                  jZ                  e2f   fd#Z<	 d>dejT                  jv                  d	eejX                  jZ                  e.f   de	e/   de
e0e/f   fd$Z=d% Z>	 	 	 	 	 dBdejT                  jv                  de	e/   de2de	eejf                  jh                  ejj                  jl                  f      de	e.   de2de
ejX                  jZ                  e/f   fd&Z?	 	 	 	 	 	 	 	 dCdejX                  jZ                  de8de	e/   de0de	e8   de0de2de2de	ejT                  jv                     de	ejT                  jr                     dejX                  jZ                  fd'Z@	 	 	 	 	 	 	 	 	 	 	 dDdejX                  jZ                  de8de	e/   de0de	e8   de0de2de2de	ejT                  jv                     de	ejT                  jr                     d)e	e#j                     d*e	e8   d+ee2e8f   dejX                  jZ                  fd,ZBdd-dddddd.d(d(ddej                  fdejX                  jZ                  de8de	e/   de0de	e8   de0de2de2d/e	d0   d1e8d2e2d+ee2e8f   d3e	e8   d4e	d5   d6e	e0   dejX                  jZ                  f d7ZDddddddej                  dfde8d8ej                  j                  de	ejX                  jZ                     de0de	e/   d9e	e/   de	e8   de0d:ede	ejT                  jr                     ddfd;ZH	 	 	 	 	 	 	 	 	 	 dEdejX                  jZ                  de8de	e/   de0de	e8   de0de2de2d<e	ej                  j                     d+ee2e8f   de	ejT                  jr                     d*e	e8   dejX                  jZ                  fd=ZIy)FzTalk to a DNS server.    N)AnyDictOptionalTupleUnion)NullContext)
BadResponseNoDOHNoDOQUDPMode_compute_times_make_dot_ssl_context_matches_destination
_remaininghave_dohsslc                     |s|rF|@| t         j                  k(  rd}||fS | t         j                  k(  rd}||fS t        d|        ||fS y )Nz0.0.0.0z::zunknown address family )socketAF_INETAF_INET6NotImplementedError)afaddressports      N/var/www/highfloat_scraper/venv/lib/python3.12/site-packages/dns/asyncquery.py_source_tupler   :   sl     $?V^^##
 	 v&  *,CB4*HII    c                 R    | %|st        j                          }t        | |z
  d      S y )Nr   )timemax)
expirationnows     r   _timeoutr#   J   s+    ))+C:#Q''r   sockwhatdestinationr!   returnc                    K   t        |t        j                  j                        r|j	                         }t        j
                         }| j                  ||t        ||             d{   }||fS 7 w)a  Send a DNS message to the specified UDP socket.

    *sock*, a ``dns.asyncbackend.DatagramSocket``.

    *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.  The expiration value is meaningless for the asyncio backend, as
    asyncio's transport sendto() never blocks.

    Returns an ``(int, float)`` tuple of bytes sent and the sent time.
    N)
isinstancednsmessageMessageto_wirer   sendtor#   )r$   r%   r&   r!   	sent_timens         r   send_udpr1   S   s^     . $++,||~		Ikk$Xj)-LMMAy> 	Ns   A)A6+A4,	A6Fignore_unexpectedone_rr_per_rrsetkeyringrequest_macignore_trailingraise_on_truncationignore_errorsqueryc                   K   d}	 | j                  dt        |             d{   \  }}t        | j                  |||      s@t	        j                         }	 t
        j                  j                  ||||||      }|	r|
|
j                  |      s|||fS 7 u# t
        j                  j                  $ r.}|	r&|
$|
j                  |j                               sY d}~܂ d}~wt        $ r |	rY  w xY ww)aj  Read a DNS message from a UDP socket.

    *sock*, a ``dns.asyncbackend.DatagramSocket``.

    See :py:func:`dns.query.receive_udp()` for the documentation of the other
    parameters, and exceptions.

    Returns a ``(dns.message.Message, float, tuple)`` tuple of the received message, the
    received time, and the address where the message arrived from.
    r     N)r4   r5   r3   r6   r7   )recvfromr#   r   familyr   r*   r+   	from_wire	Truncatedis_response	Exception)r$   r&   r!   r2   r3   r4   r5   r6   r7   r8   r9   wirefrom_addressreceived_timeres                   r   receive_udprG   q   s    0 D
%)]]5(::N%OO|#KK{4E
 			%%'!1 /$7 & A. U.u7H7H7K=,//A  P {{$$ 		 %))!))+6 			sK   "C7B4C7%B ?C7C49#C"C7!C""C40C72C44C75   qwheretimeoutr   sourcesource_portbackendc                   K   | j                         }t        |      \  }}t        j                  j	                  |      }t        ||f|      }|
rt        |
      }no|st        j                  j                         }t        |||      }|j                         r||f}nd}|j                  |t        j                  d||       d{   }|4 d{   }t        ||||       d{    t        |||||| j                   | j"                  ||	||        d{   \  }}}||z
  |_        |s| j'                  |      st(        |cddd      d{    S 7 7 7 s7 D7 # 1 d{  7  sw Y   yxY ww)aF  Return the response obtained after sending a query via UDP.

    *sock*, a ``dns.asyncbackend.DatagramSocket``, or ``None``,
    the socket to use for the query.  If ``None``, the default, a
    socket is created.  Note that if a socket is provided, the
    *source*, *source_port*, and *backend* are ignored.

    *backend*, a ``dns.asyncbackend.Backend``, or ``None``.  If ``None``,
    the default, then dnspython will use the default backend.

    See :py:func:`dns.query.udp()` for the documentation of the other
    parameters, exceptions, and return type of this method.
    Nr   )r-   r   r*   inetaf_for_address_lltupler   asyncbackendget_default_backendr   datagram_connection_requiredmake_socketr   
SOCK_DGRAMr1   rG   r4   macr   r@   r	   )rI   rJ   rK   r   rL   rM   r2   r3   r6   r7   r$   rN   r8   rB   
begin_timer!   r   r&   cmstupledtuplesrE   rD   _s                            r   udpr_      sw    8 99;D-g6Z		 	 	'BE4="-K5@5F&&::<Gr6;7//1T]FF&&r6+<+<aPP  Qq$Z888&1IIEE'
 !
M1 + q!1)   Q8!
   s~   CE6E
E6EE6E!'E(0E!E,E!E6EE6E6E!E!E6!E3'E*(E3/E6udp_socktcp_sockc                    K   	 t        | ||||||||d|	||       d{   }|dfS 7 # t        j                  j                  $ r$ t	        | ||||||||
|
       d{  7  }|dfcY S w xY ww)a  Return the response to the query, trying UDP first and falling back
    to TCP if UDP results in a truncated response.

    *udp_sock*, a ``dns.asyncbackend.DatagramSocket``, 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 the *source*,
    *source_port*, and *backend* are ignored for the UDP query.

    *tcp_sock*, a ``dns.asyncbackend.StreamSocket``, or ``None``, the
    socket to use for the TCP query.  If ``None``, the default, a
    socket is created.  Note that if a socket is provided *where*,
    *source*, *source_port*, and *backend*  are ignored for the TCP query.

    *backend*, a ``dns.asyncbackend.Backend``, or ``None``.  If ``None``,
    the default, then dnspython will use the default backend.

    See :py:func:`dns.query.udp_with_fallback()` for the documentation
    of the other parameters, exceptions, and return type of this
    method.
    TNF)r_   r*   r+   r?   tcp)rI   rJ   rK   r   rL   rM   r2   r3   r6   r`   ra   rN   r8   responses                 r   udp_with_fallbackre      s     F 
 
 %  
  ;;    
 
 
 $ s=   A-) ') A-) 4A*A 	A*'A-)A**A-c                 B  K   t        |t        j                  j                        r|j	                  d      }nt        |      j                  dd      |z   }t        j                         }| j                  |t        ||             d{    t        |      |fS 7 w)zSend a DNS message to the specified TCP socket.

    *sock*, a ``dns.asyncbackend.StreamSocket``.

    See :py:func:`dns.query.send_tcp()` for the documentation of the other
    parameters, exceptions, and return type of this method.
    T)prepend_length   bigN)
r)   r*   r+   r,   r-   lento_bytesr   sendallr#   )r$   r%   r!   tcpmsgr/   s        r   send_tcprn   4  s      $++,T2
 T##Au-4		I
,,vx
I>
???K## @s   B	BBBc                    K   d}|dkD  rG| j                  |t        |             d{   }|dk(  rt        |t        |      z
  }||z   }|dkD  rG|S 7 *w)z|Read the specified number of bytes from stream.  Keep trying until we
    either get the desired amount, or we hit EOF.
    r   r   N)recvr#   EOFErrorrj   )r$   countr!   r]   r0   s        r   _read_exactlyrs   M  sc      	A
!)))E8J#7888NAE !) H 9s   &AA'AAc                   K   t        | d|       d{   }t        j                  d|      \  }t        | ||       d{   }t        j                         }	t        j
                  j                  |||||      }
|
|	fS 7 m7 Bw)zRead a DNS message from a TCP socket.

    *sock*, a ``dns.asyncbackend.StreamSocket``.

    See :py:func:`dns.query.receive_tcp()` for the documentation of the other
    parameters, exceptions, and return type of this method.
    rh   N!Hr4   r5   r3   r6   )rs   structunpackr   r*   r+   r>   )r$   r!   r3   r4   r5   r6   ldatalrB   rD   rE   s              r   receive_tcpr{   [  s        a44E==u%DQtQ
33DIIKM)' 	 	A } 53s"   BB,B BABBc
           	        K   | j                         }
t        |      \  }}|r$|j                          d{    t        |      }n|t        j
                  j                  |      }t        |||      }||f}|	st        j                  j                         }	|	j                  |t        j                  d|||       d{   }|4 d{   }t        ||
|       d{    t        |||| j                  | j                   |       d{   \  }}||z
  |_        | j%                  |      st&        |cddd      d{    S 7 7 7 7 n7 D7 # 1 d{  7  sw Y   yxY ww)aO  Return the response obtained after sending a query via TCP.

    *sock*, a ``dns.asyncbacket.StreamSocket``, or ``None``, the
    socket to use for the query.  If ``None``, the default, a socket
    is created.  Note that if a socket is provided
    *where*, *port*, *source*, *source_port*, and *backend* are ignored.

    *backend*, a ``dns.asyncbackend.Backend``, or ``None``.  If ``None``,
    the default, then dnspython will use the default backend.

    See :py:func:`dns.query.tcp()` for the documentation of the other
    parameters, exceptions, and return type of this method.
    Nr   )r-   r   getpeernamer   r*   rP   rQ   r   rS   rT   rV   r   SOCK_STREAMrn   r{   r4   rX   r   r@   r	   )rI   rJ   rK   r   rL   rM   r3   r6   r$   rN   rB   rY   r!   rZ   r   r[   r\   r]   rE   rD   s                       r   rc   rc   y  s_    4 99;D-g6Z    5@5F XX$$U+r6;7&&::<G&&""Avvw
 
   Qq$
+++#.z+QYY$
 
M +}}Q   	!
+
   s   4E(EBE(>E	?
E(	E
E(EE+E
E)E4E( EE(	E(E(EEE(E%EE%!E(Tssl_contextserver_hostnameverifyc                 Z  K   t        |      \  }}|rt        |      }n|
t        ||      }
t        j                  j                  |      }t        |||      }||f}|	st        j                  j                         }	|	j                  |t        j                  d||||
|       d{   }|4 d{   }t        |      }t        | |||||||||	
       d{   }t        j                         }||z
  |_        |cddd      d{    S 7 g7 ^7 97 # 1 d{  7  sw Y   yxY ww)a  Return the response obtained after sending a query via TLS.

    *sock*, an ``asyncbackend.StreamSocket``, 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
    connected SSL stream socket, and *where*, *port*,
    *source*, *source_port*, *backend*, *ssl_context*, and *server_hostname*
    are ignored.

    *backend*, a ``dns.asyncbackend.Backend``, or ``None``.  If ``None``,
    the default, then dnspython will use the default backend.

    See :py:func:`dns.query.tls()` for the documentation of the other
    parameters, exceptions, and return type of this method.
    Nr   )r   r   r   r*   rP   rQ   r   rS   rT   rV   r   r~   r#   rc   r   )rI   rJ   rK   r   rL   rM   r3   r6   r$   rN   r   r   r   rY   r!   rZ   r   r[   r\   r]   rd   end_times                         r   tlsr     sE    <  .g6Z5@5F/HKXX$$U+r6;7&&::<G&&	
 	
   Q:&
 
 99; :-!  	

   sl   B$D+&D'
D+1D2D+5#DD#D<D+D	D+D+DD+D(DD($D+i  z
/dns-queryclientzhttpx.AsyncClientpathpostbootstrap_addressresolverzdns.asyncresolver.Resolverr=   c           
      0  K   t         st        |r%t        |t        j                        st        d      | j                         }	 t        j                  j                  |      }d}ddi}|mt        j                  j                  |      rN|t        j                  k(  rdj                  |||	      }n)|t        j                  k(  rdj                  |||	      }n|}t        j                  j!                         }|d}d}n|}|} |j#                         |dd|||||	      }|rt%        |      }nt        j                  dd||
      }|4 d{   }|
rS|j'                  dt)        t+        |            d       |j-                  |j/                  ||      |       d{   }nbt1        j2                  |      j5                  d      }|j7                         }|j-                  |j9                  |d|i      |       d{   }ddd      d{    j:                  dk  s|j:                  dkD  r0t        dj                  ||j:                  |j<                              t        j>                  jA                  |j<                  | jB                  | jD                  ||      }|jF                  jI                         |_%        | jM                  |      stN        |S # t
        $ r d}Y w xY w7 7 U7 7 # 1 d{  7  sw Y   xY ww)a  Return the response obtained after sending a query via DNS-over-HTTPS.

    *client*, a ``httpx.AsyncClient``.  If provided, the client to use for
    the query.

    Unlike the other dnspython async functions, a backend cannot be provided
    in this function because httpx always auto-detects the async backend.

    See :py:func:`dns.query.https()` for the documentation of the other
    parameters, exceptions, and return type of this method.
    z.session parameter must be an httpx.AsyncClientNacceptzapplication/dns-messagezhttps://{}:{}{}zhttps://[{}]:{}{}r   T)local_addresshttp1http2r   
local_portr   r   r=   )r   r   r   	transport)zcontent-typezcontent-length)headerscontent   =r*   )r   params   i+  z4{} responded with status code {}
Response body: {!r}rv   )(r   r
   r)   httpxAsyncClient
ValueErrorr-   r*   rP   rQ   
is_addressr   r   formatr   rS   rT   get_transport_classr   updatestrrj   wait_forr   base64urlsafe_b64encoderstripdecodegetstatus_coder   r+   r>   r4   r5   elapsedtotal_secondsr   r@   r	   )rI   rJ   rK   r   rL   rM   r3   r6   r   r   r   r   r   r   r=   rB   r   r   r   urlrN   r   r   rZ   
the_clientrd   twirerE   s                               r   httpsr     s    : j):):;IJJ99;DXX$$U+ I23G	~#((--e4#**5$=C6??"%,,UD$?C224G~
 
-++-#+	I 5@5Hd6Y
   Z NN$=&)#d)n %--WdCW H ++D188>DKKME$--sGUENKW H! , c!X%9%9C%?$$*Fx++X-=-=%
 	
 			MM)' 	 	A ++-AF==H[  L!   s   ALK% &C+LK7LAL%K:&A"LK=	LLK?CL%K40L3K44L:L=L?LLL
LLtxn_managerlifetimeudp_modec
                   K   |#t         j                  j                  |      \  }}
nt         j                  j                  |      }
|j                  d   j
                  }|t         j                  j                  k(  }|j                         }|j                         }t         j                  j                  |       }t        |||      }| |f}t        |      \  }}d}|rd}|r&|t        j                  k7  rt         j"                  }d}nt         j$                  }d}|	st         j&                  j)                         }	|	j+                  ||d||t-        |             d{   }|4 d{    |r%|j/                  ||t-        |             d{    n<t1        j2                  dt5        |            |z   }|j7                  ||       d{    t         j                  j9                  |||
|      5 }d}d}|st        |      \  }}||||kD  r|}|rGt;        | |f|      }	 t-        |      }|j=                  d|       d{   \  }}t?        |||d      rnC8tA        |d|       d{   } t1        jB                  d|       \  }!tA        ||!|       d{   }|t         j                  j                  k(  }t         jD                  jG                  ||jH                  |jJ                  d||| |      }"	 |jM                  |"      }|"jR                  }|s|s7|jH                  r+"jT                  st         jV                  jY                  d	      ddd       ddd      d{    |ryy7 7 7 7 7 87 7 # t         j                  jN                  $ r0 |sJ |t        jP                  k(  r d}d}t        j                  }Y w xY w# 1 sw Y   xY w7 z# 1 d{  7  sw Y   xY ww)
am  Conduct an inbound transfer and apply it via a transaction from the
    txn_manager.

    *backend*, a ``dns.asyncbackend.Backend``, or ``None``.  If ``None``,
    the default, then dnspython will use the default backend.

    See :py:func:`dns.query.inbound_xfr()` for the documentation of
    the other parameters, exceptions, and return type of this method.
    Nr   TFru   r;   rh   )r4   r5   xfrorigintsig_ctxmultir3   zmissing TSIG)-r*   r   
make_queryextract_serial_from_queryquestionrdtype	rdatatypeIXFRfrom_wire_originr-   rP   rQ   r   r   r   NEVERr   rW   r~   rS   rT   rV   r#   r.   rw   packrj   rl   InboundrR   r<   r   rs   rx   r+   r>   r4   rX   process_messageUseTCPONLYr   had_tsig	exception	FormError)#rJ   r   r9   r   rK   r   rL   rM   r   rN   serialr   is_ixfrr   rB   r   r[   r\   r^   r!   retry	sock_typeis_udpr]   rm   inbounddoner   mexpirationr&   rwirerC   ry   rz   rE   s#                                      r   inbound_xfrr   l  s    * }'',,[92259^^A%%F***G))+F==?D		 	 	'B2v{3FT]F$X.OQ
E
x7==0))IF**IF&&::<G%%	1ffhz.B
 
  3	B 3	BhhtVXj-ABBBT3t95<ii
333fffE -B'5g'>$Q"*".;3K&0&.t}b&A"&.{&;G:;**UG:T4T1UL3 "L+t  !& # '4Aq+&F F%}}T59&3Aq+&F F$(:(::G-- %$)II %!)#)z)0 . 	A	!&66q9  !zzHQ R qzz--11.AA[-B3	B 3	B 
3	BB 4 5U !G F 77>> !%v#w||3!# $#*== !G-B -B3	B 3	B 3	B 3	Bs   EO8M1
O8)M4*O8-"O#M7<O#M:&O#3AOM='O-N .,ONAO9N
O9OO#O8&O!'O8/O84O87O#:O#=O OOA	OOOOO	O#!O8#O5)O,*O51O8
connectionc           	        K   t         j                  j                  st        d      d| _        | j                         }|r7t         j                  j                  }t         j                  j                  }|}n"t         j                  j                  |
      \  }} |       4 d{   } |||	|      4 d{   }|s|j                  ||||      }t        |      \  }}j                  |       d{   }|4 d{    |j                  |d       d{    |j                  t        |             d{   }ddd      d{    t        j                         }ddd      d{    t         j                  j!                  || j"                  | j$                  ||      }ddd      d{    t'        z
  d      _        | j)                  |      st*        |S 7 F7 57 7 7 7 7 # 1 d{  7  sw Y   xY w7 # 1 d{  7  sw Y   xY w7 m# 1 d{  7  sw Y   }xY ww)ai  Return the response obtained after sending an asynchronous query via
    DNS-over-QUIC.

    *backend*, a ``dns.asyncbackend.Backend``, or ``None``.  If ``None``,
    the default, then dnspython will use the default backend.

    See :py:func:`dns.query.quic()` for the documentation of the other
    parameters, exceptions, and return type of this method.
    zDNS-over-QUIC is not available.r   N)verify_modeserver_nameTrv   g        )r*   quic	have_quicr   idr-   null_factoryfactories_for_backendconnectr   make_streamsendreceiver   r   r+   r>   r4   r5   r    r@   r	   )rI   rJ   rK   r   rL   rM   r3   r6   r   r   rN   r   rB   cfactorymfactorythe_connectioncontextthe_managerstartr!   streamfinishrE   s                          r   r   r     s    0 88566AD99;D88((88((#"xx==gF8z 
 
W_
 
	! 
	!!,!4!4UD&+!V"0"9UJ)55g>>F D Dkk$---#^^Jz,BCCD D YY[F
	! 
	! KK!!II-+ " 

 
& %%AF==H-

	! ?D-CD D D D
	! 
	! 
	! 
	!
 
 
 
s  B#H>%G+&H>)H)9G.:H)=9H6G17
HG3
HG;G5
!G;=G7
>G;HG9H&H)1H2<H).H>9H':2H>.H)1H3H5G;7G;9H;HHH	HH)H$	HH$	 H)'H>)H;/H20H;7H>)N)
NNFFNr   FFFN)NrH   Nr   FFFFNNF)NrH   Nr   FFFNNNF)NFNr   F)NrH   Nr   FFNN)NU  Nr   FFNNNNT)
Nr   Nr   FFNTNN)K__doc__r   
contextlibr   rw   r   typingr   r   r   r   r   dns.asyncbackendr*   dns.exceptiondns.inetdns.messagedns.namedns.quic	dns.rcodedns.rdataclassdns.rdatatypedns.transactiondns._asyncbackendr   	dns.queryr	   r
   r   r   r   r   r   r   r   r   r   rP   low_level_address_tuplerR   r   r#   rS   DatagramSocketr+   r,   bytesfloatintr1   boolnameNametsigKeyrG   r   Backendr_   StreamSocketre   rn   rs   r{   rc   
SSLContextr   	AF_UNSPECr   r   transactionTransactionManagerr   r   AsyncQuicConnection r   r   <module>r     s	  $       4 4           )    88++  #'	



)
)
##U*
+  	
 3:@ "&"&#";?#&! %+/:0



)
):0#:0 :0 	:0
 :0 d388==#((,,678:0 %:0 :0 :0 :0 CKK''(:0 	:0@  $ #"! %6:26?
{{?? e_? 	?
 SM? ? ? ? ? ? 3##22
3? c&&../? ? 	[[?J  $ #"!:>8<26A 
{{A A  e_A  	A 
 SMA  A  A  A  A  s''667A  s''445A  c&&../A  A  3;;$%A N #'$



'
'$
##U*
+$ $ 3:	$2  #'";?#&!



'
'  d388==#((,,678	
 %  3;;%&B  $ "!48265
{{55 e_5 	5
 SM5 5 5 5 3##00
15 c&&../5 	[[5v  $ "!4826,0%)#C
{{CC e_C 	C
 SMC C C C 3##00
1C c&&../C #..)C c]C $)C 	[[CR  $ "!,0#'+7;",,r
{{rr e_r 	r
 SMr r r r ()r r r $)r  }r 34r SMr  	[[!rp ,0# $ 26bBbB33bB CKK''(bB 	bB
 e_bB uobB SMbB bB bB c&&../bB 
bBP  $ "!9=#26%);
{{;; e_; 	;
 SM; ; ; ; 556; $); c&&../; c]; 	[[;r   