ó
    ‚¤j¸ã  ã                  óì  • S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
r
S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKJrJr  S SKJrJr  S SKJrJrJr  S SK J!r"  S SK#J#r#  S SK$J%r%  S S	KJ&r&J'r'  S S
K(J)r)J*r*J+r+J,r,J-r-J.r.  S SK/J0r0J1r1  S SK2r2S SK3r3S SK4J5r6  S SK7r7S SK8r8S SK9J:r:  S SK;J<r<  S SK=J>r>J?r?  S SK@JArA  S SKBJCrCJDrDJErEJFrFJGrG  S SKHJIrI  S SKJJKrKJLrL  S SKMJNrO  S SKPJQrQJRrRJSrSJTrT  S SKUJVrVJWrWJXrXJYrYJZrZ  S SK[J\r\J]r]J5r5  S SK^J_r_J`r`JaraJbrbJcrcJdrd  S SKeJfrfJgrg  S SKhJiri  S SKjJkrk  \)(       a  S SKlJmrmJnrnJoro  S SKpJqrq  S SKrJsrs  S SKtJuru  \Rì                  " 5       rwSrx\Rò                  " 5         \	Rô                  " \{5      r| " S  S!5      r}\:" 5        " S" S#5      5       rN\:" 5        " S$ S%\~5      5       r " S& S'\€5      r�SuS( jr‚        SvS) jrƒSwS* jr„      SxS+ jr…SyS, jr†          SzS- jr‡S.S/.               S{S0 jjrˆS|S1 jr‰S}S2 jrŠS~S3 jr‹        SS4 jrŒS€S5 jr� " S6 S7\G5      rŽ\"" S.S89 " S9 S:5      5       r�\" " S; S<5      5       r� " S= S>\€5      r‘ " S? S@\€5      r’ " SA SB5      r“ " SC SD5      r”S�SE jr•S‚SF jr–SƒSG jr—S„SH jr˜S…SI jr™S†SJ jrš " SK SL5      r›S‡SM jrœSˆSN jr�S‰SO jrž\ SŠ       S‹SP jj5       rŸSŒSQ jr \SŒSR j5       r¡  SŠ       S�SS jjr¢ " ST SU5      r£SŽS�SV jjr¤SW r¥SXr¦S�SY jr§S‘SZ jr¨\." \`\GRR                  GRU                  S[5      GRW                  S\5      GRY                  5       5      r­\." \`\GRR                  GRU                  S[5      GRW                  S]5      GRY                  5       5      r®\." \`\GRR                  GRU                  S[5      GRW                  S^5      GRY                  5       5      r¯\k" 5       r°1 S_kr±S`SaSaSaSbScScSdSeSfSgShSiSjSk.r²S’Sl jr³\GRh                  GRk                  Sm5      =(       d!    \~" \%" \GRl                  " 5       5      S[-  5      r·S“Sn jr¸S”S•So jjr¹SprºSqr»S–Sr jr¼Ss r½  S—     S˜St jjr¾g)™é    )ÚannotationsN)ÚdefaultdictÚdeque)ÚAsyncGeneratorÚCallable)ÚAbstractAsyncContextManagerÚAsyncExitStackÚasynccontextmanager)Ú	dataclass)Údatetime)ÚPath)ÚNamedTemporaryFileÚ_TemporaryFileWrapper)ÚTYPE_CHECKINGÚAnyÚBinaryIOÚOptionalÚUnionÚcast)ÚquoteÚurlparse)Údocument)ÚMultipartParseError)ÚMultipartParserÚparse_options_header)ÚBackgroundTask)ÚFormDataÚHeadersÚMutableHeadersÚStateÚ
UploadFile)ÚHTTPException)ÚMultiPartExceptionÚMultipartPart)ÚRequest)ÚFileResponseÚPlainTextResponseÚResponseÚStreamingResponse)ÚASGIAppÚMessageÚReceiveÚScopeÚSend)ÚhistoryÚprocessing_utilsÚutils)ÚBlocksConfigDictÚDeveloperPathÚMediaStreamChunkÚPredictBodyÚPredictBodyInternalÚUserProvidedPath)ÚErrorÚInvalidPathError)ÚSessionState)Úget_package_version)ÚBlockFunctionÚBlocksÚBlocksConfig©Ú	EventData©Ú
OAuthToken)ÚAppz/gradio_apic                  ót   • \ rS rSrSrS rS rS rS rSS jr	SS	 jr
S
 rS rS rSS jrSS jrSS jrSrg)ÚObjé_   z¤
Using a class to convert dictionaries into objects. Used by the `Request` class.
Credit: https://www.geeksforgeeks.org/convert-nested-python-dictionary-to-object/
c                óÐ   • U R                   R                  U5        UR                  5        H7  u  p#[        U[        [
        45      (       a  [        U5      n[        XU5        M9     g ©N)Ú__dict__ÚupdateÚitemsÚ
isinstanceÚdictÚlistrE   Úsetattr)ÚselfÚdict_ÚkeyÚvalues       Ú C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\gradio/route_utils.pyÚ__init__ÚObj.__init__e   sJ   € Ø�‰×Ñ˜UÔ#ØŸ+™+ž-‰JˆCÜ˜%¤$¬ ×.Ñ.Ü˜E›
�Ü�D˜uÖ%ò (ó    c                ó    • U R                   U   $ rH   ©rI   )rP   Úitems     rT   Ú__getitem__ÚObj.__getitem__l   s   € Ø�}‰}˜TÑ"Ð"rW   c                ó    • X R                   U'   g rH   rY   ©rP   rZ   rS   s      rT   Ú__setitem__ÚObj.__setitem__o   s   € Ø#�‰�dÒrW   c              #  ó¨   #   • U R                   R                  5        H0  u  p[        U[        5      (       a  U[	        U5      4v •  M+  X4v •  M2     g 7frH   )rI   rK   rL   rE   rM   )rP   rR   rS   s      rT   Ú__iter__ÚObj.__iter__r   sB   é € ØŸ-™-×-Ñ-Ö/‰JˆCÜ˜%¤×%Ñ%ØœD ›KÐ(Ô(à�lÔ"ò	 0ùs   ‚AAc                ó¢   • XR                   ;   a  gU R                   R                  5        H!  n[        U[        5      (       d  M  X;   d  M!    g   g)NTF)rI   ÚvaluesrL   rE   r^   s      rT   Ú__contains__ÚObj.__contains__y   s?   € Ø—=‘=Ó ØØ—]‘]×)Ñ)Ö+ˆEÜ˜%¤×%Ó%¨$­-Ùñ ,ð rW   Nc                ó.   • X;   a  U R                   U   $ U$ rH   rY   ©rP   rZ   Údefaults      rT   ÚgetÚObj.get�   s   € Ø‹<Ø—=‘= Ñ&Ð&ØˆrW   c                ó6   • U R                   R                  5       $ rH   )rI   Úkeys©rP   s    rT   rn   ÚObj.keys†   s   € Ø�}‰}×!Ñ!Ó#Ð#rW   c                ó6   • U R                   R                  5       $ rH   )rI   re   ro   s    rT   re   Ú
Obj.values‰   s   € Ø�}‰}×#Ñ#Ó%Ð%rW   c                ó6   • U R                   R                  5       $ rH   )rI   rK   ro   s    rT   rK   Ú	Obj.itemsŒ   s   € Ø�}‰}×"Ñ"Ó$Ð$rW   c                ó,   • [        U R                  5      $ rH   ©ÚstrrI   ro   s    rT   Ú__str__ÚObj.__str__�   ó   € Ü�4—=‘=Ó!Ð!rW   c                ó,   • [        U R                  5      $ rH   rv   ro   s    rT   Ú__repr__ÚObj.__repr__’   rz   rW   c                óF   • X;   a  U R                   R                  U5      $ U$ rH   )rI   Úpopri   s      rT   r   ÚObj.pop•   s!   € Ø‹<Ø—=‘=×$Ñ$ TÓ*Ð*ØˆrW   © ©ÚreturnÚboolrH   )rƒ   rw   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rU   r[   r_   rb   rf   rk   rn   re   rK   rx   r|   r   Ú__static_attributes__r�   rW   rT   rE   rE   _   sC   † ñò
&ò#ò$ò#ôôò
$ò&ò%ô"ô"÷rW   rE   c                  óZ   • \ rS rSrSr   S
     SS jjrS rSS jrSS jrSS jr	S	r
g)r%   é›   a�  
A Gradio request object that can be used to access the request headers, cookies,
query parameters and other information about the request from within the prediction
function. The class is a thin wrapper around the fastapi.Request class. Attributes
of this class include: `headers`, `client`, `query_params`, `session_hash`, and `path_params`. If
auth is enabled, the `username` attribute can be used to get the logged in user. In some environments,
the dict-like attributes (e.g. `requests.headers`, `requests.query_params`) of this class are automatically
converted to dictionaries, so we recommend converting them to dictionaries before accessing
attributes for consistent behavior in different environments.
Example:
    import gradio as gr
    def echo(text, request: gr.Request):
        if request:
            print("Request headers dictionary:", dict(request.headers))
            print("Query parameters:", dict(request.query_params))
            print("IP address:", request.client.host)
            print("Gradio session hash:", request.session_hash)
        return text
    io = gr.Interface(echo, "textbox", "textbox").launch()
Demos: request_ip_headers
Nc                ó4   • Xl         X l        X0l        X@l        g)a<  
Can be instantiated with either a fastapi.Request or by manually passing in
attributes (needed for queueing).
Parameters:
    request: A fastapi.Request
    username: The username of the logged in user (if auth is enabled)
    session_hash: The session hash of the current session. It is unique for each page load.
