
    i`              "      Z   % S SK Jr  / SQrS SKrS SKrS SKrS SKrS SKJr  S SK	J
r
  S SKJr  S SKJr  S SKJrJrJrJrJrJrJr  S S	KJrJrJrJrJrJr  S
SKJrJ r J!r!  S
SK"J#r#J$r$  S
SK%J&r&  SSK'J(r(  SSK)J*r*J+r+  SSK,J-r-  SSK.J/r/J0r0J1r1J2r2J3r3J4r4  SSK5J6r6  \(       a   S
SK"J7r7  SSK'J8r8  SSK,J9r9  SSK.J:r:J;r;  SSK<J=r=  \S   r>\S   r?\@" S5      rA\B" 5       rCS\DS'       S2S jrES3S jrFS4S5S! jjrGS6S" jrH\I" S#5      rJS7S$ jrKS7S% jrL S8       S9S& jjrMS:S;S' jjrNS:S<S( jjrOS=S) jrPS8S>S* jjrQS?S+ jrRS@S, jrS/ SSS/ / SS\CS-S./ SS/ SS/SSSSSS-S SSSSS SSSSS0.!                                                                       SAS1 jjrTg)B    )annotations)HttpVersionLiteralset_curl_optionsnot_setN)Counter)BytesIO)dumps)Callable)TYPE_CHECKINGAnyFinalLiteralOptionalUnioncast)ParseResult	parse_qslquote	urlencodeurljoinurlparse   )CurlHttpVersionCurlOptCurlSslVersion)CURL_WRITEFUNC_ERRORCurlMime)CurlCffiWarning   )Cookies)ImpersonateError
InvalidURL)Headers)TLS_CIPHER_NAME_MAPTLS_EC_CURVES_MAPTLS_VERSION_MAPExtraFingerprintsnormalize_browser_typetoggle_extension)Request)Curl)CookieTypes)HeaderTypes)BrowserTypeLiteralExtraFpDict)	ProxySpec)	GETPOSTPUTDELETEOPTIONSHEADTRACEPATCHQUERY)v1v2v2tlsv2_prior_knowledgev3v3onlyz!#$%&'()*+,/:;=?@[]~z
Final[Any]r   c                   U S:X  a  [         R                  $ U S:X  a  [         R                  $ U S:X  a  [         R                  $ U S:X  a  [         R                  $ U S:X  a  [         R
                  $ U S:X  a  [         R                  $ U $ )Nr:   r>   r?   r;   r<   r=   )r   V1_1V3V3ONLYV2_0V2TLSV2_PRIOR_KNOWLEDGE)versions    E/app/mltbenv/lib/python3.13/site-packages/curl_cffi/requests/utils.pynormalize_http_versionrI   5   s     $###	D!!!	H	%%%	D###	G	$$$	(	(111N    c                h    [        U 5      n[        UR                  =(       a    UR                  5      $ )z,Check if the provided url is an absolute url)r   boolschemehostname)url
parsed_urls     rH   is_absolute_urlrQ   H   s'    #J
!!9j&9&9::rJ    c           	     H   SR                  [        [        U5      -
  5      n[        U 5      n[	        UR
                  SS9n[        USUS9n[        UR                  UR                  [        UR                  US9UR                  UUR                  5      R                  5       $ )NrR   Tkeep_blank_values)doseqsaferW   )join
SAFE_CHARSsetr   r   queryr   r   rM   netlocr   pathparamsfragmentgeturl)rO   	quote_strrW   rP   parsed_get_argsencoded_get_argss         rH   quote_path_and_paramsre   N   s    77:I./D#J
 0 0DIO 4HjooD) fhrJ   c                   [        U 5      n[        UR                  SS9n[        S U 5       5      n[	        U[
        5      (       a  [        UR                  5       5      n[        S U 5       5      nU H  u  pg[	        U[        [
        45      (       a  [        U5      nUR                  U5      S:X  a4  UR                  U5      S:X  a  U Vs/ s H  oS   U:w  a  UOXg4PM     nnMt  UR                  Xg45        M     [        USS9n	[        UR                  UR                  UR                   UR"                  U	UR$                  5      R'                  5       n
U
$ s  snf )a  Add URL query params to provided URL being aware of existing.

Args:
    url: string of target URL
    params: dict containing requested params to be added

Returns:
    string with updated URL

>> url = 'http://stackoverflow.com/test?answers=true'
>> new_params = {'answers': False, 'data': ['some','values']}
>> update_url_params(url, new_params)
'http://stackoverflow.com/test?data=some&data=values&answers=false'
TrT   c              3  *   #    U  H	  oS    v   M     g7fr   N .0xs     rH   	<genexpr>$update_url_params.<locals>.<genexpr>s   s     =_t_   c              3  *   #    U  H	  oS    v   M     g7frh   ri   rj   s     rH   rm   rn   v   s     4VtVro   r   r   )rV   )r   r   r\   r   
isinstancedictlistitemsrL   r	   getappendr   r   rM   r]   r^   r_   r`   ra   )rO   r_   rP   rc   old_args_counternew_args_counterkeyvaluerl   rd   new_urls              rH   update_url_paramsr|   ]   sN     #J  
 0 0DIO =_==&$flln%4V44
