Ë
    úmxiöy  ã                  ó2  — U d Z ddlmZ ddlZddlmZ ddlmZmZ ddl	m
Z
 ddlmZmZ ddlmZ dd	lmZmZ dd
lmZ ddlmZ ddlmZmZ ddlmZmZ ddlmZmZm Z  ddl!m"Z"m#Z# ddl$m%Z% ddl&m'Z' ddl(m)Z) ddl*m+Z+ er0ddl,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7 ddlm8Z8 ddl9m:Z:  ee;«      Z<de=d<   dZ>de=d<   d Z?de=d!<   e>› d"�Z@de=d#<   d$ZAde=d%<   e>› d&�ZBde=d'<   e>› d(�ZCde=d)<   e>› d*�ZDde=d+<   e>› d,�ZEde=d-<   e?› d.�ZFde=d/<   e@› d0�ZGde=d1<   eA› d2�ZHde=d3<   e>› d4�ZIde=d5<   d6ZJde=d7<   dEdFd8„ZKdGd9„ZLdGd:„ZM	 	 	 	 	 	 	 	 	 	 dHd;„ZNdId<„ZO	 	 	 	 	 	 dId=„ZPdId>„ZQdJd?„ZR	 	 	 	 	 	 dKd@„ZS	 	 	 	 	 	 	 	 dLdA„ZT	 	 	 	 	 	 dMdB„ZU	 	 	 	 	 	 dNdC„ZV	 	 	 	 	 	 dOdD„ZWy)Pz(Route handlers for the Starlette server.é    )ÚannotationsN)ÚPath)ÚTYPE_CHECKINGÚFinal)Úquote)ÚconfigÚ	file_util)Ú
get_logger)ÚMediaFileKindÚMediaFileStorageError)Úget_extension_for_mimetype)ÚUploadedFileRec)ÚMAX_APP_STATIC_FILE_SIZEÚSAFE_APP_STATIC_FILE_EXTENSIONS)Úbuild_safe_abspathÚguess_content_type)Ú _DEFAULT_ALLOWED_MESSAGE_ORIGINSÚallow_all_cross_origin_requestsÚis_allowed_origin)Úget_urlÚis_xsrf_enabled)Ústarlette_app_utils)Úvalidate_xsrf_token)ÚXSRF_COOKIE_NAME)ÚStatsRequestHandler)ÚRequest©ÚResponse)Ú	BaseRoute)ÚBaseComponentRegistry)ÚBidiComponentManager)ÚRuntime)ÚMemoryMediaFileStorage)ÚMemoryUploadedFileManagerr   Ú_LOGGERÚ_stcoreÚBASE_ROUTE_COREÚmediaÚBASE_ROUTE_MEDIAz/upload_fileÚBASE_ROUTE_UPLOAD_FILEÚ	componentÚBASE_ROUTE_COMPONENTz/healthÚ_ROUTE_HEALTHz/script-health-checkÚ_ROUTE_SCRIPT_HEALTHz/metricsÚ_ROUTE_METRICSz/host-configÚ_ROUTE_HOST_CONFIGz/{file_id:path}Ú_ROUTE_MEDIAz/{session_id}/{file_id}Ú_ROUTE_UPLOAD_FILEz/{path:path}Ú_ROUTE_COMPONENTS_V1z/bidi-components/{path:path}Ú_ROUTE_COMPONENTS_V2zapp/static/{path:path}Ú_ROUTE_APP_STATICc                óZ   — ddl m} |�|nt        j                  d«      xs d} ||| «      S )a±  Prepend the base URL path to a route path.

    Parameters
    ----------
    path
        The route path to prepend the base URL to (e.g., "_stcore/health").
    base_url
        Optional explicit base URL. If None, uses the configured server.baseUrlPath.
        If an empty string, no base URL is prepended.

    Returns
    -------
    str
        The full route path with base URL prepended (e.g., "/myapp/_stcore/health").
    r   )Úmake_url_pathzserver.baseUrlPathÚ )Ústreamlit.url_utilr7   r   Ú
get_option)ÚpathÚbase_urlr7   Úbases       úf/home/htdocs/ttos/venv/lib/python3.12/site-packages/streamlit/web/server/starlette/starlette_routes.pyÚ
_with_baser?   _   s;   € õ  1ð Ð(‰¬f×.?Ñ.?Ð@TÓ.Uòà	ð 	ñ ˜˜tÓ$Ð$ó    c              ƒ  ó²   K  — t        «       rd|j                  d<   y| j                  j                  d«      }|rt        |«      r||j                  d<   yyy­w)aä  Set CORS headers on a response based on configuration.

    Configures the Access-Control-Allow-Origin header according to the following rules:
    - If CORS is disabled or in development mode: allows all origins ("*")
    - Otherwise: only allows origins that match the configured allowlist

    Parameters
    ----------
    request
        The incoming Starlette request (used to read the Origin header).
    response
        The outgoing Starlette response to set headers on.
    Ú*úAccess-Control-Allow-OriginNÚOrigin)r   ÚheadersÚgetr   )ÚrequestÚresponseÚorigins      r>   Ú_set_cors_headersrJ   w   sY   è ø€ ô 'Ô(Ø:=ˆ×ÑÐ6Ñ7Øà�_‰_× Ñ  Ó*€FÙÔ# FÔ+Ø:@ˆ×ÑÐ6Ò7ð ,€vùs   ‚AAc           
     ó  — t        «       sy| j                  j                  t        «      }d}d}|rt	        j
                  |«      \  }}t	        j                  ||«      }t        |t        |t        t        j                  d«      «      ¬«       y)aÔ  Ensure that the XSRF cookie is set on the response.

    This function manages XSRF (Cross-Site Request Forgery) token generation
    and cookie setting to maintain compatibility with Tornado's implementation.
    If an existing valid XSRF cookie is present, its token bytes and timestamp
    are preserved. Otherwise, a new token is generated.

    The cookie is only set if XSRF protection is enabled in the configuration.
    The Secure flag is added when SSL is configured.

    Note: The XSRF cookie intentionally does NOT have the HttpOnly flag. This
    is required for the double-submit cookie pattern: JavaScript reads the
    cookie value and includes it in the X-Xsrftoken request header, which the
    server then compares against the cookie value to validate requests.

    Parameters
    ----------
    request
        The incoming Starlette request (used to read existing XSRF cookie).
    response
        The outgoing Starlette response to set the cookie on.
    Nzserver.sslCertFile)Úsecure)r   ÚcookiesrF   r   r   Údecode_xsrf_token_stringÚgenerate_xsrf_token_stringÚ_set_unquoted_cookieÚboolr   r:   )rG   rH   Ú