N)ÚrequestÚusernameÚsession_hashÚkwargs)rP   rŽ   r�   r�   r‘   s        rT   rU   ÚRequest.__init__³   s   € ð  ŒØ ŒØ(4ÔØ&,�rW   c                óŠ   • [        U[        5      (       a-  [        R                  " [        R                  " U5      [
        S9$ U$ )N)Úobject_hook)rL   rM   ÚjsonÚloadsÚdumpsrE   )rP   Úds     rT   Údict_to_objÚRequest.dict_to_objÈ   s-   € Ü�aœ×ÑÜ—:’:œdŸjšj¨›m¼Ñ=Ð=àˆHrW   c                óô   • U R                   (       a%  U R                  [        U R                   U5      5      $  U R                  U   nU R                  U5      $ ! [         a  n[        SU S35      UeS nAff = f)Nz#'Request' object has no attribute 'Ú')rŽ   r™   Úgetattrr‘   ÚKeyErrorÚAttributeError)rP   ÚnameÚobjÚkes       rT   Ú__getattr__ÚRequest.__getattr__Î   sy   € Ø�<�<Ø×#Ñ#¤G¨D¯L©L¸$Ó$?Ó@Ð@ðØ—k‘k $Ñ'�ð
 ×#Ñ# CÓ(Ð(øô	 ó Ü$Ø9¸$¸¸qÐAóàðûðús   ¸A Á
A7Á"A2Á2A7c                ó   • U R                   R                  [        [        U S0 5      5      [        [        U S0 5      5      [        [        U S0 5      5      [        [        U S0 5      5      [        U S0 5      =(       a    U R                  R
                  [        U S0 5      =(       a    U R                  R                  S.[        U SS5      S	.5        [        U S
S 5      nUbB  [        [        US0 5      5      nU(       a%   [        R                  " U5        X R                   S'   S U l
        U R                  $ ! [        R                   a     N)f = f)NÚheadersÚquery_paramsÚcookiesÚpath_paramsÚclient)ÚhostÚportÚurlÚ )r¦   r§   r¨   r©   rª   r­   ÚstateÚ_stateÚrequest_state)r‘   rJ   rM   r�   rª   r«   r¬   Úpickler—   ÚPicklingErrorrŽ   rI   )rP   Ú	state_objr±   s      rT   Ú__getstate__ÚRequest.__getstate__Ú   s  € Ø�‰×Ñä¤¨¨i¸Ó <Ó=Ü $¤W¨T°>À2Ó%FÓ GÜ¤¨¨i¸Ó <Ó=Ü#¤G¨D°-ÀÓ$DÓEä# D¨(°BÓ7×L¸D¿K¹K×<LÑ<LÜ# D¨(°BÓ7×L¸D¿K¹K×<LÑ<Lñô ˜t U¨BÓ/ñ
ô	
ô ˜D '¨4Ó0ˆ	ØÑ Ü ¤¨°H¸bÓ!AÓBˆMÞðÜ—L’L Ô/Ø3@—K‘K Ñ0ð ˆŒØ�}‰}Ðøô ×+Ñ+ó Ùðús   Ã?$D6 Ä6EÅEc                ó\   • UR                  SS 5      nXl        Ub  [        U5      U l        g g )Nr±   )r   rI   r    r¯   )rP   r¯   r±   s      rT   Ú__setstate__ÚRequest.__setstate__ô   s.   € ØŸ	™	 /°4Ó8ˆØŒØÑ$Ü˜}Ó-ˆD�Jð %rW   )rI   r‘   rŽ   r�   r¯   r�   )NNN)rŽ   úfastapi.Request | Noner�   ú
str | Noner�   r»   )r    rw   )rƒ   údict[str, Any])r¯   r¼   )r…   r†   r‡   rˆ   r‰   rU   r™   r£   rµ   r¸   rŠ   r�   rW   rT   r%   r%   ›   sG   † ñð0 +/Ø#Ø#'ð	-à'ð-ð ð-ð !õ	-ò*ô
)ô÷4.rW   r%   c                  ó   • \ rS rSrSrSrg)ÚHeaderéû   aR  A string that represents a header value in an incoming HTTP request to the Gradio app.

When you type a function argument of type `Header`, Gradio will automatically extract that header from the request and pass it to the function.
Note that it's common for header values to use hyphens, e.g. `x-forwarded-host`, and these will automatically be converted to underscores.
So make sure you use underscores in your function arguments.

Example:
    import gradio as gr

    def make_api_request_on_behalf_of_user(prompt: str, x_api_token: gr.Header):
        return "Hello from the API" if not x_api_token else "Hello from the API with token!"

    demo = gr.Interface(
        make_api_request_on_behalf_of_user,
        [
            gr.Textbox(label="Prompt"),
        ],
        gr.Textbox(label="Response"),
    )

    demo.launch(mcp_server=True)
r�   N)r…   r†   r‡   rˆ   r‰   rŠ   r�   rW   rT   r¾   r¾   û   s   † ñò. 	rW   r¾   c                  ó   • \ rS rSrSrg)ÚFnIndexInferErrori  r�   N©r…   r†   r‡   rˆ   rŠ   r�   rW   rT   rÁ   rÁ     ó   † ÚrW   rÁ   c                óJ  • UR                   (       a0  U R                  UR                      nUR                  R                  nOU R                  nUR                  c<  Ub+  UR                  5        H  nUR                  U:X  d  M  Us  $    [        SU 35      eXBR                     $ )Nz-Could not infer function index for API name: )r�   Ústate_holderÚblocks_configÚfnsÚfn_indexre   Úapi_namerÁ   )ÚblocksrÉ   ÚbodyÚsession_staterÇ   Úfns         rT   Úget_fnrÎ     s”   € Ø××Ø×+Ñ+¨D×,=Ñ,=Ñ>ˆØ×)Ñ)×-Ñ-‰à�j‰jˆà‡}�}ÑØÑØ—j‘j–l�Ø—;‘; (Õ*Ø’Iñ #ô  Ø;¸H¸:ÐFó
ð 	
ð —=‘=Ñ!Ð!rW   c                óZ  • UR                   (       a  U R                  /U l        U R                  (       aT  U R                  (       a"  [        UU R                  U R                  S9/nU$ [        X R                  U R                  S9n U$ Uc  [        S5      e[        X#U R                  S9nU$ )N)r�   rŽ   r�   z0request must be provided if body.request is None)Úcancelsr�   ÚdatarŽ   Úbatchedr%   Ú
ValueError)rË   rÍ   r�   rŽ   Ú
gr_requests        rT   Úcompile_gr_requestrÕ   .  s¦   € ð 
‡z‡zØ×&Ñ&Ð'ˆŒ	Ø‡|‡|Ø�<�<äØ%Ø ŸL™LØ!%×!2Ñ!2ñðˆJð$ Ðô !Ø!¯<©<Àd×FWÑFWñ‰Jð Ðð ‰?ÜÐOÓPÐPÜØ¸T×=NÑ=Nñ
ˆ
ð ÐrW   c                ó@  • UR                   n[        USS 5      nUbe  U R                  U   nUc  S nXE4$ X R                  ;   a   S nU R                  R	                  U5        XE4$ U R
                  R                  U5      n XE4$ [        U R                  5       5      nS nXE4$ )Nr�   )	Úevent_idr�   rÅ   Úiterators_to_resetÚremoveÚ	iteratorsrk   r:   Ú
get_blocks)ÚapprË   r×   r�   rÌ   Úiterators         rT   Úrestore_session_staterÞ   O  s»   € Ø�}‰}€HÜ˜4 °Ó6€LØÑØ×(Ñ(¨Ñ6ˆð ÑØˆHð Ð"Ð"ð ×/Ñ/Ó/ØˆHØ×"Ñ"×)Ñ)¨(Ô3ð Ð"Ð"ð —}‘}×(Ñ(¨Ó2‰Hð
 Ð"Ð"ô % S§^¡^Ó%5Ó6ˆØˆàÐ"Ð"rW   c                óì   • SSK Jn  UR                  nU" U(       a  U R                  R	                  U5      OS UR
                  5      n[        UR                  S5      (       a  S UR                  l        U$ )Nr   r?   Úparent)	Úgradio.helpersr@   Ú
trigger_idrÊ   rk   Ú
event_dataÚhasattrÚtargetrà   )rÆ   rË   r@   rå   rã   s        rT   Úprepare_event_dataræ   g  sb   € õ )à�_‰_€FÙÞ,2ˆ×Ñ× Ñ  Ô(¸Ø�‰ó€Jô ˆz× Ñ  (×+Ñ+Ø#'ˆ
×ÑÔ ØÐrW   c                ór   • SSK Jn  [        U SS5      nU(       a  [        U[        5      (       d  gU" USSS9$ )zˆWrap a caller-supplied token so it can be injected as a gr.OAuthToken.

Scope and expiry are empty because the request carries neither.
r   rA   Úoauth_tokenNr®   )ÚtokenÚscopeÚ
expires_at)Úgradio.oauthrB   r�   rL   rw   )rË   Ú_OAuthTokenré   s      rT   Úoauth_token_from_bodyrî   y  s6   € õ
 7ä�D˜-¨Ó.€EÞœ
 5¬#×.Ñ.ØÙ˜U¨"¸Ñ;Ð;rW   c              ƒ  ó¢  #   • [        XS9u  pV[        UR                  U5      nUR                  n[	        USS 5      n	UR
                  n
UR                  (       + =(       a    UR                  nU(       a  U
/n
UR
                  n[        R                  " 5       n SSK
Jn  [        R                  " 5          U" S5       IS h  v•N   U R                  5       R                  UU
UUUU	UUSUR                   U[#        U5      S9I S h  v•N nS S S 5      IS h  v•N   S S S 5        WR%                  SS 5      nUb  X`R&                  U'   O*Ub'  U R                  5       R)                  X–5      I S h  v•N   [+        U[,        5      (       a  Ue U(       a  US	   S   US	'   [5        U UUUUR1                  S	5      UUR1                  S
5      (       + S9  U$  GN NË N½! , IS h  v•N  (       d  f       NÒ= f! , (       d  f       NÛ= f N”! [.         aA    Ub  U R&                  R1                  U5      OS nU R                  5       R3                  X–5        e f = f7f)N)rÜ   rË   r�   r   )Útrace_phaseÚtotalT)Úblock_fnÚinputsrŽ   r¯   rÝ   r�   r×   rã   Úin_event_listenerÚsimple_formatÚ	root_pathrè   rÝ   rÑ   Úis_generating)rÍ   rÔ   ró   ÚoutputsÚ
started_atÚis_final)rÞ   ræ   rÆ   r×   r�   rÑ   rÒ   Úbatchr/   Únow_utc_isoÚgradio.profilingrð   r1   ÚMatplotlibBackendManangerrÛ   Úprocess_apirõ   rî   r   rÚ   Ú_finish_run_streamsrL   r8   ÚBaseExceptionrk   Ú_drop_run_streamsÚ_record_run_history)rÜ   rË   rÔ   rÍ   rö   rÌ   rÝ   rã   r×   r�   ró   Úbatch_in_single_outÚsubmitted_inputsrù   rð   Úoutputs                   rT   Úcall_process_apir  †  s  é € ô 4¸ÑGÑ€Mä# M×$?Ñ$?ÀÓF€JØ�}‰}€Hä˜4 °Ó6€LØ�Y‰Y€Fà"Ÿl™lÔ*×7¨r¯x©xÐÞØ�ˆà—y‘yÐÜ×$Ò$Ó&€Jð!Ý0ä×,Ò,Õ.Ù" 7×+Õ+Ø"Ÿ~™~Ó/×;Ñ;ØØ!Ø&Ø'Ø%Ø!-Ø%Ø)Ø&*Ø"&×"4Ñ"4Ø'Ü 5°dÓ ;ð  <ð  ÷ �÷ ,×+÷ /ð  —:‘:˜j¨$Ó/ˆØÑØ&.�M‰M˜(Ò#ØÑ!ð
 —.‘.Ó"×6Ñ6°|ÓN×NÐNÜ�fœe×$Ñ$ØˆLð %ö Ø ™¨Ñ*ˆˆv‰äØØØØØ—
‘
˜6Ó"ØØ—Z‘Z Ó0Ô0òð €MòW ,ñ÷ ,×+×+Ð+ú÷ /Õ.úñ0 Oøô ó Ø2:Ñ2F�3—=‘=×$Ñ$ XÔ.ÈDˆØ�‰Ó×*Ñ*¨<ÔBØðüsŸ   ‚BIÂH Â4G.ÃGÃG.Ã?GÄGÄGÄ	G.ÄGÄG.ÄAH Å*G?Å+H ÆAIÇG.ÇGÇG.ÇG+	ÇGÇG+	Ç'G.Ç.
G<Ç8H ÈAIÉIT)rú   c          
     óü   • U(       a!  UR                   (       d  UR                  S:w  a  g [        R                  " U UUUUR                  UR
                  US9  g! [         a    [        R                  SSS9   gf = f)zCHand a finished run to the recorder; records only public endpoints.ÚpublicN)rŽ   ró   rø   rÉ   rÈ   rù   zhistory: scheduling failedT©Úexc_info)	Úis_cancel_functionÚapi_visibilityr/   Úschedule_record_runrÉ   Ú_idÚ	ExceptionÚloggerÚdebug)rÜ   rÍ   rÔ   ró   rø   rù   rú   s          rT   r  r  Î  st   € ö �r×,×,°×0AÑ0AÀXÓ0MØðBÜ×#Ò#ØØØØØ—[‘[Ø—V‘VØ!ó	
øô ó BÜ�‰Ð1¸DˆÓAðBús   «.A ÁA;Á:A;c                óŒ   • U R                   R                  U5      nU(       a"  UR                  S5      S   R                  5       $ g )NÚ,r   )r¦   rk   ÚsplitÚstrip)rŽ   Úheader_nameÚheader_values      rT   Úget_first_header_valuer  é  s;   € Ø—?‘?×&Ñ& {Ó3€LÞØ×!Ñ! #Ó& qÑ)×/Ñ/Ó1Ð1ØrW   c                ó2  • [        U S5      n[        U S5      nU(       a  SU 3O[        U=(       d    U R                  5      n[        R                  " U5      nUR                  SS9n[        U5      R                  S5      n[        U S5      S:X  a  UR                  SS	5      nUR                  S5      n[        U5      S
:”  a,  U(       d%  UR                  U5      (       a  US[        U5      *  nUR                  S5      n[        R                  " U5      nU$ )aL  
Examines the request headers to determine the origin of the request.
If the request includes the x-forwarded-host header, it is used directly to determine the origin.
Otherwise, the request url is used and the route path is stripped off.

The returned URL is a httpx.URL object without a trailing slash, e.g. "https://example.com"
zx-forwarded-hostzx-gradio-serverúhttp://N)ÚqueryÚ/zx-forwarded-protoÚhttpszhttps://r   )
r  rw   r­   ÚhttpxÚURLÚ	copy_withÚrstripÚreplaceÚlenÚendswith)rŽ   Ú
route_pathÚx_forwarded_hostÚx_gradio_serverÚroot_urls        rT   Úget_request_originr*  ð  s  € ô .¨gÐ7IÓJÐÜ,¨WÐ6GÓH€Oö ð Ð"Ð#Ñ$ä�×/ G§K¡KÓ0ð ô
 �yŠy˜Ó"€HØ×!Ñ!¨Ð!Ð-€HÜ�8‹}×#Ñ# CÓ(€Hä˜gÐ':Ó;¸wÓFØ×#Ñ# I¨zÓ:ˆà×"Ñ" 3Ó'€Jä
ˆ:ƒ˜ÓÖ#3¸×8IÑ8IÈ*×8UÑ8UØÐ.œs :›Ð.Ð/ˆà�‰˜sÓ#€HÜ�yŠy˜Ó"€Hà€OrW   c                ó,  • [          S3n[          S3nU R                  R                  R                  S5      nUR	                  U5      (       a  U$ UR                  U5      nUS:¼  a  X4[        U5       $ [        S[        U R                  5       S35      e)a«  
Extracts the API call path from the request URL.

If the URL (without query parameters) ends with "{API_PREFIX}/queue/join", that exact path is returned.
Otherwise, if the URL contains "{API_PREFIX}/call", the substring starting from "{API_PREFIX}/call" is returned.
This allows for dynamic API calls to methods other than "predict".

Raises:
    ValueError: If the request URL does not match any recognized API call pattern.
z/queue/joinz/callr  r   zRequest url 'z"' has an unknown api call pattern.)	Ú
API_PREFIXr­   Úpathr"  r%  Úrfindr$  rÓ   rw   )rŽ   Úqueue_api_urlÚgeneric_api_urlÚrequest_pathÚstart_indexs        rT   Úget_api_call_pathr3    s™   € ô "�l +Ð.€MÜ#˜ EÐ*€OØ—;‘;×#Ñ#×*Ñ*¨3Ó/€Là×Ñ˜]×+Ñ+ØÐà×$Ñ$ _Ó5€KØ�aÓØ¬#¨lÓ*;Ð<Ð<ä
Ø
œ˜GŸK™KÓ(Ð)Ð)KÐLóð rW   c                óþ   • U(       a,  [         R                  " U5      (       a  UR                  S5      $ [        X5      nU(       a  UR                  U:w  a  UR                  US9n[        U5      R                  S5      $ )a©  
Gets the root url of the Gradio app (i.e. the public url of the app) without a trailing slash.

This is how the root_url is resolved:
1. If a user provides a `root_path` manually that is a full URL, it is returned directly.
2. If the request has an x-forwarded-host header (e.g. because it is behind a proxy), the root url is
constructed from the x-forwarded-host header. In this case, `route_path` is not used to construct the root url.
3. Otherwise, the root url is constructed from the request url. The query parameters and `route_path` are stripped off.
And if a relative `root_path` is provided, and it is not already the subpath of the URL, it is appended to the root url.

In cases (2) and (3), We also check to see if the x-forwarded-proto header is present, and if so, convert the root url to https.
And if there are multiple hosts in the x-forwarded-host or multiple protocols in the x-forwarded-proto, the first one is used.
r  )r-  )Úclient_utilsÚis_http_url_liker"  r*  r-  r!  rw   )rŽ   r&  rö   r)  s       rT   Úget_root_urlr7  -  sh   € ö" ”\×2Ò2°9×=Ñ=Ø×Ñ Ó$Ð$ä! 'Ó6€Hæ�X—]‘] iÓ/Ø×%Ñ%¨9Ð%Ð5ˆäˆx‹=×Ñ Ó$Ð$rW   c                ót   •  U R                  U5      $ ! [        [        4 a    U R                  S5      s $ f = f)Núlatin-1)ÚdecodeÚUnicodeDecodeErrorÚLookupError)ÚsrcÚcodecs     rT   Ú_user_safe_decoder?  I  s9   € ð%Ø�z‰z˜%Ó Ð øÜ¤Ð,ó %Ø�z‰z˜)Ó$Ò$ð%ús   ‚ “!7¶7c                  óN   ^ • \ rS rSrSrSSSS.         SU 4S jjjrSrU =r$ )ÚGradioUploadFileiP  z UploadFile with a sha attribute.N©ÚsizeÚfilenamer¦   c               ó¨   >• [         TU ]  XX4S9  [        R                  " 5       U l        U R                  R                  [        R                  5        g )NrB  )ÚsuperrU   ÚhashlibÚsha256ÚsharJ   r0   Ú	hash_seed)rP   ÚfilerC  rD  r¦   Ú	__class__s        €rT   rU   ÚGradioUploadFile.__init__S  s<   ø€ ô 	‰Ñ˜°8ÐÑMÜ—>’>Ó#ˆŒØ�‰�‰Ô(×2Ñ2Õ3rW   )rI  )
rK  r   rC  ú
int | NonerD  r»   r¦   zHeaders | Nonerƒ   ÚNone)r…   r†   r‡   rˆ   r‰   rU   rŠ   Ú__classcell__)rL  s   @rT   rA  rA  P  sK   ø† Ù*ð  Ø#Ø"&ñ
4àð
4ð ð	
4ð
 ð
4ð  ð
4ð 
÷
4ö 
4rW   rA  )Úfrozenc                  ó*   • \ rS rSr% S\S'   S\S'   Srg)ÚFileUploadProgressUniti`  rw   rD  ÚintÚ
chunk_sizer�   N©r…   r†   r‡   rˆ   Ú__annotations__rŠ   r�   rW   rT   rS  rS  `  s   ‡ àƒMØ†OrW   rS  c                  ó*   • \ rS rSr% S\S'   S\S'   Srg)ÚFileUploadProgressTrackerif  zdeque[FileUploadProgressUnit]r   r„   Úis_doner�   NrV  r�   rW   rT   rY  rY  f  s   ‡ à(Ó(Ø†MrW   rY  c                  ó   • \ rS rSrSrg)Ú!FileUploadProgressNotTrackedErroril  r�   NrÂ   r�   rW   rT   r\  r\  l  rÃ   rW   r\  c                  ó   • \ rS rSrSrg)Ú FileUploadProgressNotQueuedErrorip  r�   NrÂ   r�   rW   rT   r^  r^  p  rÃ   rW   r^  c                  ód   • \ rS rSrSS jrSS jrSS jrSS jrSS jrSS jr	SS jr
SS	 jrS
rg)ÚFileUploadProgressit  c                óN   • 0 U l         [        [        R                  5      U l        g rH   )Ú	_statusesr   ÚasyncioÚEventÚ_signalsro   s    rT   rU   ÚFileUploadProgress.__init__u  s   € Ø?AˆŒÜ#¤G§M¡MÓ2ˆ�rW   c                ó    • XR                   ;  a?  [        [        5       S5      U R                   U'   U R                  U   R	                  5         g g )NF)rb  rY  r   re  Úset©rP   Ú	upload_ids     rT   ÚtrackÚFileUploadProgress.tracky  s=   € ØŸN™NÓ*Ü(AÄ%Ã'È5Ó(QˆD�N‰N˜9Ñ%Ø�M‰M˜)Ñ$×(Ñ(Õ*ð +rW   c              ƒ  óX   #   • U R                   U   R                  5       I S h  v•N $  N7frH   )re  Úwaitri  s     rT   Ú
is_trackedÚFileUploadProgress.is_tracked~  s#   é € Ø—]‘] 9Ñ-×2Ñ2Ó4×4Ð4Ñ4ùs   ‚!*£(¤*c           	     óÊ  • XR                   ;  a  U R                  U5        U R                   U   R                  n[        U5      S:X  a%  UR	                  [        U[        U5      5      5        g UR                  5       nUR                  U:w  a%  UR	                  [        U[        U5      5      5        g UR	                  [        UUR                  [        U5      -   5      5        g ©Nr   )	rb  rk  r   r$  ÚappendrS  ÚpopleftrD  rU  )rP   rj  rD  Úmessage_bytesÚqueueÚ	last_units         rT   rs  ÚFileUploadProgress.append�  s¬   € ØŸN™NÓ*Ø�J‰J�yÔ!Ø—‘˜yÑ)×/Ñ/ˆäˆu‹:˜‹?Ø�L‰LÔ/°¼#¸mÓ:LÓMÕNàŸ™›ˆIØ×!Ñ! XÓ-Ø—‘Ô3°H¼cÀ-Ó>PÓQÕRà—‘Ü*Ø Ø!×,Ñ,¬s°=Ó/AÑAóõrW   c                ól   • XR                   ;  a  U R                  U5        SU R                   U   l        g )NT)rb  rk  rZ  ri  s     rT   Úset_doneÚFileUploadProgress.set_done”  s)   € ØŸN™NÓ*Ø�J‰J�yÔ!Ø,0ˆ�‰�yÑ!Õ)rW   c                óf   • XR                   ;  a
  [        5       eU R                   U   R                  $ rH   )rb  r\  rZ  ri  s     rT   rZ  ÚFileUploadProgress.is_done™  s*   € ØŸN™NÓ*Ü3Ó5Ð5Ø�~‰~˜iÑ(×0Ñ0Ð0rW   c                ó>   • XR                   ;   a  U R                   U	 g g rH   )rb  ri  s     rT   Ústop_trackingÚ FileUploadProgress.stop_trackingž  s   € ØŸ™Ó&Ø—‘˜yÑ)ð 'rW   c                ó¾   • XR                   ;  a
  [        5       e U R                   U   R                  R                  5       $ ! [         a  n[        5       UeS nAff = frH   )rb  r\  r   r   Ú
IndexErrorr^  )rP   rj  Úes      rT   r   ÚFileUploadProgress.pop¢  sS   € ØŸN™NÓ*Ü3Ó5Ð5ð	<Ø—>‘> )Ñ,×2Ñ2×6Ñ6Ó8Ð8øÜó 	<Ü2Ó4¸!Ð;ûð	<ús   ›&A Á
AÁAÁA)re  rb  N©rƒ   rO  )rj  rw   )rj  rw   rƒ   r„   )rj  rw   rD  rw   ru  Úbytes)rj  rw   rƒ   rS  )r…   r†   r‡   rˆ   rU   rk  ro  rs  rz  rZ  r  r   rŠ   r�   rW   rT   r`  r`  t  s*   † ô3ô+ô
5ôô&1ô
1ô
*÷<rW   r`  c                  óÂ   • \ rS rSrSrSrSSSSS\S.                   SS jjrSS jrSS	 jrSS
 jr	SS jr
SS jrSS jrSS jrSS jrSS jrSS jrSrg)ÚGradioMultiPartParseri«  a=  Vendored from starlette.MultipartParser.

Thanks starlette!

Made the following modifications
    - Use GradioUploadFile instead of UploadFile
    - Use NamedTemporaryFile instead of SpooledTemporaryFile, optionally
      placing it in Gradio's upload directory
    - Compute hash of data as the request is streamed

i    éè  N)Ú	max_filesÚ
max_fieldsÚ
upload_dirrj  Úupload_progressÚmax_header_sizec               ó  • Xl         X l        X0l        X@l        XPl        / U l        X`l        Xpl        SU l        SU l	        X€l
        X�l        SU l        SU l        SU l        [        5       U l        SU l        / U l        / U l        / U l        g )Nr   rW   r®   )r¦   ÚstreamrŠ  r‹  rŒ  rK   rj  r�  Ú_current_filesÚ_current_fieldsÚmax_file_sizerŽ  Ú_current_partial_header_nameÚ_current_partial_header_valueÚ_current_header_sizer$   Ú_current_partÚ_charsetÚ_file_parts_to_writeÚ_file_parts_to_finishÚ_files_to_close_on_error)