edD\**%LE$).>.B.B3.G1.L>M>Mdck|3o  O ""C<0  !=  fh  N)s   EzBABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~c                   U R                  S5      n[        S[        U5      5       Hp  nX   SS n[        U5      S:X  aN  UR                  5       (       a9   [	        [        US5      5      nU[        ;   a  XAU   SS -   X'   M\  SX    3X'   Mg  SX    3X'   Mr     S	R                  U5      $ ! [         a  n[        SU S35      UeSnAff = f)
zUn-escape any percent-escape sequences in a URI that are unreserved
characters. This leaves all reserved, illegal and non-ASCII bytes encoded.
%r   r   r      z"Invalid percent-escape sequence: ''NrR   )
splitrangelenisalnumchrint
ValueErrorr"   UNRESERVED_SETrY   )uripartsihces         rH   unquote_unreservedr      s     IIcNE1c%j!HQqMq6Q;199;;SAr
O N"Qx|+uxj>58*~EH " 775>  S #EaS!JKQRRSs   B,,
C6CCc                d    SnSn [        [        U 5      US9$ ! [         a    [        XS9s $ f = f)zRe-quote the given URI.

This function passes the given URI through an unquote/quote cycle to
ensure that it is fully and consistently quoted.
z!#$%&'()*+,/:;=?@[]~|z!#$&'()*+,/:;=?@[]~|rX   )r   r   r"   )r   safe_with_percentsafe_without_percents      rH   requote_urir      sG     01	5 ',3DEE 5 S44	5s    //c                    Sn[        U 5       HN  u  pVUR                  5       R                  UR                  5       S-   5      (       d  M<  SnU(       a	  U SU 3X'     O   U(       d  U R                  U SU 35        gg)z*Update header line list by key value pair.F:T: N)	enumeratelower
startswithrv   )header_linesry   rz   replacefoundidxlines          rH   update_header_liner      s}     E|,	::<""399;#455E'*e2eW$5! - se2eW-. rJ   c                F     U R                   S   $ ! [         a    Us $ f = fNr   )queue
IndexErrorqdefaults     rH   
peek_queuer      s)    wwqz       c                F     U R                   S   $ ! [         a    Us $ f = fr   )_queuer   r   s     rH   peek_aio_queuer      s)    xx{ r   c                h    1 SknX-
  nU H  n[        XSS9  M     X!-
  nU H  n[        XSS9  M     g )N>   r     
         r      #   +   -   3   T)enableF)r)   )curlextension_idsdefault_enabledto_enable_idsext_idto_disable_idss         rH   toggle_extensions_by_idsr      sA    DO!3Md3  
 %4N e4 !rJ   c                6   UR                  S5      u  p4pVn[        [        U5         nU R                  [        R
                  U[        R                  -  5        U[        R                  :X  d   S5       e/ n	UR                  S5       HT  n
[        U
5      n[        R                  " U5      nU(       d  [        S[        U5       S35      eU	R                  U5        MV     U R                  [        R                  SR                  U	5      5        UR!                  S5      (       a  USS	 n["        R$                  " S
[&        SS9  [)        S UR                  S5       5       5      n[+        X5        U(       d   U R                  [        R,                  U5        / nUR                  S5       H(  n[        U5      n[.        U   nUR                  U5        M*     U R                  [        R0                  SR                  U5      5        [        U5      S:X  d   S5       eg)zm
Detailed explanation: https://engineering.salesforce.com/tls-fingerprinting-with-ja3-and-ja3s-247362855967/
,zOnly TLS v1.2 works for now.-zCipher z is not foundr   z-21NzPadding(21) extension found in ja3 string, whether to add it should be managed by the SSL engine. The TLS client hello packet may contain or not contain this extension, any of which should be correct.r   
stacklevelc              3  8   #    U  H  n[        U5      v   M     g 7fN)r   )rk   r   s     rH   rm   "set_ja3_options.<locals>.<genexpr>  s     >(=1A(=s   r   z%Only curve_formats == 0 is supported.)r   r&   r   setoptr   
SSLVERSIONr   MAX_DEFAULTTLSv1_2r$   ru   r!   hexrv   SSL_CIPHER_LISTrY   endswithwarningswarnr   r[   r   TLS_EXTENSION_ORDERr%   SSL_EC_CURVES)r   ja3permutetls_versionciphers
extensionscurvescurve_formatscurl_tls_versioncipher_namescipher	cipher_idcipher_namer   curve_namescurvecurve_id
curve_names                     rH   set_ja3_optionsr      s    ?Biin;K*m&s;'78KK""$4~7Q7Q$QR~555U7UU5L--$K	)--i8"WS^,<M#JKKK( % 	KK'',)?@5!!_
M 	
 >
(8(8(=>>MT1G//<Kc"u:&x0
:& #
 	KK%%sxx'<=}"K$KK"rJ   c                   UR                  S5      u  p#pEUR                  SS5      nU R                  [        R                  [
        R                  5        U R                  [        R                  U5        U R                  [        R                  [        U5      5        US:w  a   U R                  [        R                  U5        U R                  [        R                  UR                  SS5      5        g)z
Detailed explanation: https://www.blackhat.com/docs/eu-17/materials/eu-17-Shuster-Passive-Fingerprinting-Of-HTTP2-Clients-wp.pdf
|r   ;0rR   N)r   r   r   r   HTTP_VERSIONr   rD   HTTP2_SETTINGSHTTP2_WINDOW_UPDATEr   HTTP2_STREAMSHTTP2_PSEUDO_HEADERS_ORDER)r   akamaisettingswindow_updatestreamsheader_orders         rH   set_akamai_optionsr   $  s     6<\\#5F2HW S)HKK$$o&:&:;KK&&1KK++S-?@#~G))73 	KK22L4H4Hb4QRrJ   c                :   UR                   (       a9  U R                  [        R                  SR	                  UR                   5      5        U R                  [        R
                  UR                  [        R                  -  5        U R                  [        R                  [        UR                  5      5        U R                  [        R                  [        UR                  5      5        U R                  [        R                  UR                  5        U R                  [        R                   UR"                  5        U R                  [        R$                  UR&                  5        UR(                  (       a*  U R                  [        R*                  UR(                  5        UR,                  (       a*  U R                  [        R.                  UR,                  5        UR0                  (       a+  U R                  [        R2                  UR0                  5        g g )Nr   )tls_signature_algorithmsr   r   SSL_SIG_HASH_ALGSrY   r   tls_min_versionr   r   
TLS_GREASEr   
tls_greaseSSL_PERMUTE_EXTENSIONStls_permute_extensionsSSL_CERT_COMPRESSIONtls_cert_compressionSTREAM_WEIGHThttp2_stream_weightSTREAM_EXCLUSIVEhttp2_stream_exclusivetls_delegated_credentialTLS_DELEGATED_CREDENTIALStls_record_size_limitTLS_RECORD_SIZE_LIMIThttp2_no_priorityHTTP2_NO_PRIORITY)r   fps     rH   set_extra_fpr  :  sK   	""G--sxx8S8S/TUKK""B$6$69S9S$STKK""C$67KK..B4M4M0NOKK,,b.E.EFKK%%r'='=>KK(("*C*CD	""G55r7R7RS	G1123K3KL	G--r/C/CD rJ   T   zgzip, deflate, br, zstd)!params_listbase_urldatajsonheaders_listcookies_listfilesauthtimeoutallow_redirectsmax_redirectsproxies_listproxy
proxy_authverify_listrefereraccept_encodingcontent_callbackimpersonater   r   extra_fpdefault_headersr   http_version	interfacecertstreammax_recv_speed	multipartqueue_classevent_classcurl_optionsc       !   	     (  ^H^I^J U n$UR                  5       nUS:X  a!  U$R                  [        R                  S5        O4US:w  a.  U$R                  [        R                  UR                  5       5        US:X  a   U$R                  [        R                  S5        Uu  n%n&U%(       a  [        UU%5      nU&(       a  [        UU&5      nU(       a  [        XB5      nU(       a
  [        UUS9nUSLa  [        U5      nU$R                  [        R                  UR                  5       5        [        U[        [        [        45      (       a  [!        U5      R                  5       n'Ou[        U["        5      (       a  UR                  5       n'OO[        U[$        5      (       a  UR'                  5       n'O)[        U[(        5      (       a  Un'OUc  Sn'O[+        S5      eUb  [-        US	S
9R                  5       n'U'(       d  US;   ao  U$R                  [        R.                  U'5        U$R                  [        R0                  [3        U'5      5        US:X  a   U$R                  [        R                  U5        Uu  n(n)[        U)[4        5      (       a  U)R6                  OS n*[5        U(U*S9n+U+R9                  U)5        U+R;                  S5      n,U,b=  [=        U5      n-U,U-R>                  :X  d  U,U-R@                  :X  a  U+RC                  SS 5        / n.U+RE                  5        HQ  u  n/n0U0c  U.RG                  U/ S35        M  U0S:X  a  U.RG                  U/ S35        M;  U.RG                  U/ SU0 35        MS     Ub  [I        U.SS5        [        U[        5      (       a  US:w  a  [I        U.SS5        [        U["        [(        45      (       a  U(       a  [I        U.SS5        [I        U.SSSS9  U$R                  [        RJ                  U. V+s/ s H  n+U+R                  5       PM     sn+5        [M        UW+U5      n1U$R                  [        RN                  S5        U$R                  [        RP                  S5        Uu  n2n3U2(       aF  U2RS                  U15       H1  n4U R                  [        RP                  U4RU                  5       5        M3     U3(       aQ  [W        U35      n5U5RS                  U15       H1  n4U R                  [        RP                  U4RU                  5       5        M3     U	(       a  [Y        S5      eU (       a  [[        [        U=(       d    0 5      R]                  5        H;  u  n/n0U R_                  U/[        U0["        5      (       a  U0R                  5       OU0S9  M=     U$R                  [        R`                  U Rb                  5        U
(       aa  U
u  n6n7U$R                  [        Rd                  U6R                  5       5        U$R                  [        Rf                  U7R                  5       5        Uc  Sn[        U[        5      (       a  Uu  n8n9U8U9-   n:U$R                  [        Rh                  [k        U8S-  5      5        U(       d.  U$R                  [        Rl                  [k        U:S-  5      5        GO$U$R                  [        Rn                  S5        U$R                  [        Rp                  [r        Rt                  " U:5      5        O[        U[j        [v        45      (       a  U(       d-  U$R                  [        Rl                  [k        US-  5      5        OU$R                  [        Rh                  [k        US-  5      5        U$R                  [        Rn                  S5        U$R                  [        Rp                  [r        Rt                  " U5      5        U$R                  [        Rx                  [k        U5      5        U$R                  [        Rz                  U5        Uu  n;n<U(       a  U<(       a  [+        S5      eU(       a  SU0n<U<c  U;n<U<(       Ga  U$R                  [        R|                  S5        [=        U5      n=[[        [~        ["           U<R;                  U=R                  U<R;                  S5      5      5      nU=R@                  (       aP  U<R;                  U=R                   S U=R@                   3U<R;                  S!U=R@                   35      5      =(       d    UnUb  U$R                  [        R                  U5        U=R                  S":X  af  UR                  S#5      (       a  [        R                  " S$[        S%S&9  UR                  S'5      (       d   U$R                  [        R                  S5        U(       aa  Uu  n6n7U$R                  [        R                  U6R                  5       5        U$R                  [        R                  U7R                  5       5        Uu  n>n?U?SL d
  U>(       dC  U?c@  U$R                  [        R                  S5        U$R                  [        R                  S5        [        U?["        5      (       a   U$R                  [        R                  U?5        U?S(;   a5  [        U>["        5      (       a   U$R                  [        R                  U>5        U(       a.  U$R                  [        R                  UR                  5       5        Ub.  U$R                  [        R                  UR                  5       5        U(       a{  [        U["        5      (       a!  U$R                  [        R                  U5        OEUu  nn@U$R                  [        R                  U5        U$R                  [        R                  U@5        U(       a0  [        U5      nU$R                  UUS)9nAUAS:w  a  [        S*U S+35      eU(       aM  [        U[        5      (       a  [        S20 UD6nU(       a  [        R                  " S,[        SS&9  [        U$U5        U(       a  U(       a  [        R                  " S-[        SS&9  SnB[        U[        5      (       a  UR                  (       a  SnB[        U[        5      (       a  UR;                  S.5      (       a  SnB[        U$UWBS/9  U(       a-  U(       a  [        R                  " S0[        SS&9  [        U$U5        U(       a+  [        U5      nU$R                  [        R                  U5        S nCS mIS mHS mJU(       a>  U!" 5       mIU"" 5       mHU"" 5       mJUHUIUJ4S1 jnDU$R                  [        R                  UD5        ONUb!  U$R                  [        R                  U5        O*[%        5       nCU$R                  [        R                  UC5        [%        5       nEU$R                  [        R                  UE5        U(       a.  U$R                  [        R                  UR                  5       5        U$R                  [        R                  U5        U#(       a,  U#R]                  5        H  u  nFnGU$R                  UFUG5        M     U1WCWETITHTJ4$ s  sn+f )3Nr2   r   r1   r6   )rb   FrJ   z3data must be dict/list/tuple, str, BytesIO or bytes)r   r   )
separators)r2   r3   r8   )encodingHostr   rR   r   r   zContent-Typezapplication/jsonz!application/x-www-form-urlencodedzapplication/octet-streamExpectT)r   ALLzfiles is not supported, use `multipart`. See examples here: https://github.com/lexiforest/curl_cffi/blob/main/examples/upload.py)namer  r   i  z)Cannot specify both 'proxy' and 'proxies'allz://zall://httpszhttps://zMake sure you are using https over https proxy, otherwise, the proxy prefix should be 'http://' not 'https://', see: https://github.com/lexiforest/curl_cffi/issues/6r   r   socks)NT)r  zImpersonating z is not supportedzBExtra fingerprints was altered after impersonated version was set.z?JA3 fingerprint was altered after impersonated version was set.r   )r   zBAkamai fingerprint was altered after impersonated version was set.c                   > TR                  5       (       d  TR                  5         TR                  5       (       a  [        $ TR                  U 5        [	        U 5      $ r   )is_setr[   r   
put_nowaitr   )chunkheader_recvedr   quit_nows    rH   qputset_curl_options.<locals>.qput  sG     ''))!!#  ++LLu:rJ   ri   )_upperr   r   r2   CUSTOMREQUESTencodeNOBODYr|   r   re   r   URLrq   rr   rs   tupler   strr   readbytes	TypeErrorr	   
POSTFIELDSPOSTFIELDSIZEr   r#   r)  updateru   r   r]   rN   popmulti_itemsrv   r   
HTTPHEADERr*   
COOKIEFILE
COOKIELISTget_cookies_for_curlto_curl_formatr    NotImplementedErrorr   rt   addpartMIMEPOST_formUSERNAMEPASSWORDCONNECTTIMEOUT_MSr   
TIMEOUT_MSLOW_SPEED_LIMITLOW_SPEED_TIMEmathceilfloatFOLLOWLOCATION	MAXREDIRSPROXY_CREDENTIAL_NO_REUSEr   rM   PROXYr   r   r   r   HTTPPROXYTUNNELPROXYUSERNAMEPROXYPASSWORDSSL_VERIFYPEERSSL_VERIFYHOSTCAINFOREFERERACCEPT_ENCODINGSSLCERTSSLKEYr(   r  r!   r'   r  r   r   r   rI   r   WRITEFUNCTION	WRITEDATA
HEADERDATA	INTERFACEMAX_RECV_SPEED_LARGE)Kr   methodrO   r	  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r  r  r   r  r  r   r!  r"  r#  r$  r%  r&  r   base_paramsr_   bodybase_headersheadersr)  r   host_headerur   kvreqbase_cookiescookiesmorseltemp_cookiesusernamepasswordconnect_timeoutread_timeoutall_timeoutbase_proxiesproxiesr   base_verifyverifyry   retr   bufferr7  header_bufferoptionsettingr5  r   r6  sK                                                                           @@@rH   r   r   L  s   N 	A\\^F 	q!	5	&&8	# &K[1V,h$#C59E#HHW[[#**,' $tU+,,%%'	D#		{{}	D'	"	"yy{	D%	 	 	MNNTj188: v11	##T*	&&D	2U?HHW**F3 )L'#-gw#?#?wTHx0AHHW
 %%-KSM!(("kQZZ&?EE&$ L191#Q("W1#Q(1#Rs,   <9KL$&F"2.*M	
 $e%%$<9ST |Xr4@HHWl!Cl!((*l!CD
#q&
!C HHW%HHW'(L'"77<FKK**F,A,A,CD =w'"77<FKK**F,A,A,CD = !S
 	
 tzr*002DAq1As9K9K188:QRS 3	!!9??3 !(	!!8??#45	!!8??#45 '5!!(/%%4	**C$0F,GHHHW''[4-?)@A HHW,,a0HHW++TYY{-CD	Gc5\	*	*HHW''Wt^)<=HHW..GdN0CDHHW,,a0HHW++TYYw-?@ HHW##S%9: HHW. )L'CDD%.
 	
22A6Xc]GKKgkk%>P$QR>>||nC'78KK&(8 9:    HHW]]E*||w&##J//MMP (#$ ''00HHW44a8 %/"(..0AB..0AB &Kkfn	''+	''+ &#	( *[#">">	- 	'.."23 "	((/*@*@*BC dC  HHW__d+ID#HHW__d+HHW^^S) ,[9mmKmI!8"^K=@Q#RSS h%%(484HMMT
 	Q! MMQ
 h 122x7V7VGh%%(,,7O*P*PG30 MMT
 	1f% -l;	%%|4FAMHM#=	 	
&&-		%	&&(89	""F+IMHHW/ 	""I$4$4$67 HHW))>: +113OFGHHVW%  4 q-AAW "Ds   5z
)rG   z*Union[CurlHttpVersion, HttpVersionLiteral]returnr   )rO   r?  r  rL   )rR   )rO   r?  rb   r?  )rO   r?  r_   zUnion[dict, list, tuple]r  r?  )r   r?  r  r?  )F)r   z	list[str]ry   r?  rz   r?  r   rL   r   )r   zqueue.Queue)r   zasyncio.Queue)r   r+   )r   r+   r   r?  r   rL   )r   r+   r   r?  )r   r+   r  r'   )Hr   r+   rm  
HttpMethodrO   r?  r	  z$list[Union[dict, list, tuple, None]]r
  Optional[str]r  zAOptional[Union[dict[str, str], list[tuple], str, BytesIO, bytes]]r  zOptional[dict | list]r  zlist[Optional[HeaderTypes]]r  zlist[Optional[CookieTypes]]r  zOptional[dict]r  Optional[tuple[str, str]]r  z3Optional[Union[float, tuple[float, float], object]]r  Optional[bool]r  zOptional[int]r  zlist[Optional[ProxySpec]]r  r  r  r  r  zlist[Union[bool, str, None]]r  r  r  r  r  zOptional[Callable]r  z(Optional[Union[BrowserTypeLiteral, str]]r   r  r   r  r  z/Optional[Union[ExtraFingerprints, ExtraFpDict]]r  rL   r   zUnion[str, Literal[False]]r  z4Optional[Union[CurlHttpVersion, HttpVersionLiteral]]r  r  r   z%Optional[Union[str, tuple[str, str]]]r!  r  r"  r   r#  zOptional[CurlMime]r$  r   r%  r   r&  zOptional[dict[CurlOpt, str]])U
__future__r   __all__asynciorW  r   r   collectionsr   ior   r  r	   collections.abcr
   typingr   r   r   r   r   r   r   urllib.parser   r   r   r   r   r   constr   r   r   r   r   r   utilsr   rx  r    
exceptionsr!   r"   rq  r#   r  r$   r%   r&   r'   r(   r)   modelsr*   r+   r,   r-   r.   r/   sessionr0   r  r   r[   rZ   objectr   __annotations__rI   rQ   re   r|   	frozensetr   r   r   r   r   r   r   r   r   r  r   ri   rJ   rH   <module>r     sT   "
?        $ L L L T T < < 1 #  4   $$<" P
 VW '(
h 7&;4v M
,5, DI//"%/.1/<@/5"+L\S,E. 9;"NR"&0202 &*CJ&*#%.0,002!%>+/<@ @D (*IM#26!$(15KoB
oBoB 
oB
 6oB oB LoB  oB .oB .oB oB $oB AoB $oB !oB  ,!oB" #oB$ *%oB& .'oB( )oB* #+oB, )-oB. :/oB0 
1oB2 3oB4 >5oB6 7oB8 &9oB: G;oB< =oB> 0?oB@ AoBB CoBD "EoBF GoBH IoBJ /KoBrJ   