raw_cookieÚtoken_bytesÚ	timestampÚcookie_values         r>   Ú_ensure_xsrf_cookierV   Ž   s‡   € ô. ÔØð —‘×$Ñ$Ô%5Ó6€JØ $€KØ €IÙÜ!4×!MÑ!MØó"
Ñˆ�Yô
 '×AÑAØ�Yó€Lô ØÜØÜ”F×%Ñ%Ð&:Ó;Ó<ö	r@   c               óŠ  — dj                  |› d|› �ddg|rdgng ¢«      }|› d�j                  d«      }| j                  D ��cg c]I  \  }}|j                  «       dk(  r-|j                  «       j	                  |j                  «       «      s||f‘ŒK }}}|j                  d|j                  d«      f«       || _        yc c}}w )	ai  Set a cookie without URL-encoding or quoting the value.

    Starlette's standard set_cookie() method URL-encodes special characters
    (like `|`) in cookie values. This function bypasses that encoding to
    maintain compatibility with Tornado's cookie format, which is required
    for XSRF tokens that use the format "2|mask|token|timestamp".

    If a cookie with the same name already exists, it is replaced.

    Cookie flags set:
    - Path=/: Available to all paths
    - SameSite=Lax: Protects against CSRF while allowing top-level navigations
    - Secure (conditional): Added when SSL is configured

    HttpOnly is intentionally NOT set for XSRF cookies because JavaScript must
    read the cookie value to include it in request headers (double-submit pattern).
    This matches Tornado's behavior.

    Parameters
    ----------
    response
        The Starlette response to set the cookie on.
    cookie_name
        The name of the cookie.
    cookie_value
        The raw cookie value (will not be URL-encoded or quoted).
    secure
        Whether to add the Secure flag (should be True when using HTTPS).
    z; ú=zPath=/zSameSite=LaxÚSecurezlatin-1s
   set-cookieN)ÚjoinÚencodeÚraw_headersÚlowerÚ
startswithÚappend)	rH   Úcookie_namerU   rL   Úheader_valueÚ
key_prefixÚnameÚvalueÚfiltered_headerss	            r>   rP   rP   ¾   sÛ   € ðJ —9‘9àˆm˜1˜\˜NÐ+ØØð	
ñ #ˆx‰j¨ð		
ó€Lð  �= Ð"×)Ñ)¨)Ó4€Jð $×/Ñ/÷3áˆD�%à�J‰J‹L˜MÒ)Ø—‘“×(Ñ(¨×)9Ñ)9Ó);Ô<ð	 
ˆuŠð3Ðñ 3ð ×Ñ˜]¨L×,?Ñ,?À	Ó,JÐKÔLØ+€HÕùó3s   ÁAB?c                ó¨   ‡ ‡‡— ddl mŠmŠ ddlm} d
ˆˆ fd„}dˆfd„} |t        t        |«      |ddg¬«       |t        t        |«      |d	g¬«      gS )aJ  Create health check route handlers for /_stcore/health.

    The health endpoint returns 200 OK when the runtime is ready to accept
    browser connections, or 503 Service Unavailable otherwise. This is used
    by load balancers and orchestration systems to determine service readiness.

    Parameters
    ----------
    runtime
        The Streamlit runtime instance to check health status.
    base_url
        Optional base URL path prefix for the routes.

    Returns
    -------
    list[BaseRoute]
        List of Starlette Route objects for GET, HEAD, and OPTIONS methods.
    r   ©ÚPlainTextResponser   ©ÚRoutec              “  óÄ   •K  — ‰j                   ƒ d {  –—† \  }}|rdnd} ‰||¬«      }d|j                  d<   t        | |«      ƒ d {  –—†  t        | |«       |S 7 ŒH7 Œ­w©NéÈ   i÷  ©Ústatus_codeúno-cacheúCache-Control)Úis_ready_for_browser_connectionrE   rJ   rV   ©rG   ÚokÚmessageÚstatusrH   rh   Úruntimes        €€r>   Ú_health_endpointz.create_health_routes.<locals>._health_endpoint  si   øè ø€ Ø#×CÑC×C‰ˆˆGÙ‘ ˆÙ$ W¸&ÔAˆØ,6ˆ×Ñ˜Ñ)Ü ¨Ó2×2Ð2Ü˜G XÔ.Øˆð Døð 	3ús!   ƒA “A”5A Á	AÁ