rP   r¦   r�  rŠ  r‹  rŒ  rj  r�  r“  rŽ  s
             rT   rU   ÚGradioMultiPartParser.__init__º  sŒ   € ð ŒØŒØ"ŒØ$ŒØ$ŒØ?AˆŒ
Ø"ŒØ.ÔØˆÔØ ˆÔØ*ÔØ.ÔØ36ˆÔ)Ø47ˆÔ*Ø)*ˆÔ!Ü*›_ˆÔØˆŒØGIˆÔ!Ø:<ˆÔ"ØEGˆÕ%rW   c                ó0   • [        5       U l        SU l        g rr  )r$   r—  r–  ro   s    rT   Úon_part_beginÚ#GradioMultiPartParser.on_part_beginÜ  s   € Ü*›_ˆÔØ$%ˆÕ!rW   c                ól  • XU nU R                   bE  U R                   R                  U R                  U R                  R                  R
                  U5        U R                  R                  c   U R                  =R                  U-  sl        g U R                  R                  U R                  U45        g rH   )r�  rs  rj  r—  rK  rD  rÑ   r™  )rP   rÑ   ÚstartÚendru  s        rT   Úon_part_dataÚ"GradioMultiPartParser.on_part_dataà  s”   € Ø 3˜ˆØ×ÑÑ+Ø× Ñ ×'Ñ'Ø—‘Ø×"Ñ"×'Ñ'×0Ñ0Øôð
 ×Ñ×"Ñ"Ñ*Ø×Ñ×#Ò# }Ñ4Ö#à×%Ñ%×,Ñ,¨d×.@Ñ.@À-Ð-PÕQrW   c           	     ó  • U R                   R                  c‡  U R                   R                  n[        U[        5      (       a  [        U5      OUnU R                  R                  U R                   R                  [        U[        U R                  5      5      45        g U R                  R                  U R                   5        U R                  R                  U R                   R                  U R                   R                  45        g rH   )r—  rK  rÑ   rL   Ú	bytearrayr†  rK   rs  Ú
