
    /jل                         S SK r S SKrS SKrS SKJrJrJrJrJrJ	r	J
r
  S SKrSSKJr  SSKJrJrJrJrJrJr   " S S5      rg)    N)LiteralSequenceOptionalListUnionAsyncGenerator	Awaitable   )get_max_items_from_list)UsageLimitExceededErrorInvalidAPIKeyErrorMissingAPIKeyErrorBadRequestErrorForbiddenErrorTimeoutErrorc            )          \ rS rSrSr       SMS\\   S\\   S\\\\4      S\\   S\\   S	\\   S
\\	R                     4S jjrS rS rS r                  SNS\S\S   S\S   S\S   S\S\S\S\S\\   S\\   S\\\S   4   S\\\S   4   S \S!\S"\S#\S$\S%\S&\S'\4(S( jjr                  SNS\S\S   S\S   S\S   S\S\S\S\S\\   S\\   S\\\S   4   S\\\S   4   S \S!\S"\S#\S$\S%\S&\S'\4(S) jjr        SOS*\\\   \4   S \S+\S   S,\S   S!\S$\S%\S\S-\S'\4S. jjr        SOS*\\\   \4   S \S+\S   S,\S   S!\S$\S%\S\S-\S'\4S/ jjr                SPS0\S1\S2\S3\S4\S5\\   S6\\   S7\\   S\\   S8\S \S+\S   S,\S   S!\S$\S%\S-\S'\4$S9 jjr                SPS0\S1\S2\S3\S4\S5\\   S6\\   S7\\   S\\   S8\S+\S   S \S,\S   S!\S$\S%\S-\S'\4$S: jjr            SQS0\S1\S2\S3\S4\S5\\   S6\\   S7\\   S\\   S8\S \S!\S%\S'\4S; jjr            SQS0\S1\S2\S3\S4\S5\\   S6\\   S7\\   S\\   S8\S \S!\S%\S'\4S< jjr          SRS\S\S   S\S   S\S\S\\   S\\   S=\S!\S"\S$\S'\4S> jjr         SSS\S\S   S\S   S\S\S\\   S\\   S!\S"\S$\S'\4S? jjr    STS\S\S   S\S!\S"\S'\\   4S@ jjr     SUSA\SB\SC   SD\SE\SF\SG   S!\\   S'\\ \!S4   \"\   4   4SH jjr#     SUSA\SB\SC   SD\SE\SF\SG   S!\\   S'\\\ \!S4   4   4SI jjr$SJ\S'\4SK jr%SLr&g)VAsyncTavilyClient   z 
Async Tavily API client class.
Napi_keycompany_info_tagsproxiesapi_base_urlclient_source
project_idclientc           	      P   Uc  [         R                  " S5      nU(       d  Uc
  [        5       eU=(       d    [         R                  " S5      nU=(       d    SU l        X l        SS0U(       a  SSU 30O0 ESU=(       d    S	0EU(       a  S
U0O0 En	US LU l        Ub  Xpl        U	R                  5        H8  u  pXR                  R                  ;  d  M   XR                  R                  U
'   M:     [        U R                  R                  5      (       d  U R                  U R                  l
        g g U=(       d    0 nUR                  S[         R                  " S5      5      UR                  S[         R                  " S5      5      S.nUR                  5        V
Vs0 s H  u  pU(       d  M  X_M     nn
nU(       a8  UR                  5        VVs0 s H  u  pU[        R                  " US9_M     snnOS n[        R                  " U	U R                  US9U l        g s  snn
f s  snnf )NTAVILY_API_KEYTAVILY_PROJECTzhttps://api.tavily.comzContent-Typezapplication/jsonAuthorizationzBearer zX-Client-Sourceztavily-pythonzX-Project-IDhttpTAVILY_HTTP_PROXYhttpsTAVILY_HTTPS_PROXY)zhttp://zhttps://)proxy)headersbase_urlmounts)osgetenvr   _api_base_url_company_info_tags_external_client_clientitemsr%   strr&   gethttpxAsyncHTTPTransportAsyncClient)selfr   r   r   r   r   r   r   tavily_projectdefault_headerskeyvaluemapped_proxiesschemer$   proxy_mountss                   D/app/agent/.venv/lib/python3.13/site-packages/tavily/async_tavily.py__init__AsyncTavilyClient.__init__   s    ?ii 01G6>$&&#Bryy1A'B)E-E"3 .
9@77)!45b
 }?
 4B/r	
 !'d 2!L-335
ll22205LL((- 6 t||,,--(,(:(:% . mG #;;vryy9L/MN#KK;O1PQN
 <J;O;O;Q[;QZSUZjcj;QN[ " UcThThTjkTj=611>>Tjk  !,,'++#DL \ ls   H,H!H"c                 x   #    U R                   (       d#  U R                  R                  5       I Sh  vN   gg N7f)z7Close the client and release connection pool resources.N)r,   r-   acloser4   s    r<   closeAsyncTavilyClient.closeK   s,     $$,,%%''' %'s   /:8:c                    #    U $ 7fN rA   s    r<   
__aenter__AsyncTavilyClient.__aenter__P   s
     s   c                 @   #    U R                  5       I S h  vN   g  N7frE   )rB   )r4   exc_typeexc_valexc_tbs       r<   	__aexit__AsyncTavilyClient.__aexit__S   s     jjls   querysearch_depth)basicadvancedfastz
ultra-fasttopic)generalnewsfinance
time_range)dayweekmonthyear
start_dateend_datedaysmax_resultsinclude_domainsexclude_domainsinclude_answer)rQ   rR   include_raw_content)markdowntextinclude_imagestimeoutcountryauto_parametersinclude_faviconinclude_usageexact_matchreturnc                   #    0 SU_SU_SU_SU_SU_SU_SU_SU_S	U_S
U_SU	_SU
_SU_SU_SU_SU_SU_SU0EnUR                  5        VVs0 s H  u  nnUc  M  UU_M     nnnU(       a  UR                  U5        [        US5      n U R                  R	                  S[
        R                  " U5      US9I Sh  vN nUR                  S:X  a  UR                  5       $ Sn UR                  5       R                  S0 5      R                  SS5      nUR                  S:X  a  [        U5      eUR                  S;   a  [        U5      eUR                  S:X  a  [        U5      eUR                  S:X  a  [!        U5      eUR#                  5       es  snnf  N! [        R                   a    [        U5      ef = f! [         a     Nf = f7f)z8
Internal search method to send the request to the API.
rO   rP   rT   rX   r]   r^   r_   rc   rd   r`   ra   rb   rg   ri   rj   rk   rl   rm   Nx   z/searchcontentrh       detailerror  i  i  i      )r.   updateminr-   postjsondumpsr1   TimeoutExceptionr   status_coder0   	Exceptionr   r   r   r   raise_for_status)r4   rO   rP   rT   rX   r]   r^   r_   r`   ra   rb   rc   rd   rg   rh   ri   rj   rk   rl   rm   kwargsdatakvresponseru   s                             r<   _searchAsyncTavilyClient._searchV   sO    4
U
L
 U
 *	

 *
 
 D
 n
 "#6
 ;
 
 
 n
 w
 
  !
" ]#
$ ;%
* "&?A1?KKgs#	(!\\..y$**TBR\c.ddH 3&==?"F!,,Xr:>>wM ##s*-f55%%6$V,,%%,(00%%,%f--//11= @ e%% 	(w''	(  sg   AG
FF$'G2F >F?F "G&0F= BGF  F::G=
G
G	G

Gc                    #    [        US5      nU R                  " U40 SU_SU_SU_SU_SU_SU_SU_S	U	_S
U
_SU_SU_SU_SU_SU_SU_SU_SU_SU_UD6I Sh  vN nUR                  S/ 5      nUUS'   U$  N7f)zb
Combined search method. Set search_depth to either "basic", "advanced", "fast", or "ultra-fast".
rp   rP   rT   rX   r]   r^   r_   r`   ra   rb   rc   rd   rg   rh   ri   rj   rk   rl   rm   Nresultsr|   r   r0   )r4   rO   rP   rT   rX   r]   r^   r_   r`   ra   rb   rc   rd   rg   rh   ri   rj   rk   rl   rm   r   response_dicttavily_resultss                          r<   searchAsyncTavilyClient.search   s    2 gs#"ll5 -8D-16- 7A- 7A	-
 5=- 15- 8C- <K- <K- ;I- @S- ;I- 4;- 4;- <K-  <K!-" :G#-$ 8C-3'- -, '**9b9#1i 5-s   AA;A9A;urlsextract_depthformatchunks_per_sourcec
           
      (  #    UUUUUUUUU	S.	nUR                  5        VVs0 s H  u  pUc  M
  X_M     nnnU
(       a  UR                  U
5         U R                  R                  S[        R
                  " U5      US9I Sh  vN nUR                  S:X  a  UR	                  5       $ Sn UR	                  5       R                  S0 5      R                  SS5      nUR                  S	:X  a  [        U5      eUR                  S
;   a  [        U5      eUR                  S:X  a  [        U5      eUR                  S:X  a  [        U5      eUR!                  5       es  snnf  N! [        R                   a    [        U5      ef = f! [         a     Nf = f7f)z
Internal extract method to send the request to the API.
include_favicon: If True, include the favicon in the extraction results.
)	r   rg   r   r   rh   rk   rl   rO   r   Nz/extractrq   rs   rt   ru   rv   rw   rx   ry   rz   )r.   r{   r-   r}   r~   r   r1   r   r   r   r0   r   r   r   r   r   r   )r4   r   rg   r   r   rh   rk   rl   rO   r   r   r   r   r   r   ru   s                   r<   _extractAsyncTavilyClient._extract   s    $ ,*.*!2

 "&??KK	(!\\..z4::dCS]d.eeH 3&==?"F!,,Xr:>>wM
 ##s*-f55%%6$V,,%%,(00%%,%f--//11; @ f%% 	(w''	(  sc    F	EEF2E EE "F+0F BFE  E??F
FFFFc
                    #    U R                   " UUUUU4UUUU	S.U
D6I Sh  vN nUR                  S/ 5      nUR                  S/ 5      nXS'   XS'   U$  N27f)zc
Combined extract method.
include_favicon: If True, include the favicon in the extraction results.
)rk   rl   rO   r   Nr   failed_results)r   r0   )r4   r   rg   r   r   rh   rk   rl   rO   r   r   r   r   r   s                 r<   extractAsyncTavilyClient.extract  s       #mmD,:,9,2,3	
.
 =L:G27>O
. /5
. 
. '**9b9&**+;R@#1i *8&'%
.s    AA3Aurl	max_depthmax_breadthlimitinstructionsselect_pathsselect_domainsexclude_pathsallow_externalc                 ~  #    0 SU_SU_SU_SU_SU_SU_SU_SU_S	U	_S
U
_SU_SU_SU_SU_SU_SU_SU_nU(       a  UR                  U5        UR                  5        VVs0 s H  u  nnUc  M  UU_M     nnn U R                  R                  S[        R
                  " U5      US9I Sh  vN nUR                  S:X  a  UR	                  5       $ Sn UR	                  5       R                  S0 5      R                  SS5      nUR                  S:X  a  [        U5      eUR                  S;   a  [        U5      eUR                  S:X  a  [        U5      eUR                  S:X  a  [        U5      eUR!                  5       es  snnf  N! [        R                   a    [        U5      ef = f! [         a     Nf = f7f)z7
Internal crawl method to send the request to the API.
r   r   r   r   r   r   r   r   rb   r   rg   r   r   rh   rk   rl   r   Nz/crawlrq   rs   rt   ru   rv   rw   rx   ry   rz   r{   r.   r-   r}   r~   r   r1   r   r   r   r0   r   r   r   r   r   r   )r4   r   r   r   r   r   r   r   r   rb   r   rg   r   r   rh   rk   rl   r   r   r   r   r   r   ru   s                           r<   _crawlAsyncTavilyClient._crawl;  s7    .
3

 ;
 U	

 L
 L
 n
 ]
 
 n
 n
 ]
 f
 w
 
  ]!
"  !2#
( KK!%?A1?	(!\\..xDAQ[b.ccH 3&==?"F!,,Xr:>>wM ##s*-f55%%6$V,,%%,(00%%,%f--//113 @ d%% 	(w''	(  sg   A!F=#
F1F8F=<2F
 .F/F
 3"F=0F- BF=F
 
 F**F=-
F:7F=9F::F=c                    #    U R                   " U40 SU_SU_SU_SU_SU_SU_SU_SU	_S	U
_S
U_SU_SU_SU_SU_SU_SU_UD6I Sh  vN nU$  N7f)z
Combined crawl method.

r   r   r   r   r   r   r   rb   r   r   rg   r   rh   rk   rl   r   N)r   )r4   r   r   r   r   r   r   r   r   rb   r   r   rg   r   rh   rk   rl   r   r   r   s                       r<   crawlAsyncTavilyClient.crawl  s     0 #kk# ..7.0;. +0. 2>	.
 2>. 4B. 3@. 5D. 4B. 3@. 4B. ,2. -4. 5D. 3@.  7H&,#. .& '.s   AA	A
Ac                 4  #    UUUUUUUUU	U
UUUS.nU(       a  UR                  U5        UR                  5        VVs0 s H  u  nnUc  M  UU_M     nnn U R                  R                  S[        R
                  " U5      US9I Sh  vN nUR                  S:X  a  UR	                  5       $ Sn UR	                  5       R                  S0 5      R                  SS5      nUR                  S	:X  a  [        U5      eUR                  S
;   a  [        U5      eUR                  S:X  a  [        U5      eUR                  S:X  a  [        U5      eUR!                  5       es  snnf  N! [        R                   a    [        U5      ef = f! [         a     Nf = f7f)z5
Internal map method to send the request to the API.
)r   r   r   r   r   r   r   r   rb   r   rg   rh   rl   Nz/maprq   rs   rt   ru   rv   rw   rx   ry   rz   r   )r4   r   r   r   r   r   r   r   r   rb   r   rg   rh   rl   r   r   r   r   r   ru   s                       r<   _mapAsyncTavilyClient._map  s    ( "&((,*.,,*
  KK!%?A1?	(!\\..vtzz$?OY`.aaH 3&==?"F!,,Xr:>>wM ##s*-f55%%6$V,,%%,(00%%,%f--//113 @ b%% 	(w''	(  se   <F
EEF2E% 	E#
E% "F10F !BF#E% % FF
FFFFc                 b   #    U R                   " U4UUUUUUUU	U
UUUS.UD6I Sh  vN nU$  N7f)z
Combined map method.

)r   r   r   r   r   r   r   rb   r   rg   rh   rl   N)r   )r4   r   r   r   r   r   r   r   r   rb   r   rg   rh   rl   r   r   s                   r<   mapAsyncTavilyClient.map  s\     ( #ii ..70;*/1=1=3A2?4C3A3A,32?. '-. . .s   $/-/
max_tokensc                   #    [        U	S5      n	U R                  " U4UUUUUUSSSU	U
US.UD6I Sh  vN nUR                  S/ 5      nU Vs/ s H  oS   US   S.PM     nn[        R                  " [        UU5      5      $  NPs  snf 7f)	aa  
Get the search context for a query. Useful for getting only related content from retrieved websites
without having to deal with context extraction and limitation yourself.

max_tokens: The maximum number of tokens to return (based on openai token compute). Defaults to 4000.

Returns a string of JSON containing the search context up to context limit.
rp   F)rP   rT   r_   r`   ra   rb   rc   rd   rg   rh   ri   rk   Nr   r   rr   )r   rr   )r|   r   r0   r~   r   r   )r4   rO   rP   rT   r_   r`   ra   rb   r   rh   ri   rk   r   r   sourcessourcecontexts                    r<   get_search_context$AsyncTavilyClient.get_search_context  s     , gs#"ll5 -8D16047B;J;J:??D:?5<3:;J- .4- -  ##Ir2V]^V]F%=VI5FGV]^zz1':FGG#-  _s!   0B
BB
B!#B
B
c                    #    [        US5      nU R                  " U4UUUUUUSSSUU	U
S.UD6I Sh  vN nUR                  SS5      $  N7f)zP
Q&A search method. Search depth is advanced by default to get the best answer.
rp   FT)rP   rT   r_   r`   ra   rb   rd   rg   rc   rh   ri   rk   Nanswerrt   r   )r4   rO   rP   rT   r_   r`   ra   rb   rh   ri   rk   r   r   s                r<   
qna_searchAsyncTavilyClient.qna_searchA  su       gs#"ll5 -8D16047B;J;J?D:?:>5<3:;J- .4- -   2..-s   0AA	Ac                 D  ^ ^^^^^#    [        TS5      mS[        4UUUUU U4S jjn/ n[        R                  " T R                   Vs/ s H
  o" U5      PM     sn6 I Sh  vN  H  n	SU	;   d  M  UR                  U	S   5        M!     [        US SS9ST n
U
$ s  snf  N=7f)	z_Company information search method. Search depth is advanced by default to get the best answer. rp   rT   c           
      J   >#    TR                  TTU TSTTS9I S h  vN $  N7f)NF)rP   rT   r`   rc   rh   ri   )r   )rT   ri   r`   rO   rP   r4   rh   s    r<   _perform_search;AsyncTavilyClient.get_company_info.<locals>._perform_searchm  s:     e3?,12=5:07.5 & 7 7 7 7s   #!#Nr   c                     U S   $ )NscorerF   )xs    r<   <lambda>4AsyncTavilyClient.get_company_info.<locals>.<lambda>|  s    1W:    T)r7   reverse)r|   r/   asynciogatherr+   extendsorted)r4   rO   rP   r`   rh   ri   r   all_resultsrT   r   sorted_resultss   ``````     r<   get_company_info"AsyncTavilyClient.get_company_infoc  s      gs#	7 	7 	7 !..tOfOf*gOfe?5+AOf*ghhhDD ""4	?3 i
  1EtTUaVab +hhs$   A B BB  B!B 0/B inputmodel)miniproautooutput_schemastreamcitation_format)numberedmlaapachicagoc                   ^ ^^ UUUUUS.mTR                  5        VV	s0 s H  u  pU	c  M
  X_M     sn	nmU(       a  TR                  U5        U(       a   S[        [        S4   4UU U4S jjn
U
" 5       $ UU U4S jnU" 5       $ s  sn	nf )z:
Internal research method to send the request to the API.
)r   r   r   r   r   Nrn   c                   >#     TR                   R                  SS[        R                  " T5      TS9 IS h  vN n U R                  S:w  a   U R                  5       I S h  vN n[        U[        5      (       a  UR                  S5      OUnU R                  S:X  a  [        U5      eU R                  S;   a  [        U5      eU R                  S	:X  a  [        U5      eU R                  S
:X  a  [        U5      e[        SU R                   SU 35      eU R                  5         S h  vN nU(       d  M  U7v   M   GN N! [         a    Sn Nf = f N+
 S S S 5      IS h  vN    g ! , IS h  vN  (       d  f       g = f! [        R                    a    [#        T5      e[         a  n[        S[%        U5       35      eS nAff = f7f)NPOST	/researchrq   rs   zutf-8zUnknown errorrw   rx   ry   rz   zError z: zError during research stream: )r-   r   r~   r   r   aread
isinstancebytesdecoder   r   r   r   r   aiter_bytesr1   r   r   r/   )r   
error_textchunker   r4   rh   s       r<   stream_generator5AsyncTavilyClient._research.<locals>.stream_generator  s    O#||22# $

4 0 '	  3    
 "#//36=3;>>3C-C
KUV`bgKhKhZ->->w-Gnx
  (33s:&=j&I I!)!5!5!F&4Z&@ @!)!5!5!<&8&D D!)!5!5!<&5j&A A&/&9M9M8NbQ[P\0]&^ ^+3+?+?+A ,%$u&+5  .D#, =-<
=,+A1           6 -- 0&w//  O#&DSVH$MNNOs   G4F D?F E+E"E#,EBE+&E*E+E.E+8E+?F EEE+EE+EE+F $E'%F *G+F1E42F>F GF (G	-GG		Gc                    >#     TR                   R                  S[        R                  " T5      TS9I S h  vN n U R                  S:X  a  U R                  5       $ Sn U R                  5       R                  S0 5      R                  SS 5      nU R                  S:X  a  [        U5      eU R                  S;   a  [        U5      eU R                  S	:X  a  [        U5      eU R                  S
:X  a  [        U5      eU R                  5       e N! [        R
                   a    [        T5      ef = f! [         a     Nf = f7f)Nr   rq   rs   rt   ru   rv   rw   rx   ry   rz   )r-   r}   r~   r   r1   r   r   r   r0   r   r   r   r   r   r   )r   ru   r   r4   rh   s     r<   _make_request2AsyncTavilyClient._research.<locals>._make_request  s-    0%)\\%6%6{DJJW[L\fm%6%nnH ''3.#==?*F!)!4!4Xr!B!F!FwPT!U  ++s25f==!-->,V44!--4088!--4-f55&7799-  o-- 0&w//0 % sP   E 2D DD "E 0D0 A<E D  D--E 0
D=:E <D==E )r.   r{   r   r   )r4   r   r   r   r   r   rh   r   r   r   r   r   r   s   `     `     @r<   	_researchAsyncTavilyClient._research  s     *.
 "&??KK ON5$;,G  O  OD $%%:4 !?"I @s
   	BBc           
      f   #    U R                   " SUUUUUUS.UD6nU(       a  U$ UI Sh  vN $  N7f)a  
Research method to create a research task.

Args:
    input: The research task description (required).
    model: Research depth - must be either 'mini', 'pro', or 'auto'.
    output_schema: Schema for the 'structured_output' response format (JSON Schema dict).
    stream: Whether to stream the research task.
    citation_format: Citation format - must be either 'numbered', 'mla', 'apa', or 'chicago'.
    timeout: Optional HTTP request timeout in seconds.
    **kwargs: Additional custom arguments.

Returns:
    When stream=False: dict - the response dictionary.
    When stream=True: AsyncGenerator[bytes, None] - iterate over this to get streaming chunks.
)r   r   r   r   r   rh   NrF   )r   )	r4   r   r   r   r   r   rh   r   results	            r<   researchAsyncTavilyClient.research  sJ     2  
+ /
 
 M<<s   (1/1
request_idc                 ^  #     U R                   R                  SU 35      I Sh  vN nUR                  S;   a  UR	                  5       nU$ Sn UR	                  5       R                  S0 5      R                  SS5      nUR                  S:X  a  [        U5      eUR                  S	;   a  [        U5      eUR                  S
:X  a  [        U5      eUR                  S:X  a  [        U5      eUR                  5       e N! [         a  n[        SU 35      eSnAff = f! [         a     Nf = f7f)z
Get research results by request_id.

Args:
    request_id: The research request ID.

Returns:
    dict: Research response containing request_id, created_at, completed_at, status, content, and sources.
z
/research/NzError getting research: )rs      rt   ru   rv   rw   rx   ry   rz   )
r-   r0   r   r   r~   r   r   r   r   r   )r4   r   r   r   r   ru   s         r<   get_researchAsyncTavilyClient.get_research  s'    	<!\\--
:,.GHHH :-==?DKF!,,Xr:>>wM ##s*-f55%%6$V,,%%,(00%%,%f--//11/ I 	<6qc:;;	<  s\   D-!C= C;C= $D-0D ?A<D-;C= =
DDDD-
D*'D-)D**D-)r*   r-   r+   r,   )N)rV   rU   rW   NNNNN)NNNNNNNNNNNN<   NNNNN)NNN   NNNN)NNNNNNNNNNNN   NNN)NNNNNNNNNNr   N)
rQ   rU         NNi  r   NN)	rR   rU   r   r   NNr   NN)rR   r   r   N)NNFr   N)'__name__
__module____qualname____firstlineno____doc__r   r/   r   dictr1   r3   r=   rB   rG   rM   r   intr   boolfloatr   r   r   r   r   r   r   r   r   r   r   r   r   r   r	   r   r   r   __static_attributes__rF   r   r<   r   r      s
    154R59/304-17;8 8$,SM8"4S>28  (}8 !)	8
 &c]8 "%"3"348t(
 PT;?BF" #-1-1HLLP#'$($("& $)M2M2 ""KLM2 78	M2
   >?M2 M2 M2 M2 M2 &c]M2 &c]M2 "$0C(D"DEM2 "'tW5G-H'H!IM2 !M2 M2  !M2" "#M2$ "%M2&  'M2( )M2, 
-M2b Y]DHKO'+%)!%(,6:6:QUUY,0&($(-1-1+/)-'44#*+T#U4 $$@A4 "))G!H	4
 "%4  #4 4 #&4 '/sm4 '/sm4 &+49L1M+M%N4 +0g>P6Q0Q*R4 &*4 $4 "4  '+!4" '+#4$ %)%4& #''4* +4r $(:>26$("&%):2S	3':2 !:2 ##67	:2
 ./:2 :2 ":2  :2 :2  #:2 
:2| .2DH<@').2,0#'/3"!$s)S.1"&*" &--@%A" &&89	"
  %" (," &*" !" *-"  "L !%"& #'-1/3.204&*&*=A59 #'+%)(,#G2G2G2  G2 	G2
 !G2 &c]G2  (}G2 'smG2 !)G2  $G2  $G2 &&9:G2 12G2 G2 !%G2  #!G2" #&#G2& 'G2V &*'+!%(,26483759+/BF+/:>%(,0*.-1#++"+ "%+ 	+
 #&+ #+3-+ %-SM+ $,C=+ &.c]+ %)+ $++>#?+ %)+ $$67+ #+ &*+  $(!+" (+#+& '+^ !%"& #'-1/3.204&*&* #%)?2?2?2  ?2 	?2
 !?2 &c]?2  (}?2 'sm?2 !)?2  $?2  $?2 ?2 #?2 ?2F &*'+!%(,26483759+/+/%(*.##"# "%# 	#
 #&# #+3-# %-SM# $,C=# &.c]# %)# %)# ## $(# #N elPY-.45BFBF3724049=(H(+(H/67`/a(H )00L(M(H (+	(H
 /2(H 3;3-(H 3;3-(H .1(H +0(H +.(H 37(H '*(HX ]gHQ%&,-:>:>*,(,15 / # /'./X'Y / !((D E /  #	 /
 '* / +33- / +33- / #( / #& / +/ / " /H cm2302.2&)-45^-_ -0 ).	
 ), %-TN> ;?(,!&R\-1X#X# !67X# "&X# 	X#
 $++N#OX# $E?X# ^E4K8)D/IJX#x @D-1&+Wa26% !% %&;<%  '+%   $	% 
 )00S(T%  !)%  "$ud{(C"CD% N$2'*$2 $$2r   r   )r   r~   r(   typingr   r   r   r   r   r   r	   r1   utilsr   errorsr   r   r   r   r   r   r   rF   r   r<   <module>r     s5      	 V V V  * C  CY2 Y2r   