A ÁA c              “  ól   •K  —  ‰d¬«      }d|j                   d<   t        | |«      ƒ d {  –—†  |S 7 Œ­w©NéÌ   rn   rp   rq   ©rE   rJ   ©rG   rH   r   s     €r>   Ú_health_optionsz-create_health_routes.<locals>._health_options  ó;   øè ø€ Ù¨Ô,ˆØ,6ˆ×Ñ˜Ñ)Ü ¨Ó2×2Ð2Øˆð 	3úó   ƒ(4«2¬4ÚGETÚHEAD©ÚmethodsÚOPTIONS©rG   r   Úreturnrh   ©rG   r   r‡   r   )Ústarlette.responsesrh   r   Ústarlette.routingrj   r?   r-   )rw   r<   rj   rx   r~   rh   r   s   `    @@r>   Úcreate_health_routesr‹   ú   sZ   ú€ ÷& @Ý'öõñ 	Ü”} hÓ/ØØ˜F�Oô	
ñ
 	Ü”} hÓ/ØØ�Kô	
ðð r@   c                ó¨   ‡ ‡‡— ddl mŠmŠ ddlm} d
ˆˆ fd„}dˆfd„} |t        t        |«      |ddg¬«       |t        t        |«      |d	g¬«      gS )z*Create script health check route handlers.r   rg   ri   c              “  óÌ   •K  — ‰j                  «       ƒ d {  –—† \  }}|rdnd} ‰||¬«      }d|j                  d<   t        | |«      ƒ d {  –—†  t        | |«       |S 7 ŒH7 Œ­wrl   )Údoes_script_run_without_errorrE   rJ   rV   rs   s        €€r>   Ú_script_health_endpointz<create_script_health_routes.<locals>._script_health_endpoint4  sl   øè ø€ Ø#×AÑAÓC×C‰ˆˆGÙ‘ ˆÙ$ W¸&ÔAˆØ,6ˆ×Ñ˜Ñ)Ü ¨Ó2×2Ð2Ü˜G XÔ.Øˆð Døð 	3ús!   ƒA$—A ˜5A$ÁA"ÁA$Á"A$c              “  ól   •K  —  ‰d¬«      }d|j                   d<   t        | |«      ƒ d {  –—†  |S 7 Œ­wrz   r|   r}   s     €r>   Ú_script_health_optionsz;create_script_health_routes.<locals>._script_health_options=  r   r€   r�   r‚   rƒ   r…   r†   rˆ   )r‰   rh   r   rŠ   rj   r?   r.   )rw   r<   rj   r�   r‘   rh   r   s   `    @@r>   Úcreate_script_health_routesr’   -  s\   ú€ ÷ @Ý'öõñ 	ÜÔ+¨XÓ6Ø#Ø˜F�Oô	
ñ
 	ÜÔ+¨XÓ6Ø"Ø�Kô	
ðð r@   c                ó¨   ‡ ‡‡— ddl mŠmŠ ddlm} d	ˆˆˆ fd„}d	ˆfd„} |t        t        |«      |dg¬«       |t        t        |«      |dg¬«      gS )
zCreate metrics route handlers.r   rg   ri   c              “  óŒ  •K  — | j                   j                  d«      }‰	j                  j                  |r|nd ¬«      }| j                  j                  dd«      }d|v r.t        j                  |«      j                  «       } ‰|d¬«      }nt        j                  |«      } ‰|d¬«      }t        | |«      ƒ d {  –—†  |S 7 Œ­w)NÚfamilies)Úfamily_namesÚAcceptr8   zapplication/x-protobuf©Ú
media_typezapplication/openmetrics-text)Úquery_paramsÚgetlistÚ	stats_mgrÚ	get_statsrE   rF   r   Ú_stats_to_protoÚSerializeToStringÚ_stats_to_textrJ   )
rG   Úrequested_familiesÚstatsÚacceptÚpayloadrH   Útextrh   r   rw   s
          €€€r>   Ú_metrics_endpointz0create_metrics_routes.<locals>._metrics_endpointV  sÃ   øè ø€ Ø$×1Ñ1×9Ñ9¸*ÓEÐØ×!Ñ!×+Ñ+Ù/AÑ+Àtð ,ó 
ˆð —‘×$Ñ$ X¨rÓ2ˆØ# vÑ-Ü)×9Ñ9¸%Ó@×RÑRÓTˆGÙ Ð4LÔM‰Hä&×5Ñ5°eÓ<ˆDÙ(ØÐ!?ôˆHô   ¨Ó2×2Ð2Øˆð 	3ús   ƒB8CÂ;CÂ<Cc              “  óŠ   •K  —  ‰d¬«      }d|j                   d<   d|j                   d<   t        | |«      ƒ d {  –—†  |S 7 Œ­w)Nr{   rn   úGET, OPTIONSúAccess-Control-Allow-Methodsr—   úAccess-Control-Allow-Headersr|   r}   s     €r>   Ú_metrics_optionsz/create_metrics_routes.<locals>._metrics_optionsg  sM   øè ø€ Ù¨Ô,ˆØ;Iˆ×ÑÐ7Ñ8Ø;Cˆ×ÑÐ7Ñ8Ü ¨Ó2×2Ð2Øˆð 	3ús   ƒ7AºA»Ar�   rƒ   r…   rˆ   )r‰   rh   r   rŠ   rj   r?   r/   )rw   r<   rj   r¦   r«   rh   r   s   `    @@r>   Úcreate_metrics_routesr¬   Q  sU   ú€ ç?Ý'÷õ"ñ 	Ü”~ xÓ0ØØ�Gô	
ñ
 	Ü”~ xÓ0ØØ�Kô	
ðð r@   c                ó^   ‡— ddl mŠ ddlm} dˆfd„} |t	        t
        | «      |dg¬«      gS )z"Create host config route handlers.r   )ÚJSONResponseri   c           
   “  óì   •K  — t        t        «      }t        j                  d«      rd|vr|j	                  d«        ‰|dddddd dœ«      }t        | |«      ƒ d {  –—†  d|j                  d<   |S 7 Œ­w)Nzglobal.developmentModezhttp://localhostFr8   )ÚallowedOriginsÚuseExternalAuthTokenÚenableCustomParentMessagesÚenforceDownloadInNewTabÚ