field_namer?  rw   r˜  rš  )rP   rÑ   Ú
data_bytess      rT   Úon_part_endÚ!GradioMultiPartParser.on_part_endí  sÂ   € Ø×Ñ×"Ñ"Ñ*Ø×%Ñ%×*Ñ*ˆDÜ(2°4¼×(CÑ(Cœ˜tœÈˆJØ�J‰J×Ñà×&Ñ&×1Ñ1Ü% j´#°d·m±mÓ2DÓEðõð ×&Ñ&×-Ñ-¨d×.@Ñ.@ÔAð �J‰J×Ñ˜t×1Ñ1×<Ñ<¸d×>PÑ>P×>UÑ>UÐVÕWrW   c                óp   • U R                   U-   U R                  :”  a  [        SU R                   S35      eg )Nz)Headers exceeded maximum allowed size of ú bytes.)r–  rŽ  r#   )rP   Úadditional_bytess     rT   Ú_check_header_sizeÚ(GradioMultiPartParser._check_header_sizeþ  sC   € Ø×$Ñ$Ð'7Ñ7¸$×:NÑ:NÓNÜ$Ø;¸D×<PÑ<PÐ;QÐQXÐYóð ð OrW   c                ó†   • X2-
  nU R                  U5        U =R                  XU -  sl        U =R                  U-  sl        g rH   )r®  r”  r–  ©rP   rÑ   r¡  r¢  Úadditional_header_bytess        rT   Úon_header_fieldÚ%GradioMultiPartParser.on_header_field  s@   € Ø"%¡+ÐØ×ÑÐ 7Ô8Ø×)Ò)¨T¸¨_Ñ<Õ)Ø×!Ò!Ð%<Ñ<Ö!rW   c                ó†   • X2-
  nU R                  U5        U =R                  XU -  sl        U =R                  U-  sl        g rH   )r®  r•  r–  r±  s        rT   Úon_header_valueÚ%GradioMultiPartParser.on_header_value
  s@   € Ø"%¡+ÐØ×ÑÐ 7Ô8Ø×*Ò*¨d¸¨oÑ=Õ*Ø×!Ò!Ð%<Ñ<Ö!rW   c                óö   • U R                   R                  5       nUS:X  a  U R                  U R                  l        U R                  R
                  R                  XR                  45        SU l         SU l        g )Ns   content-dispositionrW   )r”  Úlowerr•  r—  Úcontent_dispositionÚitem_headersrs  )rP   Úfields     rT   Úon_header_endÚ#GradioMultiPartParser.on_header_end  sk   € Ø×1Ñ1×7Ñ7Ó9ˆØÐ*Ó*Ø59×5WÑ5WˆD×ÑÔ2Ø×Ñ×'Ñ'×.Ñ.Ø×6Ñ6Ð7ô	