metricsUrlÚblockErrorDialogsÚresourceCrossOriginModerp   rq   )Úlistr   r   r:   r_   rJ   rE   )rG   ÚallowedrH   r®   s      €r>   Ú_host_config_endpointz8create_host_config_routes.<locals>._host_config_endpoint�  s†   øè ø€ ÜÔ7Ó8ˆä×ÑÐ6Ô7Ø"¨'Ñ1à�N‰NÐ-Ô.áà")Ø(-Ø.3Ø+0Ø Ø%*Ø+/ñó

ˆô   ¨Ó2×2Ð2Ø,6ˆ×Ñ˜Ñ)Øˆð 	3ús   ƒAA4ÁA2ÁA4r�   rƒ   )rG   r   r‡   r®   )r‰   r®   rŠ   rj   r?   r0   )r<   rj   r¹   r®   s      @r>   Úcreate_host_config_routesrº   |  s5   ø€ å0Ý'õñ0 	ÜÔ)¨8Ó4Ø!Ø�Gô	
ðð r@   c                ó²   ‡ ‡‡— ddl mŠ ddlmŠ ddlm} dˆˆˆ fd„}dˆfd„} |t        t        |«      |ddg¬	«       |t        t        |«      |d
g¬	«      gS )a  Create media file route handlers for /media/{file_id}.

    Serves media files (images, audio, video) stored by st.image, st.audio,
    st.video, and st.download_button. Supports HTTP range requests for
    streaming media playback.

    Parameters
    ----------
    media_storage
        The media file storage backend.
    base_url
        Optional base URL path prefix for the routes.

    Returns
    -------
    list[BaseRoute]
        List of Starlette Route objects for GET, HEAD, and OPTIONS methods.
    r   ©ÚHTTPExceptionr   ri   c              “  óP  •K  — | j                   d   }	 ‰j                  |«      }i }|j                  t        j
                  k(  rF|j                  }|sdt        |j                  «      › �}	 |j                  d«       d|› d�}d
|› �|d<   d|d<   |j                  }t        |«      }d}	| j                  j                  d«      }
|
rJ	 t!        j"                  |
|«      \  }}d}	|||dz    }d|› d|› d|› �|d<   t'        t        |«      «      |d<   nt'        |«      |d<    ‰||	|j                  xs d|¬«      }t)        | |«      ƒ d {  –—†  |S # t        $ r} ‰dd¬«      |‚d }~ww xY w# t        $ r d	t        |«      › �}Y �Œw xY w# t$        $ r  ‰dddd|› �i¬«      ‚w xY w7 Œ]­w)NÚfile_idé”  úFile not found©ro   ÚdetailÚstreamlit_downloadÚlatin1z
filename="ú"zfilename*=utf-8''zattachment; zContent-DispositionÚbyteszAccept-Rangesrm   Úrangei   zInvalid rangezContent-Rangezbytes */)ro   rÃ   rE   éÎ   é   zbytes ú-ú/zContent-Lengthú
text/plain)ro   r™   rE   )Úpath_paramsÚget_filer   Úkindr   ÚDOWNLOADABLEÚfilenamer   Úmimetyper[   ÚUnicodeEncodeErrorr   ÚcontentÚlenrE   rF   r   Úparse_range_headerÚ
ValueErrorÚstrrJ   )rG   r¿   Ú
media_fileÚexcrE   rÒ   ÚdispositionrÕ   Úcontent_lengthro   Úrange_headerÚrange_startÚ	range_endrH   r½   r   Úmedia_storages                 €€€r>   Ú_media_endpointz,create_media_routes.<locals>._media_endpointº  s  øè ø€ Ø×%Ñ% iÑ0ˆð	SØ&×/Ñ/°Ó8ˆJð #%ˆà�?‰?œm×8Ñ8Ò8Ø!×*Ñ*ˆHÙà(Ü1°*×2EÑ2EÓFÐGðIð ðDØ—‘ Ô)Ø *¨8¨*°AÐ6�ð 0<¸K¸=Ð-IˆGÐ)Ñ*ð $+ˆ�Ñ à×$Ñ$ˆÜ˜W›ˆØˆØ—‘×*Ñ*¨7Ó3ˆÙð	Ü)<×)OÑ)OØ  .ó*Ñ&�˜Yð ˆKØ˜k¨I¸©MÐ:ˆGà˜˜ Q y k°°>Ð2BÐCð �OÑ$ô ),¬C°«LÓ(9ˆGÐ$Ò%ä(+¨NÓ(;ˆGÐ$Ñ%áØØ#Ø!×*Ñ*Ò:¨lØô	
ˆô   ¨Ó2×2Ð2Øˆøôk %ò 	SÙ¨CÐ8HÔIÈsÐRûð	Sûô &ò DØ 1´%¸³/Ð1BÐC“ðDûô  ò Ù#Ø #Ø*Ø,°¸Ð8HÐ.IÐJôð ðúð* 	3úsr   ƒF&”E ¥AF&Á+E) ÂAF&ÃF ÃA'F&ÅF$ÅF&Å	E&ÅE!Å!E&Å&F&Å)FÆ F&ÆFÆF&ÆF!Æ!F&c              “  óN   •K  —  ‰d¬«      }t        | |«      ƒ d {  –—†  |S 7 Œ­w©Nr{   rn   ©rJ   r}   s     €r>   Ú_media_optionsz+create_media_routes.<locals>._media_optionsö  ó+   øè ø€ Ù¨Ô,ˆÜ ¨Ó2×2Ð2Øˆð 	3úó   ƒ%œ#�%r�   r‚   rƒ   r…   rˆ   )Ústarlette.exceptionsr½   r‰   r   rŠ   rj   r?   r1   )rá   r<   rj   râ   ræ   r½   r   s   `    @@r>   Úcreate_media_routesrê   ¡  s]   ú€ õ* 3Ý,Ý'÷:õxñ 	Ü”| XÓ.Øà˜F�Oô		
ñ 	Ü”| XÓ.ØØ�Kô	
ðð r@   c                ó&  ‡ ‡‡‡‡	‡
‡— ddl mŠ	 ddlmŠ ddlmŠ ddlm} dˆfd„Š
dd„Šdˆˆfd„}dˆˆˆ	ˆ
ˆˆ ˆfd	„}dˆˆ
ˆˆfd
„} |t        t        |«      |dg¬«       |t        t        |«      |dg¬«       |t        t        |«      |dg¬«      gS )aw  Create file upload route handlers for /_stcore/upload_file/{session_id}/{file_id}.

    Handles file uploads from st.file_uploader widgets. Supports PUT for uploading
    files and DELETE for removing them. XSRF protection is enforced when enabled.

    Parameters
    ----------
    runtime
        The Streamlit runtime instance (used to validate session IDs).
    upload_mgr
        The uploaded file manager to store/retrieve files.
    base_url
        Optional base URL path prefix for the routes.

    Returns
    -------
    list[BaseRoute]
        List of Starlette Route objects for PUT, DELETE, and OPTIONS methods.
    r   )Ú