ð -0ˆÔ)Ø-0ˆÕ*rW   c           	     óV  • [        U R                  R                  =(       d    S5      u  p [        US   [	        U R
                  5      5      U R                  l        SU;   aÐ  U =R                  S-  sl	        U R                  U R                  :”  a  [        SU R                   S35      e[        US   [	        U R
                  5      5      n[        SU R                  S	9nU R                  R                  U5        [        US
U[!        U R                  R"                  S9S9U R                  l        g U =R&                  S-  sl        U R&                  U R(                  :”  a  [        SU R(                   S35      eS U R                  l        g ! [         a  n[        S5      UeS nAff = f)NrW   s   namez=The Content-Disposition header field "name" must be provided.s   filenameé   z+Too many files. Maximum number of files is Ú.F)ÚdeleteÚdirr   )Úraw)rK  rC  rD  r¦   z-Too many fields. Maximum number of fields is )r   r—  rº  r?  rw   r˜  r§  rž   r#   r‘  rŠ  r   rŒ  r›  rs  rA  r   r»  rK  r’  r‹  )rP   Ú_Úoptionsrƒ  rD  Útempfiles         rT   Úon_headers_finishedÚ)GradioMultiPartParser.on_headers_finished  s€  € Ü)¨$×*<Ñ*<×*PÑ*P×*WÐTWÓX‰
ˆð	Ü,=Ø˜Ñ ¤# d§m¡mÓ"4ó-ˆD×ÑÔ)ð ˜'Ó!Ø×Ò 1Ñ$ÕØ×"Ñ" T§^¡^Ó3Ü(ØAÀ$Ç.Á.ÐAQÐQRÐSóð ô )¨°Ñ)=¼sÀ4Ç=Á=Ó?QÓRˆHÜ)°¸D¿O¹OÑLˆHØ×)Ñ)×0Ñ0°Ô:Ü&6ØØØ!Ü D×$6Ñ$6×$CÑ$CÑDñ	'ˆD×ÑÕ#ð × Ò  AÑ%Õ Ø×#Ñ# d§o¡oÓ5Ü(ØCÀDÇOÁOÐCTÐTUÐVóð ð '+ˆD×ÑÕ#øô3 ó 	Ü$ØOóàðûð	ús   ¬1F Æ
F(ÆF#Æ#F(c                ó   • g rH   r�   ro   s    rT   Úon_endÚGradioMultiPartParser.on_end;  s   € ØrW   c           	   ƒ  ó  #   • [        U R                  S   5      u  pUR                  SS5      n[        U[        5      (       a  UR                  S5      nX0l         US   nU R                  U R                  U R                  U R                  U R                  U R                  U R                  U R                   S.n[#        XF5      n U R$                    S h  v•N nUR'                  U5        U R(                   Hä  u  pšU	R*                  (       d   eU	R*                  R,                  =(       d    S[/        U
5      -   U R0                  :”  aK  U R2                  b%  U R2                  R5                  U R6                  5        [        S	U R0                   S
35      eU	R*                  R'                  U
5      I S h  v•N   U	R*                  R8                  R;                  U
5        Mæ     U R<                   H9  n	U	R*                  (       d   eU	R*                  R?                  S5      I S h  v•N   M;     U R(                  RA                  5         U R<                  RA                  5         GMŽ  ! [         a  n[        S5      UeS nAff = f GN¨ NÎ Nb
 Oª! [        [B        4 a—  nU RD                   H6  nURG                  5         [I        URJ                  5      RM                  5         M8     [        U[B        5      (       a5  [O        U5      n[        SURQ                  5       ;   a  S5      UeSU 35      UeUeS nAff = fURS                  5         U R2                  b%  U R2                  R5                  U R6                  5        [U        U RV                  5      $ 7f)NúContent-Types   charsetzutf-8r9  s   boundaryzMissing boundary in multipart.)rž  r£  r©  r³  r¶  r½  rÈ  rË  r   z+File size exceeded maximum allowed size of r¬  Úheaderz&Headers exceeded maximum allowed size.z#Could not parse multipart request: ),r   r¦   rk   rL   r†  r:  r˜  rž   r#   rž  r£  r©  r³  r¶  r½  rÈ  rË  r   r�  Úwriter™  rK  rC  r$  r“  r�  rz  rj  rI  rJ   rš  ÚseekÚclearr   r›  Úcloser   r    Úunlinkrw   r¹  Úfinalizer   rK   )rP   rÅ  ÚparamsÚcharsetÚboundaryrƒ  Ú	callbacksÚparserÚchunkÚpartrÑ   ÚexcrK  Úmessages                 rT   ÚparseÚGradioMultiPartParser.parse>  s  é € ä(¨¯©°nÑ)EÓF‰	ˆØ—*‘*˜Z¨Ó1ˆÜ�gœu×%Ñ%Ø—n‘n YÓ/ˆGØŒð	NØ˜kÑ*ˆHð "×/Ñ/Ø ×-Ñ-Ø×+Ñ+Ø#×3Ñ3Ø#×3Ñ3Ø!×/Ñ/Ø#'×#;Ñ#;Ø—k‘kñ	
ˆ	ô ! Ó5ˆð'	à#Ÿ{š{÷ 3�eØ—‘˜UÔ#ð #'×";Ô";‘J�DØŸ9Ÿ9Ð$˜9ØŸ	™	Ÿ™×+¨!¬s°4«yÑ8¸4×;MÑ;MÓMØ×/Ñ/Ñ;Ø ×0Ñ0×9Ñ9¸$¿.¹.ÔIÜ0ØIÈ$×J\ÑJ\ÐI]Ð]dÐeóð ð Ÿ)™)Ÿ/™/¨$Ó/×/Ð/Ø—I‘I—M‘M×(Ñ(¨Ö.ñ #<ð !×6Ô6�DØŸ9Ÿ9Ð$˜9ØŸ)™)Ÿ.™.¨Ó+×+Ò+ñ 7ð ×)Ñ)×/Ñ/Ô1Ø×*Ñ*×0Ñ0×2øôQ ó 	NÜ$Ð%EÓFÈAÐMûð	Núò&3ñ 0ñ ,ñ'  +øô, #Ô$7Ð8ó 	à×5Ô5�Ø—
‘
”Ü�T—Y‘Y“×&Ñ&Ö(ñ 6ô ˜#Ô2×3Ñ3ô ˜c›(�Ü(à 7§=¡=£?Ó2ð =óð ð	ð ?¸w¸iÐHóð ð	ð
 ˆIûð	úð" 	�‰ÔØ×ÑÑ+Ø× Ñ ×)Ñ)¨$¯.©.Ô9Ü˜Ÿ
™
Ó#Ð#ùs›   ‚AN
ÁI" Á!A&N
ÃJ	 ÃJÃJ ÃJÃCJ	 Æ4JÆ5A-J	 È"JÈ#?J	 É"
I=É,I8É8I=É=N
Ê JÊJ	 ÊJ	 ÊJ	 ÊN
Ê	L0ÊBL+Ì+L0Ì0AN
)r˜  r’  r‘  r–  r—  r”  r•  rš  r™  r›  r¦   rK   r‹  r“  rŠ  rŽ  r�  rŒ  rj  r�  )r¦   r   r�  zAsyncGenerator[bytes, None]rŠ  úUnion[int, float]r‹  rá  rŒ  ústr | Path | Nonerj  r»   r�  úFileUploadProgress | Noner“  zint | floatrŽ  rT  rƒ   rO  r…  )rÑ   r†  r¡  rT  r¢  rT  rƒ   rO  )r­  rT  )rƒ   r   )r…   r†   r‡   rˆ   r‰   rŽ  rU   rž  r£  r©  r®  r³  r¶  r½  rÈ  rË  rß  rŠ   r�   rW   rT   rˆ  rˆ  «  sË   † ñ
ð €Oð (,Ø(,Ø(,Ø $Ø59à.ñ Hàð Hð ,ð Hð
 %ð Hð &ð Hð &ð Hð ð Hð 3ð Hð #ð Hð ð Hð 
õ HôD&ôRôXô"ô=ô=ô1ô+ôB÷F$rW   rˆ  c                óV   • [        XSS9 H  u  p#[        R                  " X#5        M     g )NF)Ústrict)ÚzipÚshutilÚmove)ÚfilesÚdestinationsrK  Údests       rT   Úmove_uploaded_files_to_cacherì  ‡  s!   € Ü˜%°eÔ<‰
ˆÜ�Š�DÖò =rW   c                ón   • U R                  S5      nUb  X!:w  a  XS'   [        R                  " XU5      n U $ )zÍ
Updates the root "key" in the config dictionary to the new root url. If the
root url has changed, all of the urls in the config that correspond to component
file urls are updated to use the new root url.
Úroot)rk   r0   Úadd_root_url)Úconfigrî  Úprevious_roots      rT   Úupdate_root_in_configrò  Œ  s;   € ð —J‘J˜vÓ&€MØÑ Ó 5Øˆv‰Ü!×.Ò.¨v¸]ÓKˆØ€MrW   c                ó>   • SS jn[         R                  " U US 5      $ )zK
Updates the example values in the api_info dictionary to use a public url
c                óº   • U R                  S5      nUbF  [        R                  " U5      (       a+  [        R                  " US   5      (       a  U $ U S   S   US'   U $ )NÚparameter_defaultr­   Úexample_input)rk   r5  Úis_file_obj_with_urlr6  )Ú	file_dictÚdefault_values     rT   Ú_add_root_urlÚ>update_example_values_to_use_public_url.<locals>._add_root_urlž  sf   € Ø!Ÿ™Ð&9Ó:ˆØÑ$¬×)JÒ)JØ÷*
ñ *
ô ×,Ò,¨]¸5Ñ-A×BÑBØ Ð ð $-¨_Ñ#=¸eÑ#DˆM˜%Ñ ØÐrW   c                ó:   • [        U [        5      =(       a    SU ;   $ )Nrõ  )rL   rM   )r˜   s    rT   Ú<lambda>Ú9update_example_values_to_use_public_url.<locals>.<lambda>®  s   € ”*˜Q¤Ó%×BÐ*=ÀÑ*BÐBrW   )rø  rM   )r5  Útraverse)Úapi_inforú  s     rT   Ú'update_example_values_to_use_public_urlr  ™  s%   € ô
ô × Ò ØØÙBóð rW   c                óh   • [         R                  " U R                  5       UR                  5       5      $ rH   )ÚhmacÚcompare_digestÚencode)Úinput_passwordÚcorrect_passwords     rT   Úcompare_passwords_securelyr  ²  s(   € Ü×Ò˜~×4Ñ4Ó6Ð8H×8OÑ8OÓ8QÓRÐRrW   c                ó6   • Sn[         R                  " X5      SL$ )zØThis regex matches strings that start with a scheme (one or more characters not including colon, slash, or space)
followed by ://, or start with just //, \/, /\, or \ as they are interpreted as SMB paths on Windows.
z0^(?:[a-zA-Z][a-zA-Z0-9+\-.]*://|//|\\\\|\\/|/\\)N)ÚreÚmatch)ÚstringÚpatterns     rT   Ústarts_with_protocolr  ¶  s   € ð B€GÜ�8Š8�GÓ$¨DÐ0Ð0rW   c                ó†   • U (       d  gSU ;  a  SU -   n  [        U 5      R                  =(       d    S$ ! [         a     gf = f)zþ
Returns the hostname of a given url, or an empty string if the url cannot be parsed.
Examples:
    get_hostname("https://www.gradio.app") -> "www.gradio.app"
    get_hostname("localhost:7860") -> "localhost"
    get_hostname("127.0.0.1") -> "127.0.0.1"
r®   ú://r  )r   Úhostnamer  )r­   s    rT   Úget_hostnamer  ¾  sG   € ö ØØ�CÓØ˜#‰oˆðÜ˜‹}×%Ñ%×+¨Ð+øÜó Ùðús   •3 ³
A ¿A c                  ó¨   • \ rS rSr  S       SS jjrSS jrSS jrSS jr          SS jr        SS jr	SS	 jr
\SS
 j5       rSrg)ÚCustomCORSMiddlewareiÐ  Nc                ó*  • Xl         X0l        S U l        SU l        SR	                  U R                  5      [        S5      SS.U l        SS0U l        / SQU l        U(       a  [        R                  " S5      b  U R                  R                  S	5        g g )
N)ÚDELETEÚGETÚHEADÚOPTIONSÚPATCHÚPOSTÚPUTz, iX  Útrue)zAccess-Control-Allow-MethodszAccess-Control-Max-Ageú Access-Control-Allow-Credentialsr  )Ú	localhostz	127.0.0.1z0.0.0.0ÚGRADIO_LOCAL_DEV_MODEÚnull)rÜ   Ú
parent_appÚ_parent_configures_corsÚall_methodsÚjoinrw   Úpreflight_headersÚsimple_headersÚlocalhost_aliasesÚosÚgetenvrs  )rP   rÜ   Ústrict_corsr"  s       rT   rU   ÚCustomCORSMiddleware.__init__Ô  sŠ   € ð ŒØ$ŒØ48ˆÔ$ØWˆÔà,0¯I©I°d×6FÑ6FÓ,GÜ&)¨#£hØ06ñ"
ˆÔð
  BÀ6ÐJˆÔâ!FˆÔÞœbŸišiÐ(?Ó@ÑLð ×"Ñ"×)Ñ)¨&Õ1ð	 MrW   c                ó    ^• U R                   c5  SSKJm  [        U4S j[	        U R
                  S/ 5       5       5      U l         U R                   $ )Nr   )ÚCORSMiddlewarec              3  ó@   >#   • U  H  nUR                   TL v •  M     g 7frH   )Úcls)Ú.0Ú
middlewarer.  s     €rT   Ú	<genexpr>Ú>CustomCORSMiddleware.parent_configures_cors.<locals>.<genexpr>ð  s!   øé € ð /â"Q�Jð —‘ .Õ0Ú"Qùs   ƒÚuser_middleware)r#  Ústarlette.middleware.corsr.  Úanyr�   r"  )rP   r.  s    @rT   Úparent_configures_corsÚ+CustomCORSMiddleware.parent_configures_corsì  sH   ø€ Ø×'Ñ'Ñ/Ý@ä+.ô /ä")¨$¯/©/Ð;LÈbÔ"Qó/ó ,ˆDÔ(ð ×+Ñ+Ð+rW   c              ƒ  óÈ  #   • US   S:w  a  U R                  XU5      I S h  v•N   g U R                  5       (       a  U R                  XU5      I S h  v•N   g [        US9nUR                  S5      nUc  U R                  XU5      I S h  v•N   g US   S:X  a'  SU;   a!  U R	                  US9nU" XU5      I S h  v•N   g U R                  XX4S9I S h  v•N   g  N¶ Nˆ NR N$ N7f)	NÚtypeÚhttp©rê   ÚoriginÚmethodr  zaccess-control-request-method)Úrequest_headers)rÜ   r8  r   rk   Úpreflight_responseÚsimple_response)rP   rê   ÚreceiveÚsendr¦   r>  Úresponses          rT   Ú__call__ÚCustomCORSMiddleware.__call__ö  sì   é € Ø�‰=˜FÓ"Ø—(‘(˜5¨4Ó0×0Ð0ØØ×&Ñ&×(Ñ(Ø—(‘(˜5¨4Ó0×0Ð0ØÜ Ñ&ˆØ—‘˜XÓ&ˆØ‰>Ø—(‘(˜5¨4Ó0×0Ð0ØØ�‰?˜iÓ'Ð,KÈwÓ,VØ×.Ñ.¸wÐ.ÐGˆHÙ˜5¨4Ó0×0Ð0ØØ×"Ñ" 5°4Ð"ÐQ×QÑQñ 1ñ 1ñ
 1ñ 1áQùsW   ‚C"¡C¢/C"ÁCÁ7C"Â	CÂ
/C"Â9CÂ:C"ÃC ÃC"ÃC"ÃC"ÃC"Ã C"c                ó°   • [        U R                  5      nUS   nU R                  U5      (       a  X2S'   UR                  S5      nUb  XBS'   [	        SSUS9$ )NÚOriginúAccess-Control-Allow-Originzaccess-control-request-headerszAccess-Control-Allow-HeadersÚOKéÈ   )Ústatus_coder¦   )rM   r&  Úis_valid_originrk   r'   )rP   r@  r¦   r>  Úrequested_headerss        rT   rA  Ú'CustomCORSMiddleware.preflight_response  sf   € Ü�t×-Ñ-Ó.ˆØ  Ñ*ˆØ×Ñ ×0Ñ0Ø5;Ð1Ñ2Ø+×/Ñ/Ð0PÓQÐØÑ(Ø6GÐ2Ñ3Ü  °3ÀÑHÐHrW   c              ƒ  ó‚   #   • [         R                  " U R                  X4S9nU R                  XU5      I S h  v•N   g  N7f)N)rD  r@  )Ú	functoolsÚpartialÚ_sendrÜ   )rP   rê   rC  rD  r@  s        rT   rB  Ú$CustomCORSMiddleware.simple_response  s1   é € ô × Ò  §¡°$ÑXˆØ�h‰h�u tÓ,×,Ó,ùs   ‚5?·=¸?c              ƒ  ó,  #   • US   S:w  a  U" U5      I S h  v•N   g UR                  S/ 5        [        US9nUR                  U R                  5        US   nU R	                  U5      (       a  U R                  XE5        U" U5      I S h  v•N   g  Nx N7f)Nr;  zhttp.response.startr¦   r=  rI  )Ú
setdefaultr   rJ   r'  rN  Úallow_explicit_origin)rP   rÞ  rD  r@  r¦   r>  s         rT   rT  ÚCustomCORSMiddleware._send  s�   é € ð �6‰?Ð3Ó3Ù�w“-×ÐØØ×Ñ˜9 bÔ)Ü  wÑ/ˆØ�‰�t×*Ñ*Ô+Ø  Ñ*ˆØ×Ñ ×0Ñ0Ø×&Ñ& wÔ7Ù�7‹m×Ññ  ñ 	ùs"   ‚B—B˜A2BÂ
BÂBÂBc                óˆ   • US   nUS   n[        U5      n[        U5      nX@R                  ;  =(       d    XPR                  ;   $ )NrI  ÚHost)r  r(  )rP   r@  r>  r«   Ú	host_nameÚorigin_names         rT   rN  Ú$CustomCORSMiddleware.is_valid_origin&  sN   € Ø  Ñ*ˆØ˜vÑ&ˆÜ  Ó&ˆ	Ü" 6Ó*ˆð ×3Ñ3Ñ3÷ 5Ø×4Ñ4Ñ4ð	
rW   c                ó.   • XS'   U R                  S5        g )NrJ  rI  )Úadd_vary_header)r¦   r>  s     rT   rX  Ú*CustomCORSMiddleware.allow_explicit_origin1  s   € à17Ð-Ñ.Ø×Ñ Õ)rW   )r#  r$  rÜ   r(  r"  r&  r'  ©TN)rÜ   r*   r+  r„   r"  z
Any | Nonerƒ   rO  r‚   )rê   r-   rC  r,   rD  r.   rƒ   rO  )r@  r   rƒ   r(   )
rê   r-   rC  r,   rD  r.   r@  r   rƒ   rO  )rÞ  r+   rD  r.   r@  r   rƒ   rO  )r@  r   rƒ   r„   )r¦   r   r>  rw   rƒ   rO  )r…   r†   r‡   rˆ   rU   r8  rF  rA  rB  rT  rN  ÚstaticmethodrX  rŠ   r�   rW   rT   r  r  Ð  s±   † ð !Ø!%ð	2àð2ð ð2ð ð	2ð
 
õ2ô0,ôRô$Ið-Øð-Ø%,ð-Ø48ð-ØKRð-à	ô-ðØðØ&*ðØ=Dðà	ôô	
ð ó*ó ó*rW   r  c           	     óF  • [        5       nU R                  R                  5        H'  nUR                  [	        US[        5       5      5        M)     U R
                   H±  n[        5       nU Hš  nXb;   a  M
   [        U5      n[        R                  " UR                  5       R                  5      nUb*  [        R                  " 5       U-
  R                  5       U:”  a)  [        R                  " U5        UR                  U5        Mš  Mœ     XE-  nM³     g! [          a     M´  f = f)zGDelete files that are older than age. If age is None, delete all files.Úkeep_in_cacheN)rh  rÊ   re   rJ   r�   Útemp_file_setsr   r   ÚfromtimestampÚlstatÚst_ctimeÚnowÚtotal_secondsr)  rÙ   ÚaddÚFileNotFoundError)	rÊ   ÚageÚdont_deleteÚ	componentÚtemp_setÚ	to_removerK  Ú	file_pathÚmodified_times	            rT   Údelete_files_created_by_appru  7  sì   € ä“%€Kà—]‘]×)Ñ)Ö+ˆ	Ø×Ñœ7 9¨o¼s»uÓEÖFñ ,à×)Ô)ˆô “Eˆ	ÛˆDØÓ"Ùð
Ü  ›J�	Ü (× 6Ò 6°y·±Ó7H×7QÑ7QÓ R�à‘KÜ Ÿš›¨Ñ6×EÑEÓGÈ#ÓMä—I’I˜d”OØ—M‘M $Ö'ñ Nñ ð 	ÑŠò% *øô  %ó Úðús   Á6BDÄ
D ÄD c              ƒ  óÊ   #   •  [         R                  " U5      I Sh  v•N   [        R                  R	                  [
        U R                  5       U5      I Sh  v•N   M[   NA N7f)zVStartup task to delete files created by the app based on time since last modification.N)rc  ÚsleepÚanyioÚ	to_threadÚrun_syncru  rÛ   )rÜ   Ú	frequencyrn  s      rT   Údelete_files_on_scheduler|  R  sQ   é € à
Ü�mŠm˜IÓ&×&Ð&Ü�o‰o×&Ñ&Ü'¨¯©Ó)9¸3ó
÷ 	
ð 	
ñ Ù&ñ	
ùs!   ‚A#�Až:A#ÁA!ÁA#Á!A#c              ƒ  óº   #   • U R                  5          U I Sh  v•N   g N! [        R                   a     g[         a    [        R
                  " 5          gf = f7f)z<Cancel a lifespan background task and wait for it to unwind.N)Úcancelrc  ÚCancelledErrorr  Ú	tracebackÚ	print_exc)Útasks    rT   Ú_cancel_background_taskrƒ  [  sG   é € à‡K�K„MðØ�
‹
øÜ×!Ñ!ó ÙÜó ô 	×ÒÖð	üs;   ‚A”! ™š! žAŸ! ¡AµA·AÁAÁAÁAc               ó  #   • [         R                  " [        XU5      5      n S7v •  [        U5      I Sh  v•N   [	        U R                  5       SS9  g N! [        U5      I Sh  v•N    [	        U R                  5       SS9  f = f7f)zKA context manager that triggers the startup and shutdown events of the app.N)rn  )rc  Úcreate_taskr|  rƒ  ru  rÛ   )rÜ   r{  rn  r‚  s       rT   Ú_lifespan_handlerr†  i  sl   é € ô ×ÒÔ7¸ÈÓLÓM€Dð@Üä% dÓ+×+Ð+Ü# C§N¡NÓ$4¸$Ó?ñ 	,øÔ% dÓ+×+Ñ+Ü# C§N¡NÓ$4¸$Ó?üs1   ‚!B¤A ©B·A¸BÁBÁ&A)Á'BÂBc              ƒ  ó„   #   •  U R                   R                  5         [        R                  " S5      I Sh  v•N   M:   N7f)z&Delete all expired state every second.rÀ  N)rÅ   Údelete_all_expired_staterc  rw  )rÜ   s    rT   Ú_delete_stater‰  z  s4   é € à
Ø×Ñ×1Ñ1Ô3Ü�mŠm˜AÓ×Ðñ áùs   ‚5A ·>¸A c               ó²   #   • [         R                  " [        U 5      5      n S7v •  [        U5      I Sh  v•N   g N! [        U5      I Sh  v•N    f = f7f)z9When the server launches, regularly delete expired state.N)rc  r…  r‰  rƒ  )rÜ   r‚  s     rT   Ú_delete_state_handlerr‹  �  sA   é € ô ×Òœ}¨SÓ1Ó2€Dð,Üä% dÓ+×+Ó+øÔ% dÓ+×+Ò+üs.   ‚ A£> ¨A¶<·A¾AÁAÁAÁAc                ó2   ^ ^^• [         SUUU 4S jj5       nU$ )zWReturn a context manager that applies _lifespan_handler and user_lifespan if it exists.c               ó–  >#   • S n[        5        IS h  v•N nUR                  [        U 5      5      I S h  v•N   T(       a+  T(       a$  UR                  [        U TT5      5      I S h  v•N   Tb  UR                  T" U 5      5      I S h  v•N nU7v •  S S S 5      IS h  v•N   g  N� Np N@ N  N! , IS h  v•N  (       d  f       g = f7frH   )r	   Úenter_async_contextr‹  r†  )rÜ   r¯   Ústackrn  r{  Úuser_lifespans      €€€rT   Ú_handlerÚ)create_lifespan_handler.<locals>._handler’  s™   øé € àˆÜ!×#Ô# uØ×+Ñ+Ô,AÀ#Ó,FÓG×GÐGÞžSØ×/Ñ/Ô0AÀ#ÀyÐRUÓ0VÓW×WÐWØÑ(Ø#×7Ñ7¹ÀcÓ8JÓK×K�Ø‹K÷ $×#Ò#ÙGáWáK÷ $×#×#Ð#üsx   ƒC	”B%•C	˜B/¶B'·1B/Á(B)Á)!B/Â
B+Â	B/ÂC	ÂB-Â C	Â'B/Â)B/Â+B/Â-C	Â/CÂ5B8Â6CÃC	©rÜ   rC   )r
   )r�  r{  rn  r‘  s   ``` rT   Úcreate_lifespan_handlerr”  ‹  s#   ú€ ô ÷ð ó ðð €OrW   c                  ó2   • \ rS rSrSSS jjrS	S jrS rSrg)
ÚMediaStreami   Nc                óV   • / U l         S U l        SU l        SU l        Xl        / U l        g )NFrÀ  )ÚsegmentsÚcombined_fileÚendedÚmax_durationÚdesired_output_formatrË  )rP   rœ  s     rT   rU   ÚMediaStream.__init__¡  s/   € Ø02ˆŒØ)-ˆÔØˆŒ
ØˆÔØ%:Ô"ð 13ˆ�rW   c              ƒ  óú   #   • U(       d  g [        [        R                  " 5       5      nU R                  R	                  SU0UE5        [        U R                  [        R                  " US   5      5      U l        g 7f)NÚidÚduration)	rw   ÚuuidÚuuid4r˜  rs  Úmaxr›  ÚmathÚceil)rP   rÑ   Ú
segment_ids      rT   Úadd_segmentÚMediaStream.add_segment¬  sZ   é € ÞØäœŸš›Ó&ˆ
Ø�‰×Ñ˜d JÐ7°$Ð7Ô8Ü × 1Ñ 1´4·9²9¸TÀ*Ñ=MÓ3NÓOˆÕùs   ‚A9A;c                óè   • SU l         U R                  (       a6  U R                  R                  5       n U" 5         U R                  (       a  M5  g g ! [         a    [        R                  SSS9   N5f = f)NTzstream cleanup callback failedr
  )rš  rË  r   r  r  Úwarning)rP   Úcallbacks     rT   Ú
end_streamÚMediaStream.end_stream´  s\   € ØˆŒ
Ø�k�kØ—{‘{—‘Ó(ˆHðPÙ”
ð �k�k‹køô ó Pô —‘Ð?È$�ÓOðPús   ´A ÁA1Á0A1)r™  rœ  rš  r›  rË  r˜  rH   )rœ  r»   )rÑ   zMediaStreamChunk | None)r…   r†   r‡   rˆ   rU   r§  r¬  rŠ   r�   rW   rT   r–  r–     s   † ö	3ôPõ	PrW   r–  c                ó°   • SSK n[        R                  " XSS9nUR                  UR	                  5       5      R                  5       R                  S5      nU$ )zSCreate a URL-safe short hash of the data. Used to generate unique short deep links.r   NF)Údigest_sizeÚusedforsecurityÚ=)Úbase64rG  Úblake2bÚurlsafe_b64encodeÚdigestr:  r"  )rÑ   r¯  r²  Úhash_objÚurl_safe_hashs        rT   Úcreate_url_safe_hashr¸  À  sG   € ãä�Š˜tÈeÑT€HØ×,Ñ,¨X¯_©_Ó->Ó?×FÑFÓH×OÑOÐPSÓT€MàÐrW   c                ó  • [        U 5      n [        R                  " SU 5      R                  SS5      R	                  S5      n [
        R                  " SSU R                  5       5      n [
        R                  " SSU 5      R                  S5      $ )	zè
Convert to ASCII. Convert spaces or repeated dashes to single dashes.
Remove characters that aren't alphanumerics, underscores, or hyphens.
Convert to lowercase. Also strip leading and trailing whitespace,
dashes, and underscores.
ÚNFKDÚasciiÚignorez[^\w\s-]r®   z[-\s]+Ú-z-_)	rw   ÚunicodedataÚ	normalizer  r:  r
  Úsubr¹  r  )rS   s    rT   ÚslugifyrÁ  Ê  sr   € ô �‹J€Eä×Ò˜f eÓ,×3Ñ3°G¸XÓF×MÑMÈgÓVð 
ô �FŠF�;  E§K¡K£MÓ2€EÜ�6Š6�)˜S %Ó(×.Ñ.¨tÓ4Ð4rW   )z/svelte/z/static/z/assets/z/favicon.icoz/file=z/file/z/uploadz/custom_component/c           	     óš   • U R                  S5      u  pnU(       d  U $ UR                  S5      u  pEnU(       d  U $ U SU S[        USS9 3$ )a»  Restore the encoding of a URL that reached the `/proxy=` route.

The ASGI server percent-decodes the request path once before routing, so a
filename that legitimately contains `%`, `#` or `?` arrives here with those
characters literal. Re-encoding everything after the authority hands the
upstream server the same path we were originally asked to proxy, instead of
one that decodes a level too far (or, for `#`, gets truncated as a fragment).
r  r  z/=)Úsafe)Ú	partitionr   )Úurl_pathÚschemeÚ	separatorÚrestÚ	authorityÚslashr-  s          rT   Úrequote_proxied_urlrË  ç  s[   € ð '×0Ñ0°Ó7Ñ€F�tÞØˆØ!Ÿ^™^¨CÓ0Ñ€I�dÞØˆØˆX�S˜˜ 1¤U¨4°dÑ%;Ð$<Ð=Ð=rW   c                óÚ  • US:X  a  [         R                  " S5      e[        U5      (       a  [         R                  " S5      e [        [        R
                  " X5      5      nUR                  5       (       a  [         R                  " S5      eUR                  5       (       d  [         R                  " S5      e[        U5      $ ! [         a  n[         R                  " S5      UeSnAff = f)z¹Safely join the user path to the directory while performing some additional http-related checks,
e.g. ensuring that the full path exists on the local file system and is not a directory
r®   é�  é“  Ni”  )
Úfastapir"   r  r   r1   Ú	safe_joinr9   Úis_dirÚexistsrw   )Ú	directoryr-  Úfullpathrƒ  s       rT   Úroutes_safe_joinrÕ  ù  s½   € ð ˆrƒzÜ×#Ò# CÓ(Ð(Ü˜D×!Ñ!Ü×#Ò# CÓ(Ð(ð0ÜœŸš¨	Ó8Ó9ˆð ‡�×ÑÜ×#Ò# CÓ(Ð(Ø�?‰?×ÑÜ×#Ò# CÓ(Ð(Üˆx‹=Ðøô ó 0Ü×#Ò# CÓ(¨aÐ/ûð0ús   ÁC Ã
C*ÃC%Ã%C*ÚgradioÚ	templatesztemplates/frontend/staticztemplates/frontend/assets>   ú	audio/aacú	audio/mp4ú	audio/oggú	audio/wavú	image/gifú	image/pngú	video/mp4ú	video/oggú
audio/aiffú
audio/flacú
audio/mpegú
audio/webmú
image/jpegú
image/webpú
text/plainú
video/mpegú
video/webmúaudio/x-m4aúaudio/x-wavúaudio/x-aiffúaudio/x-flacúvideo/quicktimeúvideo/x-msvideoúapplication/jsonúaudio/x-matroskaúvideo/x-matroskarØ  rà  rá  rÙ  rð  rÛ  rã  rî  rÞ  rñ  rí  )z.aacz.aifz.aifcz.aiffz.flacz.m4az.m4bz.mkaz.wavz.webaz.aviz.m4vz.mkvz.movc                 ój   • [         R                  5        H  u  p[        R                  " X5        M     g)z¿Teach `mimetypes` the media types in `MEDIA_MIMETYPE_OVERRIDES`.

Must be called after `mimetypes.init()`, which rebuilds the database from
scratch and would otherwise discard these entries.
N)ÚMEDIA_MIMETYPE_OVERRIDESrK   Ú	mimetypesÚadd_type)Ú	extensionÚ	mime_types     rT   Úregister_media_mimetypesrø  L  s)   € ô !9× >Ñ >Ö @Ñˆ	Ü×Ò˜9Ö0ò !ArW   ÚGRADIO_TEMP_DIRc                ó*   • [        [        X5      5      $ rH   )r&   rÕ  )Údeveloper_pathÚ	user_paths     rT   Úfile_responserý  [  s   € ÜÔ(¨ÓCÓDÐDrW   c                óP   • U c  [        [        [        S5      5      $ [        U 5      $ )Nzimg/logo.svg)rý  ÚSTATIC_PATH_LIBr7   r&   )Úfavicon_paths    rT   Úfaviconr  _  s&   € ØÑÜœ_Ô.>¸~Ó.NÓOÐOä˜LÓ)Ð)rW   é   )zcontent-lengthzcontent-rangezaccept-rangeszlast-modifiedÚetagc              ƒ  óŒ  #   • 0 nUR                   R                  S5      nU(       a  X2S'   U nSn  [        R                  " U5      nUR                  S;  d  UR                  (       d  [        SSU  S35      e [        R                  " UR                  5      I Sh  v•N n[        R                  " U5      n	[        R                  " U	[        R                  " SS	S
9S9n
 U
R                  UR                  XBS9nU
R                  USS9I Sh  v•N nUR"                  (       a£  UR                   R                  SS5      nUR!                  5       I Sh  v•N   U
R!                  5       I Sh  v•N   US-  nU[$        :”  d  U(       d  [        SSU  S35      e['        [        R                  " U5      R)                  U5      5      nGM—  UR                   R                  SS5      R+                  S5      S   R-                  5       n[.        R0                  " U5      u  nnU[2        ;   d
  U[2        ;   a  U=(       d    U=(       d    SnSnOSnSnUUSS.n[4         H'  nUUR                   ;   d  M  UR                   U   UU'   M)     XÊ4SS jjn[7        UR9                  5       UR:                  U[=        U5      S9$ ! [         a  n[        SSU  S35      UeSnAff = f GN=! [         a  n[        SSU  S35      UeSnAff = f GNò! [         a/  nU
R!                  5       I Sh  v•N    [        SSU  S35      UeSnAff = f GNì GN×7f)u_  
SSRF-safe way to serve an http(s) URL from the `/gradio_api/file=<url>`
endpoint. Instead of redirecting the caller to `url` (an open redirect, and
a client-side SSRF vector because `gradio_client` follows redirects), the
server fetches `url` itself through `safehttpx` â€” which resolves the host,
confirms it maps to a public IP, and pins that IP for the connection so a DNS
rebind cannot swap in an internal address â€” and streams the bytes back,
re-validating every redirect hop. Hosts that are unresolvable or resolve to a
private / loopback / link-local / reserved address are rejected. See #13593.
ÚRanger   TrÎ  úFile not allowed: rÁ  N)r<  r  g      $@)Úconnect)Ú	transportÚtimeout)r¦   )r�  iö  zCould not fetch file: Úlocationr®   rÀ  zcontent-typeÚ;úapplication/octet-streamÚinlineÚ
attachmentÚnosniff)rÎ  úContent-DispositionzX-Content-Type-Optionsc              “  ót   #   • U R                  5       I S h  v•N   UR                  5       I S h  v•N   g  N N7frH   )Úaclose)Úupstreamrª   s     rT   Ú_closeÚ*secure_url_stream_response.<locals>._close·  s,   é € Ø—/‘/Ó#×#Ð#Ø—-‘-“/×!Ñ!ñ $Ù!ùs   ‚8–4—8®6¯8¶8)rM  r¦   Ú
backgroundr…  )r¦   rk   r  r   r  r"   rÆ  r«   Ú	safehttpxÚasync_validate_urlÚAsyncSecureTransportÚAsyncClientÚTimeoutÚbuild_requestr?  rD  r  Úhas_redirect_locationÚ_FILE_STREAM_MAX_REDIRECTSrw   r%  r  r  rô  Ú
guess_typeÚXSS_SAFE_MIMETYPESÚ _FILE_STREAM_PASSTHROUGH_HEADERSr)   Ú	aiter_rawrM  r   )r­   rŽ   Úforward_headersÚrange_headerÚcurrent_urlÚ	redirectsÚparsedrƒ  Úverified_ipr  rª   Úreqr  r
  Úupstream_mimeÚguessed_mimerÅ  Úcontent_typerº  Úresponse_headersrÏ  r  s                         rT   Úsecure_url_stream_responser.  p  s)  é € ð €OØ—?‘?×&Ñ& wÓ/€LÞØ#/˜Ñ à€KØ€IØ
ð	IÜ—Y’Y˜{Ó+ˆFð �=‰=Ð 1Ó1¸¿¿Ü Ð'9¸#¸¸aÐ%@ÓAÐAð	IÜ )× <Ò <¸V¿[¹[Ó I×IˆKô ×2Ò2°;Ó?ˆ	Ü×"Ò"Ø¬¯ª°tÀTÑ)Jñ
ˆð	MØ×&Ñ&Ø—‘ ð 'ð ˆCð $Ÿ[™[¨°T˜[Ð:×:ˆHð
 ×)×)Ø×'Ñ'×+Ñ+¨J¸Ó;ˆHØ—/‘/Ó#×#Ð#Ø—-‘-“/×!Ð!Ø˜‰NˆIØÔ5Ó5¾XÜ# CÐ+AÀ#ÀÀaÐ)HÓIÐIÜœeŸiši¨Ó4×9Ñ9¸(ÓCÓDˆKÚà ×(Ñ(×,Ñ,¨^¸RÓ@×FÑFÀsÓKÈAÑN×TÑTÓVˆÜ#×.Ò.¨{Ó;‰ˆ�aØÔ.Ó.°,ÔBTÓ2TØ(×V¨L×VÐ<VˆLØ"*Ñà5ˆLØ".Ðð )Ø#6Ø&/ñ
Ð÷
 7ˆFØ˜×)Ñ)Õ)Ø+3×+;Ñ+;¸FÑ+CÐ  Ó(ñ 7ð #+ö 	"ô !Ø×ÑÓ Ø ×,Ñ,Ø$Ü% fÓ-ñ	
ð 	
øôm ó 	IÜ Ð'9¸#¸¸aÐ%@ÓAÀqÐHûð	Iúò
 JøÜó 	IÜ Ð'9¸#¸¸aÐ%@ÓAÀqÐHûð	Iúò ;øÜó 	MØ—-‘-“/×!Ñ!Ü Ð'=¸c¸UÀ!Ð%DÓEÈ1ÐLûð	Múò $Ú!ùsÇ   ‚.M±J6 Á1MÁ9#K ÂKÂK Â!>MÃ -L ÄK?ÄL ÄA MÅL>ÅMÅ*MÅ+C<MÉ+AMÊ6
KË KËKËMËK Ë
K<Ë&K7Ë7K<Ë<MË?L Ì
L;ÌL6ÌL"Ì L6Ì6L;Ì;MÍMc           
     ó¬  • [        U 5      (       a  [        SSU  S35      e[        R                  " U 5      n UR	                  5       (       d  UR                  5       (       d  [        SSU  S35      e SSKJn  [        R                  " UUR                  UR                  UR                  -   U[        [        R                  " 5       5      /S9u  pxU(       d  [        SSU  S35      e[        R                   " U5      u  pšU	["        ;   d  US:X  a  U	=(       d    SnS	nOSnS
nUR$                  R'                  SS5      R)                  5       nUR+                  S5      (       a¸  SU;   a²  USS  nUR-                  S5      u  pïUR/                  5       (       a…  UR/                  5       (       ap  SSKJn  [5        U5      n[5        U5      n[7        UR$                  5      nUUS'   UUS'   UR9                  UUR;                  Xï5      U[<        R>                  " U5      S9$ [A        USS0UUURB                  S9$ ! [         a  n[        SSU  S35      UeS nAff = f)NrÎ  r  rÁ  r   )Ú_StaticFiles)Úblocked_pathsÚallowed_pathsÚcreated_pathsÚallowedr  r  r  r  r®   zbytes=r½  é   )Úranged_responser  rÎ  )Ústat_resultzAccept-Rangesr†  )r¦   Úcontent_disposition_typeÚ
media_typerD  )"r  r"   r1   ÚabspathrÑ  rÒ  r  Úgradio.data_classesr0  Úis_allowed_filer1  r2  Ú	all_pathsrw   Úget_cache_folderrô  r  r   r¦   rk   r  Ú
startswithr  Ú	isnumericrÖ  r6  rT  rM   ÚRangedFileResponseÚ	OpenRanger)  Ústatr&   r    )Úpath_or_urlrŽ   Úblocks_or_configrŒ  Úabs_pathrƒ  r0  r4  Úreasonr÷  rÅ  r9  r8  Ú	range_valr¡  r¢  r6  r¦   s                     rT   Ú
file_fetchrI  Ã  sD  € ô ˜K×(Ñ(Ü˜CÐ#5°k°]À!Ð!DÓEÐEä�}Š}˜[Ó)€HðMØ�?‰?×Ñ H§O¡O×$5Ñ$5Ü Ð'9¸+¸ÀaÐ%HÓIÐIð %6õ
 1ä×+Ò+ØØ&×4Ñ4Ø&×4Ñ4°|×7MÑ7MÑMØ!¤3¤u×'=Ò'=Ó'?Ó#@ÐAñ	�O€Gö Ü˜CÐ#5°k°]À!Ð!DÓEÐEä×'Ò'¨Ó1�L€IØÔ&Ó&¨&°IÓ*=Ø×<Ð"<ˆ
Ø#+Ñ à/ˆ
Ø#/Ð à—‘×#Ñ# G¨RÓ0×6Ñ6Ó8€IØ×Ñ˜H×%Ñ%¨#°Ó*:Ø˜a˜b�Mˆ	Ø—_‘_ SÓ)‰
ˆØ�?‰?×Ñ §¡§¡Ý.ä˜“JˆEÜ�c“(ˆCÜ˜7Ÿ?™?Ó+ˆGØ-EˆGÐ)Ñ*Ø&0ˆG�NÑ#Ø"×5Ñ5ØØ×)Ñ)¨%Ó5ØÜŸGšG HÓ-ð	 6ð ð ô ØØ  'Ð*Ø!9ØØ—‘ñð øôS ó MÜ˜CÐ#5°k°]À!Ð!DÓEÈ1ÐLûðMús   ¸:H3 È3
IÈ=IÉIc              ƒ  ó~  #   • U R                   R                  S5      n[        U=(       d    S5      u  pxUS:w  a
  [        SSS9e[	        U5      R                  SSS9  U(       a  U(       a  UR                  U5        [        U R                   U R                  5       S	S	UUUUS
9n	U	R                  5       I S h  v•N n
/ n/ n/ nU
R                  S5       GHD  n[        U[        5      (       d  [        S5      eUR                  (       a6  [	        UR                  5      R                  n[         R"                  " U5      nOS[$        R&                  " S5       3n[	        U5      UR(                  R+                  5       -  nUR                  SSS9   [,        R.                  " [1        [3        U5      5      [5        U5      5      nUR8                  R;                  5          [<        R>                  " UR8                  R                  U5        URG                  U5        GMG     X¼U4$  GNi! [6         a  n[        SSU 3S9UeS nAff = f! [@         am    U(       a-  SS K!nURD                  " UR8                  R                  U5         N{URG                  UR8                  R                  5        URG                  U5         N³f = f7f)NrÎ  r®   s   multipart/form-datarÍ  zInvalid content type.)rM  ÚdetailT)Úexist_okÚparentsr‰  )rŠ  r‹  rŒ  r“  rj  r�  ré  z+File is not an instance of GradioUploadFileÚtmpé   zInvalid file name: r   )$r¦   rk   r   r"   r   Úmkdirrk  rˆ  r�  rß  ÚgetlistrL   rA  Ú	TypeErrorrD  r    r5  Ú!strip_invalid_filename_charactersÚsecretsÚ	token_hexrI  Ú	hexdigestr1   rÐ  r3   rw   r7   r9   rK  rÓ  r)  ÚrenameÚOSErrorrç  rè  rs  )rŽ   rŒ  r“  rj  Ú
force_mover�  Úcontent_type_headerr,  rÅ  Úmultipart_parserÚformÚoutput_filesÚfiles_to_copyÚ	locationsÚ	temp_fileÚ	file_namer    rÓ  rë  Úerrrç  s                        rT   Ú	upload_fnrc  	  s[  é € ð "Ÿ/™/×-Ñ-¨nÓ=Ðä*Ð+>×+DÀ"ÓE�O€LØÐ-Ó-Ü¨Ð4KÑLÐLäˆÓ×Ñ D°$ÐÑ7Þ–_Ø×Ñ˜iÔ(ä,Ø�‰Ø�‰ÓØØØØ#ØØ'ñ	Ðð "×'Ñ'Ó)×)€Dà€LØ€MØ€IØ—\‘\ '×*ˆ	Ü˜)Ô%5×6Ñ6ÜÐIÓJÐJØ××Ü˜Y×/Ñ/Ó0×5Ñ5ˆIÜ×AÒAÀ)ÓL‰Dàœ×*Ò*¨1Ó-Ð.Ð/ˆDÜ˜Ó$ y§}¡}×'>Ñ'>Ó'@Ñ@ˆ	Ø�‰ ¨tˆÑ4ð	Ü—?’?Üœc )›nÓ-Ô/?ÀÓ/EóˆDð 	�‰×ÑÔð		'Ü�IŠI�i—n‘n×)Ñ)¨4Ô0ð 	×Ñ˜D×!ñ; +ð> ¨	Ð1Ð1òI *øô&  ó 	ÜØÐ*=¸d¸VÐ(Dñàðûð	ûô ó 	'ÞÛà—’˜IŸN™N×/Ñ/°Ö6à×$Ñ$ Y§^¡^×%8Ñ%8Ô9Ø× Ñ  Ö&ð	'üsg   ‚B5J=Â7H Â8CJ=Æ2H#Ç J=Ç+IÈJ=È#
I È-H;È;I É J=É<J:É?J=Ê6J:Ê7J=Ê9J:Ê:J=)rÊ   r=   rÉ   r»   rË   r5   rƒ   r<   )rË   r6   rÍ   r<   r�   r»   rŽ   rº   )rÜ   rC   rË   r6   )rÆ   r>   rË   r6   rƒ   r@   )rË   r6   rƒ   zOptional[OAuthToken])
rÜ   rC   rË   r6   rÔ   úUnion[Request, list[Request]]rÍ   r<   rö   rw   )rÜ   rC   rÍ   r<   rÔ   rd  ró   r   rø   r   rù   rw   rú   r„   rƒ   rO  )rŽ   úfastapi.Requestr  rw   )rŽ   re  r&  rw   rƒ   z	httpx.URL)rŽ   re  rƒ   rw   )rŽ   re  r&  rw   rö   r»   rƒ   rw   )r=  r†  r>  rw   rƒ   rw   )ré  ú	list[str]rê  rf  rƒ   rO  )rð  r2   rî  rw   rƒ   r2   )r   r¼   rƒ   r¼   )r  rw   r  rw   rƒ   r„   )r  rw   rƒ   r„   )r­   rw   rƒ   rw   )rÊ   r=   rn  rN  rƒ   rO  )rÜ   rC   r{  rT  rn  rT  rƒ   rO  )r‚  zasyncio.Taskrƒ   rO  )rÀ  rÀ  )rÜ   rC   r{  rT  rn  rT  rƒ   r   r“  )r�  z3Callable[[App], AbstractAsyncContextManager] | Noner{  rN  rn  rN  rƒ   z,Callable[[App], AbstractAsyncContextManager])é   )rÑ   r†  )rÅ  rw   rƒ   rw   )rÓ  r3   r-  r7   rƒ   rw   r…  )rû  r3   rü  r7   rH   )r   râ  )r­   rw   rŽ   ÚStarletteRequestrb  )rŽ   rh  rY  r„   r�  rã  )¿Ú
__future__r   rc  rR  rG  r  Úimportlib.resourcesÚ	importlibr•   Úloggingr¤  rô  r)  r²   r
  rT  rç  rÇ  Ú	threadingr€  r¾  r¡  Úcollectionsr   r   Úcollections.abcr   r   Ú
contextlibr   r	   r
   Údataclassesr   Úpython_dataclassr   Úpathlibr   r   r   Útypingr   r   r   r   r   r   Úurllib.parser   r   rx  rÏ  Úgradio_client.utilsr1   r5  r  r  Úgradio_client.documentationr   Úpython_multipart.exceptionsr   Úpython_multipart.multipartr   r   Ústarlette.backgroundr   Ústarlette.datastructuresr   r   r   r    r!   Ústarlette.exceptionsr"   Ústarlette.formparsersr#   r$   Ústarlette.requestsr%   rh  Ústarlette.responsesr&   r'   r(   r)   Ústarlette.typesr*   r+   r,   r-   r.   rÖ  r/   r0   r;  r2   r3   r4   r5   r6   r7   Úgradio.exceptionsr8   r9   Úgradio.state_holderr:   Úgradio.utilsr;   Úgradio.blocksr<   r=   r>   rá   r@   rì   rB   Úgradio.routesrC   ÚLockÚconfig_lockr,  ÚinitÚ	getLoggerr…   r  rE   rw   r¾   r  rÁ   rÎ   rÕ   rÞ   ræ   rî   r  r  r  r*  r3  r7  r?  rA  rS  rY  r\  r^  r`  rˆ  rì  rò  r  r  r  r  r  ru  r|  rƒ  r†  r‰  r‹  r”  r–  r¸  rÁ  ÚSTATIC_ROUTE_PREFIXESrË  rÕ  Ú	resourcesré  ÚjoinpathÚas_posixÚSTATIC_TEMPLATE_LIBrÿ  ÚBUILD_PATH_LIBÚVERSIONr   ró  rø  Úenvironrk   Ú