UploadFiler¼   r   ri   c                ó¼   •— t        «       sy| j                  j                  d«      }| j                  j                  t        «      }t        ||«      s
 ‰dd¬«      ‚y)zÖValidate XSRF token for non-safe HTTP methods.

        Raises HTTPException with 403 if XSRF is enabled and validation fails.
        This mirrors Tornado's automatic XSRF protection for non-GET requests.
        NzX-Xsrftokené“  zXSRF token missing or invalidrÂ   )r   rE   rF   rM   r   r   )rG   Úxsrf_headerÚxsrf_cookier½   s      €r>   Ú_check_xsrfz)create_upload_routes.<locals>._check_xsrf'  sT   ø€ ô Ô Øà—o‘o×)Ñ)¨-Ó8ˆØ—o‘o×)Ñ)Ô*:Ó;ˆä" ;°Ô<Ù¨CÐ8WÔXÐXð =r@   c              “  ó:  K  — d|j                   d<   d|j                   d<   t        «       rYt        t        j                  d«      «      |j                   d<   d|j                   d<   d|j                   d	<   d
|j                   d<   y t        | |«      ƒ d {  –—†  y 7 Œ­w)NzPUT, OPTIONS, DELETEr©   úContent-Typerª   zbrowser.serverAddressrC   zX-Xsrftoken, Content-TyperD   ÚVaryÚtruez Access-Control-Allow-Credentials)rE   r   r   r   r:   rJ   )rG   rH   s     r>   Ú_set_upload_headersz1create_upload_routes.<locals>._set_upload_headers6  sœ   è ø€ Ø;Qˆ×ÑÐ7Ñ8Ø;Iˆ×ÑÐ7Ñ8ÜÔÜ>EÜ×!Ñ!Ð"9Ó:ó?ˆH×ÑÐ:Ñ;ð ,ð ×ÑÐ;Ñ<ð (0ˆH×Ñ˜VÑ$ØCIˆH×ÑÐ?Ò@ä# G¨XÓ6×6Ò6ús   ‚BBÂBÂBc              “  óH   •K  —  ‰d¬«      } ‰| |«      ƒ d {  –—†  |S 7 Œ­wrä   © )rG   rH   r   rö   s     €€r>   Ú_upload_optionsz-create_upload_routes.<locals>._upload_optionsE  s+   øè ø€ Ù¨Ô,ˆÙ! '¨8Ó4×4Ð4Øˆð 	5ús   ƒ"™ š"c           	   “  óÒ  •K  —  ‰| «       | j                   d   }| j                   d   }‰j                  |«      s
 ‰dd¬«      ‚t        j                  d«      dz  dz  }| j                  j                  d«      }|r	 t        |«      |kD  r
 ‰d	d
¬«      ‚	 | j                  «       ƒ d{  –—† }|j                  «       D �cg c]  }t        |‰«      sŒ|‘Œ }}t        |«      dk7  r ‰ddt        |«      › �¬«      ‚|d   }	 |j                  «       ƒ d{  –—† }	|j                  j                  «        t        |	«      |kD  r
 ‰d	d
¬«      ‚‰j                  |t!        ||j"                  xs d|j$                  xs d|	¬«      ¬«        ‰d¬«      }
 ‰| |
«      ƒ d{  –—†  |
S # t        $ r  ‰dd¬«      ‚w xY w7 �Œc c}w 7 Œ­# |j                  j                  «        w xY w7 ŒF­w)zUpload a file to the server.Ú
session_idr¿   i�  zInvalid session_idrÂ   zserver.maxUploadSizei   zcontent-lengthi�  zFile too largezInvalid Content-Length headerNrÊ   zExpected 1 file, but got r   r8   zapplication/octet-stream)r¿   rc   ÚtypeÚdata)rû   Úfiler{   rn   )rÎ   Úis_active_sessionr   r:   rE   rF   ÚintrØ   ÚformÚvaluesÚ
isinstancerÖ   Úreadrþ   ÚcloseÚadd_filer   rÒ   Úcontent_type)rG   rû   r¿   Úmax_size_bytesrÝ   r  rd   ÚuploadsÚuploadrý   rH   r½   r   rì   rñ   rö   rw   Ú
upload_mgrs              €€€€€€€r>   Ú_upload_putz)create_upload_routes.<locals>._upload_putJ  sù  øè ø€ ñ 	�GÔà×(Ñ(¨Ñ6ˆ
Ø×%Ñ% iÑ0ˆà×(Ñ(¨Ô4Ù¨CÐ8LÔMÐMô ×ÑÐ4Ó5¸Ñ<¸tÑCð 	ð
 !Ÿ™×,Ñ,Ð-=Ó>ˆÙðÜ�~Ó&¨Ò7Ù'°CÐ@PÔQÐQð 8ð —\‘\“^×#ˆØ&*§k¡k£mÖU˜U´zÀ%ÈÕ7T’5ÐUˆÐUäˆw‹<˜1ÒÙØÐ*CÄCÈÃLÀ>Ð(Rôð ð ˜‘ˆð
	 ØŸ™›×&ˆDà�K‰K×ÑÔÜˆt‹9�~Ò%Ù¨CÐ8HÔIÐIà×ÑØ!Ü ØØ—_‘_Ò*¨Ø×(Ñ(ÒFÐ,FØô	ð 	ô 	
ñ ¨Ô,ˆÙ! '¨8Ó4×4Ð4ØˆøôK ò Ù#Ø #Ð,Kôð ðúð
 $ûÚUð 'ùà�K‰K×ÑÕúð 	5úsy   ƒA:G'Á>F% ÂG'Â*F<Â+G'ÃF?ÃF?Ã+G'ÄG ÄGÄG ÄBG'ÆG%ÆG'Æ%F9Æ9G'Æ?G'ÇG ÇG"Ç"G'c              “  óº   •K  —  ‰| «       | j                   d   }| j                   d   }‰j                  ||¬«        ‰d¬«      } ‰| |«      ƒ d{  –—†  |S 7 Œ­w)zDelete a file from the server.rû   r¿   )rû   r¿   r{   rn   N)rÎ   Úremove_file)rG   rû   r¿   rH   r   rñ   rö   r  s       €€€€r>   Ú_upload_deletez,create_upload_routes.<locals>._upload_delete†  sh   øè ø€ ñ 	�GÔà×(Ñ(¨Ñ6ˆ
Ø×%Ñ% iÑ0ˆà×Ñ¨*¸gÐÔFÙ¨Ô,ˆÙ! '¨8Ó4×4Ð4Øˆð 	5ús   ƒAAÁAÁAÚPUTrƒ   ÚDELETEr…   )rG   r   r‡   ÚNone©rG   r   rH   r   r‡   r  rˆ   )
Ústarlette.datastructuresrì   ré   r½   r‰   r   rŠ   rj   r?   r2   )rw   r  r<   rj   rù   r  r  r½   r   rì   rñ   rö   s   ``     @@@@@r>   Úcreate_upload_routesr  
  s—   þ€ õ0 4Ý2Ý,Ý'õYó7ö÷
:ó :÷xð ñ 	ÜÔ)¨8Ó4ØØ�Gô	
ñ
 	ÜÔ)¨8Ó4ØØ�Jô	