gettempdirÚDEFAULT_TEMP_DIRrý  r  r  r!  r.  rI  rc  r�   rW   rT   Ú<module>r”     s`  ðÝ "ã Û Û Û Û Û Û Û Û Û 	Û Û 	Û Û Û Û Û Û Û ß *ß 4ß WÑ WÝ 5Ý Ý ß >÷÷ ÷ )ã Û Ý *Û Û Ý 0Ý ;ß LÝ /÷õ õ /ß CÝ :÷ó ÷ CÕ Bç 3Ñ 3÷÷ ÷ 6Ý ,Ý ,æßAÑAÝ(Ý'Ý!ð �nŠnÓ€Ø€
ð 
‡‚Ô à	×	Ò	˜8Ó	$€÷9ñ 9ñx 
ƒ÷\.ð \.ó ð\.ñ~ 
ƒô	ˆSó 	ó ð	ô6	˜	ô 	ô"ð&Ø
ðàðð ðð $ô	ôB#ð0Øðà
ðð ôô$
<ðEØ	ðEà
ðEð .ðEð 	ð	Eð
 ôEð` ñBØ	ðBð 	ðBð .ð	Bð
 ðBð ðBð ðBð ðBð 
õBô6ôôDð6%Øð%Ø*-ð%Ø:Dð%àô%ô8%ô4�zô 4ñ  ˜Ñ÷ð ó ðð
 ÷ð ó ðô
	¨	ô 	ô	 yô 	÷4<ñ 4<÷nY$ñ Y$ôx ô

ôô2Sô1ô÷$d*ñ d*ôNô6
ôð à-.ð@Ø	ð@Øð@Ø'*ð@àô@ó ð@ô ð ó,ó ð,ð ØðØFðàðð 
ðð 2õ	÷*Pñ Pö@ò5ð"	Ð ô>ô$ñ& ØØ×Ò×Ò˜hÓ'×0Ò0°Ó=×FÒFÓHóÐ ñ ØØ×Ò×Ò˜hÓ'ß‚XÐ)Ó*ß‚XƒZó	€ñ ØØ×Ò×Ò˜hÓ'ß‚XÐ)Ó*ß‚XƒZó	€ñ Ó
€òÐ ð< ØØØØØØØØØØØØØñÐ ô$1ð —:’:—>’>Ð"3Ó4÷ ¹Ùˆ×	Ó	Ó	Ó (Ñ*ó9Ð ô
Eö*ð  Ð ð$Ð  ôP
òfCðV Ø15ð@2Øð@2ð
 ð@2ð /ö@2rW   