ñ
 	ÜÔ)¨8Ó4ØØ�Kô	
ðð r@   c                ó¼   ‡ ‡‡‡— ddl ŠddlmŠ ddlmŠ ddlm} dˆˆˆˆ fd„}dˆfd„} |t        t        |«      |dg¬	«       |t        t        |«      |d
g¬	«      gS )z'Create custom component route handlers.r   Nr¼   r   ri   c              “  óî  •K  — | j                   d   }|j                  dd¬«      }t        |«      dk(  s|d   s
 ‰dd¬«      ‚|d   }t        |«      d	k(  r|d   nd
}‰j                  |«      }|€
 ‰dd¬«      ‚t	        ||«      }|€
 ‰dd¬«      ‚	 ‰j                  |d«      ƒ d {  –—† 4 ƒd {  –—† }|j                  «       ƒ d {  –—† }d d d «      ƒd {  –—†   ‰t        |«      ¬«      }
t        | |
«      ƒ d {  –—†  |r|j                  d«      rd|
j                  d<   |
S d|
j                  d<   |
S 7 Œ‘7 ŒŠ7 Œt7 Œf# 1 ƒd {  –—†7  sw Y   ŒvxY w# t        $ r}	 ‰dd¬«      |	‚d }	~	ww xY w7 Œr­w)Nr;   rÌ   rÊ   )Úmaxsplitr   rÀ   zComponent not foundrÂ   é   r8   rî   Ú	ForbiddenÚrbú
read error©rÕ   r™   ú.htmlrp   rq   Úpublic)rÎ   ÚsplitrÖ   Úget_component_pathr   Ú	open_filer  ÚOSErrorr   rJ   ÚendswithrE   )rG   r;   ÚpartsÚcomponent_namerÒ   Úcomponent_rootÚabspathrþ   rý   rÛ   rH   r½   r   ÚanyioÚcomponent_registrys              €€€€r>   Ú_component_endpointz4create_component_routes.<locals>._component_endpoint¯  s’  øè ø€ Ø×"Ñ" 6Ñ*ˆØ—
‘
˜3¨�
Ó+ˆäˆu‹:˜Š? %¨¢(Ù¨CÐ8MÔNÐNà˜q™ˆÜ" 5›z¨Qš�5˜’8°Bˆà+×>Ñ>¸~ÓNˆØÐ!Ù¨CÐ8MÔNÐNô % ^°XÓ>ˆØˆ?Ù¨C¸ÔDÐDð	OØ"Ÿ_™_¨W°dÓ;×;÷ )ð )¸tØ!ŸY™Y›[×(�÷)÷ )ñ
  DÔ5GÈÓ5PÔQˆÜ ¨Ó2×2Ð2á˜8×,Ñ,¨WÔ5Ø0:ˆH×Ñ˜_Ñ-ð ˆð 19ˆH×Ñ˜_Ñ-àˆð <øð )øØ(øð)ø÷ )÷ )ñ )ûäò 	OÙ¨C¸ÔEÈ3ÐNûð	Oúð 	3ús¢   ƒBE5ÂE Â(D:Â)E Â1D<Â2E Â5EÃ	D>Ã
EÃE ÃE ÃE Ã"E5Ä E3Ä9E5Ä:E Ä<E Ä>EÅ E ÅEÅEÅ	EÅE Å	E0Å E+Å+E0Å0E5c              “  óN   •K  —  ‰d¬«      }t        | |«      ƒ d {  –—†  |S 7 Œ­wrä   rå   r}   s     €r>   Ú_component_optionsz3create_component_routes.<locals>._component_optionsÒ  rç   rè   r�   rƒ   r…   rˆ   )	r)  ré   r½   r‰   r   rŠ   rj   r?   r3   )r*  r<   rj   r+  r-  r½   r   r)  s   `    @@@r>   Úcreate_component_routesr.  ¦  se   û€ ó Ý2Ý,Ý'÷!ð !õFñ 	ÜÔ+¨XÓ6ØØ�Gô	
ñ
 	ÜÔ+¨XÓ6ØØ�Kô	
ðð r@   c                ó´   ‡ ‡‡‡— ddl ŠddlmŠmŠ ddlm} d
ˆˆˆˆ fd„}d
ˆfd„} |t        t        |«      |dg¬«       |t        t        |«      |d	g¬«      gS )z.Create bidirectional component route handlers.r   Nrg   ri   c              “  óŠ  •‡ K  — dˆˆ fd„}‰ j                   d   }|j                  d«      }|r|d   nd}|s |dd«      ƒ d {  –—† S ‰j                  |«      € |dd«      ƒ d {  –—† S ‰j                  |«      }|€ |dd«      ƒ d {  –—† S dj	                  |dd  «      }|r|j                  d«      r |dd«      ƒ d {  –—† S t        ||«      }|€ |d	d
«      ƒ d {  –—† S t        j                  j                  |«      r |dd«      ƒ d {  –—† S 	 ‰j                  |d«      ƒ d {  –—† 4 ƒd {  –—† }|j                  «       ƒ d {  –—† }	d d d «      ƒd {  –—†   ‰	t!        |«      ¬«      }t#        ‰ |«      ƒ d {  –—†  |j                  d«      rd|j$                  d<   |S d|j$                  d<   |S 7 �Œx7 �ŒY7 �Œ87 �Œ7 Œæ7 Œ¸7 ŒŸ7 Œ˜7 Œ‚7 Œt# 1 ƒd {  –—†7  sw Y   Œ„xY w# t        $ rM |j                  dd«      j                  dd«      }
t        j                  d|
«        |dd«      ƒ d {  –—†7  cY S w xY w7 Œ½­w)Nc              “  óP   •K  —  ‰| |¬«      }t        ‰|«      ƒ d {  –—†  |S 7 Œ­w)Nrn   rå   )Úbodyro   rH   rh   rG   s      €€r>   Ú_text_responsezVcreate_bidi_component_routes.<locals>._bidi_component_endpoint.<locals>._text_responseî  s-   øè ø€ Ù(¨¸;ÔGˆHÜ# G¨XÓ6×6Ð6ØˆOð 7ús   ƒ&�$ž&r;   rÌ   r   r8   z	not foundrÀ   rÊ   Ú	forbiddenrî   r  ú
úz&Error reading bidi component asset: %sr  r  r  rp   rq   r  )r2  rÙ   ro   r   r‡   rh   )rÎ   r   rF   r!  rZ   r$  r   Úosr;   Úisdirr"  r  r#  Úreplacer%   Ú	exceptionr   rJ   rE   )rG   r3  r;   r%  r&  r'  rÒ   r(  rþ   rý   Úsanitized_abspathrH   rh   r   r)  Úbidi_component_managers   `           €€€€r>   Ú_bidi_component_endpointz>create_bidi_component_routes.<locals>._bidi_component_endpointí  sF  ùè ø€ ö	ð
 ×"Ñ" 6Ñ*ˆØ—
‘
˜3“ˆÙ%*˜˜qš°ˆÙÙ'¨°SÓ9×9Ð9à!×%Ñ% nÓ5Ð=Ù'¨°SÓ9×9Ð9à/×BÑBÀ>ÓRˆØÐ!Ù'¨°SÓ9×9Ð9à—8‘8˜E ! "˜IÓ&ˆÙ˜8×,Ñ,¨SÔ1Ù'¨°SÓ9×9Ð9ä$ ^°XÓ>ˆØˆ?Ù'¨°SÓ9×9Ð9ä�7‰7�=‰=˜Ô!Ù'¨°SÓ9×9Ð9ð	;Ø"Ÿ_™_¨W°dÓ;×;÷ )ð )¸tØ!ŸY™Y›[×(�÷)÷ )ñ  DÔ5GÈÓ5PÔQˆÜ ¨Ó2×2Ð2à×Ñ˜WÔ%Ø0:ˆH×Ñ˜_Ñ-ð ˆð 19ˆH×Ñ˜_Ñ-àˆðM :ùð :ùð :ùð :ùð :øð :øð <øð )øØ(øð)ø÷ )÷ )ñ )ûäò 	;Ø '§¡°°bÓ 9× AÑ AÀ$ÈÓ KÐÜ×ÑØ8Ð:Kôñ (¨°cÓ:×:Ð:Ò:ð	;úð 	3ús  „?IÁF;Á!IÁ%F>Á&#IÂ	GÂ
7IÃGÃIÃ GÃ!/IÄG	ÄIÄG( Ä+GÄ,G( Ä4GÄ5G( Ä8GÅGÅGÅG( ÅGÅG( Å!"IÆIÆ8IÆ>IÇIÇIÇIÇ	IÇG( ÇG( ÇGÇG( ÇG%ÇGÇG%Ç!G( Ç(AH>È5H8È6H>È;IÈ=H>È>Ic              “  óN   •K  —  ‰d¬«      }t        | |«      ƒ d {  –—†  |S 7 Œ­wrä   rå   r}   s     €r>   Ú_bidi_component_optionsz=create_bidi_component_routes.<locals>._bidi_component_options  rç   rè   r�   rƒ   r…   rˆ   )r)  r‰   rh   r   rŠ   rj   r?   r4   )r<  r<   rj   r=  r?  rh   r   r)  s   `    @@@r>   Úcreate_bidi_component_routesr@  å  sb   û€ ó ß?Ý'÷0ð 0õdñ 	ÜÔ+¨XÓ6Ø$Ø�Gô	
ñ
 	ÜÔ+¨XÓ6Ø#Ø�Kô	
ðð r@   c                ó"  ‡‡‡‡— ddl mŠ ddlmŠmŠ ddlm} | r2t        j                  j                  t        j                  | «      «      ndŠdˆˆˆfd„}dˆfd„} |t        t        |«      |dg¬	«       |t        t        |«      |d
g¬	«      gS )z.Create app static serving file route handlers.r   r¼   )ÚFileResponser   ri   Nc              “  ó.  •K  — ‰s
 ‰dd¬«      ‚| j                   j                  dd«      }t        ‰|«      }|€
 ‰dd¬«      ‚t        j                  j                  |«      rt        j                  j                  |«      r
 ‰dd¬«      ‚t        j                  j                  |«      t        kD  r
 ‰dd¬«      ‚t        |«      j                  j                  «       }d }|t        vrd} ‰||¬«      }d	|j                  d
<   d|j                  d<   |S ­w)NrÀ   rÁ   rÂ   r;   r8   zFile is too largerÍ   r˜   rB   rC   ÚnosniffzX-Content-Type-Options)rÎ   rF   r   r7  r;   Úexistsr8  Úgetsizer   r   Úsuffixr]   r   rE   )	rG   Úrelative_pathÚ	safe_pathÚextr™   rH   rB  r½   Úapp_static_roots	         €€€r>   Ú_app_static_endpointz>create_app_static_serving_routes.<locals>._app_static_endpoint@  s  øè ø€ ÙÙ¨CÐ8HÔIÐIà×+Ñ+×/Ñ/°¸Ó;ˆÜ& ¸ÓFˆ	ØÐÙ¨CÐ8HÔIÐIä�w‰w�~‰~˜iÔ(¬B¯G©G¯M©M¸)Ô,DÙ¨CÐ8HÔIÐIä�7‰7�?‰?˜9Ó%Ô(@Ò@ÙØØ*ôð ô
 �9‹o×$Ñ$×*Ñ*Ó,ˆØˆ
ØÔ5Ñ5Ø%ˆJá 	°jÔAˆØ:=ˆ×ÑÐ6Ñ7Ø5>ˆ×ÑÐ1Ñ2Øˆùs   ƒDDc              “  ó|   •K  —  ‰d¬«      }d|j                   d<   d|j                   d<   d|j                   d<   |S ­w)	Nr{   rn   rB   rC   r¨   r©   ró   rª   )rE   )Ú_requestrH   r   s     €r>   Ú_app_static_optionsz=create_app_static_serving_routes.<locals>._app_static_options\  sI   øè ø€ Ù¨Ô,ˆØ:=ˆ×ÑÐ6Ñ7Ø;Iˆ×ÑÐ7Ñ8Ø;Iˆ×ÑÐ7Ñ8Øˆùs   ƒ9<r�   rƒ   r…   rˆ   )rN  r   r‡   r   )ré   r½   r‰   rB  r   rŠ   rj   r7  r;   Úrealpathr	   Úget_app_static_dirr?   r5   )	Úmain_script_pathr<   rj   rL  rO  rB  r½   r   rK  s	        @@@@r>   Ú create_app_static_serving_routesrS  2  s‰   û€ õ 3ß:Ý'ñ ô 	�‰×Ñœ×5Ñ5Ð6FÓGÔHàð ÷õ8ñ 	ÜÔ(¨(Ó3Ø Ø�Gô	
ñ
 	ÜÔ(¨(Ó3ØØ�Kô	
ðð r@   )N)r;   rÙ   r<   ú
str | Noner‡   rÙ   r  )
rH   r   r`   rÙ   rU   rÙ   rL   rQ   r‡   r  )rw   r"   r<   rT  r‡   úlist[BaseRoute])r<   rT  r‡   rU  )rá   r#   r<   rT  r‡   rU  )rw   r"   r  r$   r<   rT  r‡   rU  )r*  r    r<   rT  r‡   rU  )r<  r!   r<   rT  r‡   rU  )rR  rT  r<   rT  r‡   rU  )XÚ__doc__Ú
__future__r   r7  Úpathlibr   Útypingr   r   Úurllib.parser   Ú	streamlitr   r	   Ústreamlit.loggerr
   Ú$streamlit.runtime.media_file_storager   r   Ú+streamlit.runtime.memory_media_file_storager   Ú'streamlit.runtime.uploaded_file_managerr   Ú,streamlit.web.server.app_static_file_handlerr   r   Ú)streamlit.web.server.component_file_utilsr   r   Ústreamlit.web.server.routesr   r   r   Ú streamlit.web.server.server_utilr   r   Ústreamlit.web.server.starletter   Ú2streamlit.web.server.starlette.starlette_app_utilsr   Ú6streamlit.web.server.starlette.starlette_server_configr   Ú*streamlit.web.server.stats_request_handlerr   Ústarlette.requestsr   r‰   r   rŠ   r   Ú2streamlit.components.types.base_component_registryr    Ú)streamlit.components.v2.component_managerr!   Ústreamlit.runtimer"   r#   Ú.streamlit.runtime.memory_uploaded_file_managerr$   Ú__name__r%   Ú__annotations__r'   r)   r*   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r?   rJ   rV   rP   r‹   r’   r¬   rº   rê   r  r.  r@  rS  rø   r@   r>   ú<module>ro     s€  ðò /å "ã 	Ý ß 'Ý ç 'Ý 'ß UÝ RÝ C÷÷÷ñ ÷
 FÝ >Ý RÝ SÝ JáÝ*Ý,Ý+åXÝNÝ)ÝRÝXá˜HÓ%€ˆÓ %ð #€�Ó "Ø!Ð �%Ó !Ø#2Ð"3°<Ð @Ð ˜Ó @Ø)Ð �eÓ )ð *Ð*¨'Ð2€ˆuÓ 2Ø!0Ð 1Ð1EÐFÐ �eÓ Fð +Ð+¨8Ð4€�Ó 4ð  /Ð/¨|Ð<Ð �EÓ <ð *Ð*Ð*;Ð<€ˆeÓ <Ø5Ð6Ð6QÐRÐ �EÓ Rð "6Ð 6°nÐEÐ �eÓ EØ!0Ð 1Ð1OÐPÐ �eÓ Pð 4Ð �5Ó 3ô%ó0Aó.-ð`9,Øð9,àð9,ð ð9,ð
 ð9,ð 
ó9,óx0ðf!Øð!Ø *ð!àó!óH(óV"ðJfØ)ðfØ5?ðfàófðRYØðYà)ðYð ðYð ó	Yðx<Ø-ð<Ø9Cð<àó<ð~JØ0ðJØ<FðJàóJðZ<Ø ð<Ø,6ð<àô<r@   