streamlit-nightly 1.43.2.dev20250307__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- streamlit/__init__.py +306 -0
- streamlit/__main__.py +20 -0
- streamlit/auth_util.py +218 -0
- streamlit/cli_util.py +105 -0
- streamlit/column_config.py +56 -0
- streamlit/commands/__init__.py +13 -0
- streamlit/commands/echo.py +126 -0
- streamlit/commands/execution_control.py +238 -0
- streamlit/commands/experimental_query_params.py +169 -0
- streamlit/commands/logo.py +189 -0
- streamlit/commands/navigation.py +385 -0
- streamlit/commands/page_config.py +311 -0
- streamlit/components/__init__.py +13 -0
- streamlit/components/lib/__init__.py +13 -0
- streamlit/components/lib/local_component_registry.py +84 -0
- streamlit/components/types/__init__.py +13 -0
- streamlit/components/types/base_component_registry.py +99 -0
- streamlit/components/types/base_custom_component.py +150 -0
- streamlit/components/v1/__init__.py +31 -0
- streamlit/components/v1/component_arrow.py +141 -0
- streamlit/components/v1/component_registry.py +130 -0
- streamlit/components/v1/components.py +38 -0
- streamlit/components/v1/custom_component.py +243 -0
- streamlit/config.py +1513 -0
- streamlit/config_option.py +311 -0
- streamlit/config_util.py +177 -0
- streamlit/connections/__init__.py +28 -0
- streamlit/connections/base_connection.py +174 -0
- streamlit/connections/snowflake_connection.py +562 -0
- streamlit/connections/snowpark_connection.py +213 -0
- streamlit/connections/sql_connection.py +425 -0
- streamlit/connections/util.py +97 -0
- streamlit/cursor.py +210 -0
- streamlit/dataframe_util.py +1416 -0
- streamlit/delta_generator.py +602 -0
- streamlit/delta_generator_singletons.py +204 -0
- streamlit/deprecation_util.py +209 -0
- streamlit/development.py +21 -0
- streamlit/elements/__init__.py +13 -0
- streamlit/elements/alert.py +234 -0
- streamlit/elements/arrow.py +962 -0
- streamlit/elements/balloons.py +47 -0
- streamlit/elements/bokeh_chart.py +133 -0
- streamlit/elements/code.py +114 -0
- streamlit/elements/deck_gl_json_chart.py +546 -0
- streamlit/elements/dialog_decorator.py +267 -0
- streamlit/elements/doc_string.py +558 -0
- streamlit/elements/empty.py +130 -0
- streamlit/elements/exception.py +331 -0
- streamlit/elements/form.py +354 -0
- streamlit/elements/graphviz_chart.py +150 -0
- streamlit/elements/heading.py +302 -0
- streamlit/elements/html.py +105 -0
- streamlit/elements/iframe.py +191 -0
- streamlit/elements/image.py +196 -0
- streamlit/elements/json.py +139 -0
- streamlit/elements/layouts.py +879 -0
- streamlit/elements/lib/__init__.py +13 -0
- streamlit/elements/lib/built_in_chart_utils.py +1157 -0
- streamlit/elements/lib/color_util.py +263 -0
- streamlit/elements/lib/column_config_utils.py +542 -0
- streamlit/elements/lib/column_types.py +2188 -0
- streamlit/elements/lib/dialog.py +147 -0
- streamlit/elements/lib/dicttools.py +154 -0
- streamlit/elements/lib/event_utils.py +37 -0
- streamlit/elements/lib/file_uploader_utils.py +66 -0
- streamlit/elements/lib/form_utils.py +77 -0
- streamlit/elements/lib/image_utils.py +441 -0
- streamlit/elements/lib/js_number.py +105 -0
- streamlit/elements/lib/mutable_status_container.py +183 -0
- streamlit/elements/lib/options_selector_utils.py +250 -0
- streamlit/elements/lib/pandas_styler_utils.py +274 -0
- streamlit/elements/lib/policies.py +194 -0
- streamlit/elements/lib/streamlit_plotly_theme.py +207 -0
- streamlit/elements/lib/subtitle_utils.py +176 -0
- streamlit/elements/lib/utils.py +250 -0
- streamlit/elements/map.py +508 -0
- streamlit/elements/markdown.py +277 -0
- streamlit/elements/media.py +793 -0
- streamlit/elements/metric.py +301 -0
- streamlit/elements/plotly_chart.py +546 -0
- streamlit/elements/progress.py +156 -0
- streamlit/elements/pyplot.py +194 -0
- streamlit/elements/snow.py +47 -0
- streamlit/elements/spinner.py +113 -0
- streamlit/elements/text.py +76 -0
- streamlit/elements/toast.py +98 -0
- streamlit/elements/vega_charts.py +1984 -0
- streamlit/elements/widgets/__init__.py +13 -0
- streamlit/elements/widgets/audio_input.py +310 -0
- streamlit/elements/widgets/button.py +1123 -0
- streamlit/elements/widgets/button_group.py +1008 -0
- streamlit/elements/widgets/camera_input.py +263 -0
- streamlit/elements/widgets/chat.py +647 -0
- streamlit/elements/widgets/checkbox.py +352 -0
- streamlit/elements/widgets/color_picker.py +265 -0
- streamlit/elements/widgets/data_editor.py +983 -0
- streamlit/elements/widgets/file_uploader.py +486 -0
- streamlit/elements/widgets/multiselect.py +338 -0
- streamlit/elements/widgets/number_input.py +545 -0
- streamlit/elements/widgets/radio.py +407 -0
- streamlit/elements/widgets/select_slider.py +437 -0
- streamlit/elements/widgets/selectbox.py +366 -0
- streamlit/elements/widgets/slider.py +880 -0
- streamlit/elements/widgets/text_widgets.py +628 -0
- streamlit/elements/widgets/time_widgets.py +970 -0
- streamlit/elements/write.py +574 -0
- streamlit/emojis.py +34 -0
- streamlit/env_util.py +61 -0
- streamlit/error_util.py +105 -0
- streamlit/errors.py +452 -0
- streamlit/external/__init__.py +13 -0
- streamlit/external/langchain/__init__.py +23 -0
- streamlit/external/langchain/streamlit_callback_handler.py +406 -0
- streamlit/file_util.py +247 -0
- streamlit/git_util.py +173 -0
- streamlit/hello/__init__.py +13 -0
- streamlit/hello/animation_demo.py +82 -0
- streamlit/hello/dataframe_demo.py +71 -0
- streamlit/hello/hello.py +37 -0
- streamlit/hello/mapping_demo.py +114 -0
- streamlit/hello/plotting_demo.py +55 -0
- streamlit/hello/streamlit_app.py +55 -0
- streamlit/hello/utils.py +28 -0
- streamlit/logger.py +130 -0
- streamlit/material_icon_names.py +25 -0
- streamlit/navigation/__init__.py +13 -0
- streamlit/navigation/page.py +302 -0
- streamlit/net_util.py +125 -0
- streamlit/platform.py +33 -0
- streamlit/proto/Alert_pb2.py +29 -0
- streamlit/proto/Alert_pb2.pyi +90 -0
- streamlit/proto/AppPage_pb2.py +27 -0
- streamlit/proto/AppPage_pb2.pyi +64 -0
- streamlit/proto/ArrowNamedDataSet_pb2.py +28 -0
- streamlit/proto/ArrowNamedDataSet_pb2.pyi +57 -0
- streamlit/proto/ArrowVegaLiteChart_pb2.py +29 -0
- streamlit/proto/ArrowVegaLiteChart_pb2.pyi +84 -0
- streamlit/proto/Arrow_pb2.py +33 -0
- streamlit/proto/Arrow_pb2.pyi +188 -0
- streamlit/proto/AudioInput_pb2.py +28 -0
- streamlit/proto/AudioInput_pb2.pyi +58 -0
- streamlit/proto/Audio_pb2.py +27 -0
- streamlit/proto/Audio_pb2.pyi +58 -0
- streamlit/proto/AuthRedirect_pb2.py +27 -0
- streamlit/proto/AuthRedirect_pb2.pyi +41 -0
- streamlit/proto/AutoRerun_pb2.py +27 -0
- streamlit/proto/AutoRerun_pb2.pyi +45 -0
- streamlit/proto/BackMsg_pb2.py +29 -0
- streamlit/proto/BackMsg_pb2.pyi +105 -0
- streamlit/proto/Balloons_pb2.py +27 -0
- streamlit/proto/Balloons_pb2.pyi +43 -0
- streamlit/proto/Block_pb2.py +53 -0
- streamlit/proto/Block_pb2.pyi +322 -0
- streamlit/proto/BokehChart_pb2.py +27 -0
- streamlit/proto/BokehChart_pb2.pyi +49 -0
- streamlit/proto/ButtonGroup_pb2.py +36 -0
- streamlit/proto/ButtonGroup_pb2.pyi +169 -0
- streamlit/proto/Button_pb2.py +27 -0
- streamlit/proto/Button_pb2.pyi +71 -0
- streamlit/proto/CameraInput_pb2.py +28 -0
- streamlit/proto/CameraInput_pb2.pyi +58 -0
- streamlit/proto/ChatInput_pb2.py +31 -0
- streamlit/proto/ChatInput_pb2.pyi +111 -0
- streamlit/proto/Checkbox_pb2.py +30 -0
- streamlit/proto/Checkbox_pb2.pyi +90 -0
- streamlit/proto/ClientState_pb2.py +30 -0
- streamlit/proto/ClientState_pb2.pyi +90 -0
- streamlit/proto/Code_pb2.py +27 -0
- streamlit/proto/Code_pb2.pyi +55 -0
- streamlit/proto/ColorPicker_pb2.py +28 -0
- streamlit/proto/ColorPicker_pb2.pyi +67 -0
- streamlit/proto/Common_pb2.py +51 -0
- streamlit/proto/Common_pb2.pyi +293 -0
- streamlit/proto/Components_pb2.py +35 -0
- streamlit/proto/Components_pb2.pyi +172 -0
- streamlit/proto/DataFrame_pb2.py +56 -0
- streamlit/proto/DataFrame_pb2.pyi +397 -0
- streamlit/proto/DateInput_pb2.py +28 -0
- streamlit/proto/DateInput_pb2.pyi +83 -0
- streamlit/proto/DeckGlJsonChart_pb2.py +29 -0
- streamlit/proto/DeckGlJsonChart_pb2.pyi +102 -0
- streamlit/proto/Delta_pb2.py +31 -0
- streamlit/proto/Delta_pb2.pyi +74 -0
- streamlit/proto/DocString_pb2.py +29 -0
- streamlit/proto/DocString_pb2.pyi +93 -0
- streamlit/proto/DownloadButton_pb2.py +27 -0
- streamlit/proto/DownloadButton_pb2.pyi +70 -0
- streamlit/proto/Element_pb2.py +78 -0
- streamlit/proto/Element_pb2.pyi +312 -0
- streamlit/proto/Empty_pb2.py +27 -0
- streamlit/proto/Empty_pb2.pyi +36 -0
- streamlit/proto/Exception_pb2.py +27 -0
- streamlit/proto/Exception_pb2.pyi +72 -0
- streamlit/proto/Favicon_pb2.py +27 -0
- streamlit/proto/Favicon_pb2.pyi +40 -0
- streamlit/proto/FileUploader_pb2.py +28 -0
- streamlit/proto/FileUploader_pb2.pyi +78 -0
- streamlit/proto/ForwardMsg_pb2.py +53 -0
- streamlit/proto/ForwardMsg_pb2.pyi +293 -0
- streamlit/proto/GitInfo_pb2.py +29 -0
- streamlit/proto/GitInfo_pb2.pyi +83 -0
- streamlit/proto/GraphVizChart_pb2.py +27 -0
- streamlit/proto/GraphVizChart_pb2.pyi +53 -0
- streamlit/proto/Heading_pb2.py +27 -0
- streamlit/proto/Heading_pb2.pyi +56 -0
- streamlit/proto/Html_pb2.py +27 -0
- streamlit/proto/Html_pb2.pyi +42 -0
- streamlit/proto/IFrame_pb2.py +27 -0
- streamlit/proto/IFrame_pb2.pyi +59 -0
- streamlit/proto/Image_pb2.py +29 -0
- streamlit/proto/Image_pb2.pyi +84 -0
- streamlit/proto/Json_pb2.py +27 -0
- streamlit/proto/Json_pb2.pyi +53 -0
- streamlit/proto/LabelVisibilityMessage_pb2.py +29 -0
- streamlit/proto/LabelVisibilityMessage_pb2.pyi +68 -0
- streamlit/proto/LinkButton_pb2.py +27 -0
- streamlit/proto/LinkButton_pb2.pyi +58 -0
- streamlit/proto/Logo_pb2.py +27 -0
- streamlit/proto/Logo_pb2.pyi +51 -0
- streamlit/proto/Markdown_pb2.py +29 -0
- streamlit/proto/Markdown_pb2.pyi +86 -0
- streamlit/proto/Metric_pb2.py +32 -0
- streamlit/proto/Metric_pb2.pyi +101 -0
- streamlit/proto/MetricsEvent_pb2.py +30 -0
- streamlit/proto/MetricsEvent_pb2.pyi +200 -0
- streamlit/proto/MultiSelect_pb2.py +28 -0
- streamlit/proto/MultiSelect_pb2.pyi +81 -0
- streamlit/proto/NamedDataSet_pb2.py +28 -0
- streamlit/proto/NamedDataSet_pb2.pyi +59 -0
- streamlit/proto/Navigation_pb2.py +30 -0
- streamlit/proto/Navigation_pb2.pyi +84 -0
- streamlit/proto/NewSession_pb2.py +51 -0
- streamlit/proto/NewSession_pb2.pyi +481 -0
- streamlit/proto/NumberInput_pb2.py +30 -0
- streamlit/proto/NumberInput_pb2.pyi +121 -0
- streamlit/proto/PageConfig_pb2.py +33 -0
- streamlit/proto/PageConfig_pb2.pyi +126 -0
- streamlit/proto/PageInfo_pb2.py +27 -0
- streamlit/proto/PageInfo_pb2.pyi +43 -0
- streamlit/proto/PageLink_pb2.py +27 -0
- streamlit/proto/PageLink_pb2.pyi +63 -0
- streamlit/proto/PageNotFound_pb2.py +27 -0
- streamlit/proto/PageNotFound_pb2.pyi +42 -0
- streamlit/proto/PageProfile_pb2.py +31 -0
- streamlit/proto/PageProfile_pb2.pyi +127 -0
- streamlit/proto/PagesChanged_pb2.py +28 -0
- streamlit/proto/PagesChanged_pb2.pyi +48 -0
- streamlit/proto/ParentMessage_pb2.py +27 -0
- streamlit/proto/ParentMessage_pb2.pyi +46 -0
- streamlit/proto/PlotlyChart_pb2.py +31 -0
- streamlit/proto/PlotlyChart_pb2.pyi +131 -0
- streamlit/proto/Progress_pb2.py +27 -0
- streamlit/proto/Progress_pb2.pyi +43 -0
- streamlit/proto/Radio_pb2.py +28 -0
- streamlit/proto/Radio_pb2.pyi +84 -0
- streamlit/proto/RootContainer_pb2.py +27 -0
- streamlit/proto/RootContainer_pb2.pyi +56 -0
- streamlit/proto/Selectbox_pb2.py +28 -0
- streamlit/proto/Selectbox_pb2.pyi +80 -0
- streamlit/proto/SessionEvent_pb2.py +28 -0
- streamlit/proto/SessionEvent_pb2.pyi +62 -0
- streamlit/proto/SessionStatus_pb2.py +27 -0
- streamlit/proto/SessionStatus_pb2.pyi +57 -0
- streamlit/proto/Skeleton_pb2.py +29 -0
- streamlit/proto/Skeleton_pb2.pyi +71 -0
- streamlit/proto/Slider_pb2.py +32 -0
- streamlit/proto/Slider_pb2.pyi +142 -0
- streamlit/proto/Snow_pb2.py +27 -0
- streamlit/proto/Snow_pb2.pyi +43 -0
- streamlit/proto/Spinner_pb2.py +27 -0
- streamlit/proto/Spinner_pb2.pyi +49 -0
- streamlit/proto/TextArea_pb2.py +28 -0
- streamlit/proto/TextArea_pb2.pyi +80 -0
- streamlit/proto/TextInput_pb2.py +30 -0
- streamlit/proto/TextInput_pb2.pyi +107 -0
- streamlit/proto/Text_pb2.py +27 -0
- streamlit/proto/Text_pb2.pyi +46 -0
- streamlit/proto/TimeInput_pb2.py +28 -0
- streamlit/proto/TimeInput_pb2.pyi +74 -0
- streamlit/proto/Toast_pb2.py +27 -0
- streamlit/proto/Toast_pb2.pyi +45 -0
- streamlit/proto/VegaLiteChart_pb2.py +29 -0
- streamlit/proto/VegaLiteChart_pb2.pyi +71 -0
- streamlit/proto/Video_pb2.py +31 -0
- streamlit/proto/Video_pb2.pyi +117 -0
- streamlit/proto/WidgetStates_pb2.py +31 -0
- streamlit/proto/WidgetStates_pb2.pyi +126 -0
- streamlit/proto/__init__.py +15 -0
- streamlit/proto/openmetrics_data_model_pb2.py +60 -0
- streamlit/proto/openmetrics_data_model_pb2.pyi +522 -0
- streamlit/py.typed +0 -0
- streamlit/runtime/__init__.py +50 -0
- streamlit/runtime/app_session.py +982 -0
- streamlit/runtime/caching/__init__.py +98 -0
- streamlit/runtime/caching/cache_data_api.py +665 -0
- streamlit/runtime/caching/cache_errors.py +142 -0
- streamlit/runtime/caching/cache_resource_api.py +527 -0
- streamlit/runtime/caching/cache_type.py +33 -0
- streamlit/runtime/caching/cache_utils.py +523 -0
- streamlit/runtime/caching/cached_message_replay.py +290 -0
- streamlit/runtime/caching/hashing.py +637 -0
- streamlit/runtime/caching/legacy_cache_api.py +169 -0
- streamlit/runtime/caching/storage/__init__.py +29 -0
- streamlit/runtime/caching/storage/cache_storage_protocol.py +239 -0
- streamlit/runtime/caching/storage/dummy_cache_storage.py +60 -0
- streamlit/runtime/caching/storage/in_memory_cache_storage_wrapper.py +145 -0
- streamlit/runtime/caching/storage/local_disk_cache_storage.py +223 -0
- streamlit/runtime/connection_factory.py +436 -0
- streamlit/runtime/context.py +280 -0
- streamlit/runtime/credentials.py +364 -0
- streamlit/runtime/forward_msg_cache.py +296 -0
- streamlit/runtime/forward_msg_queue.py +240 -0
- streamlit/runtime/fragment.py +477 -0
- streamlit/runtime/media_file_manager.py +234 -0
- streamlit/runtime/media_file_storage.py +143 -0
- streamlit/runtime/memory_media_file_storage.py +181 -0
- streamlit/runtime/memory_session_storage.py +77 -0
- streamlit/runtime/memory_uploaded_file_manager.py +138 -0
- streamlit/runtime/metrics_util.py +486 -0
- streamlit/runtime/pages_manager.py +165 -0
- streamlit/runtime/runtime.py +792 -0
- streamlit/runtime/runtime_util.py +106 -0
- streamlit/runtime/script_data.py +46 -0
- streamlit/runtime/scriptrunner/__init__.py +38 -0
- streamlit/runtime/scriptrunner/exec_code.py +159 -0
- streamlit/runtime/scriptrunner/magic.py +273 -0
- streamlit/runtime/scriptrunner/magic_funcs.py +32 -0
- streamlit/runtime/scriptrunner/script_cache.py +89 -0
- streamlit/runtime/scriptrunner/script_runner.py +756 -0
- streamlit/runtime/scriptrunner_utils/__init__.py +19 -0
- streamlit/runtime/scriptrunner_utils/exceptions.py +48 -0
- streamlit/runtime/scriptrunner_utils/script_requests.py +307 -0
- streamlit/runtime/scriptrunner_utils/script_run_context.py +287 -0
- streamlit/runtime/secrets.py +534 -0
- streamlit/runtime/session_manager.py +394 -0
- streamlit/runtime/state/__init__.py +41 -0
- streamlit/runtime/state/common.py +191 -0
- streamlit/runtime/state/query_params.py +205 -0
- streamlit/runtime/state/query_params_proxy.py +218 -0
- streamlit/runtime/state/safe_session_state.py +138 -0
- streamlit/runtime/state/session_state.py +772 -0
- streamlit/runtime/state/session_state_proxy.py +153 -0
- streamlit/runtime/state/widgets.py +135 -0
- streamlit/runtime/stats.py +109 -0
- streamlit/runtime/uploaded_file_manager.py +148 -0
- streamlit/runtime/websocket_session_manager.py +167 -0
- streamlit/source_util.py +98 -0
- streamlit/static/favicon.png +0 -0
- streamlit/static/index.html +61 -0
- streamlit/static/static/css/index.Bmkmz40k.css +1 -0
- streamlit/static/static/css/index.DpJG_94W.css +1 -0
- streamlit/static/static/css/index.DzuxGC_t.css +1 -0
- streamlit/static/static/js/FileDownload.esm.Bp9m5jrx.js +1 -0
- streamlit/static/static/js/FileHelper.D_3pbilj.js +5 -0
- streamlit/static/static/js/FormClearHelper.Ct2rwLXo.js +1 -0
- streamlit/static/static/js/Hooks.BKdzj5MJ.js +1 -0
- streamlit/static/static/js/InputInstructions.DB3QGNJP.js +1 -0
- streamlit/static/static/js/ProgressBar.D40A5xc2.js +2 -0
- streamlit/static/static/js/RenderInPortalIfExists.DLUCooTN.js +1 -0
- streamlit/static/static/js/Toolbar.BiGGIQun.js +1 -0
- streamlit/static/static/js/UploadFileInfo.C-jY39rj.js +1 -0
- streamlit/static/static/js/base-input.CQBQT24M.js +4 -0
- streamlit/static/static/js/checkbox.Buj8gd_M.js +9 -0
- streamlit/static/static/js/createDownloadLinkElement.DZMwyjvU.js +1 -0
- streamlit/static/static/js/createSuper.CesK3I23.js +1 -0
- streamlit/static/static/js/data-grid-overlay-editor.B69OOFM4.js +1 -0
- streamlit/static/static/js/downloader.BZQhlBNT.js +1 -0
- streamlit/static/static/js/es6.D9Zhqujy.js +2 -0
- streamlit/static/static/js/iframeResizer.contentWindow.CAzcBpCC.js +1 -0
- streamlit/static/static/js/index.08vcOOvb.js +1 -0
- streamlit/static/static/js/index.0uqKfJUS.js +1 -0
- streamlit/static/static/js/index.B02M5u69.js +203 -0
- streamlit/static/static/js/index.B7mcZKMx.js +1 -0
- streamlit/static/static/js/index.BAQDHFA_.js +1 -0
- streamlit/static/static/js/index.BI60cMVr.js +2 -0
- streamlit/static/static/js/index.BLug2inK.js +1 -0
- streamlit/static/static/js/index.BM6TMY8g.js +2 -0
- streamlit/static/static/js/index.BZ9p1t7G.js +1 -0
- streamlit/static/static/js/index.BZqa87a1.js +2 -0
- streamlit/static/static/js/index.BcsRUzZZ.js +1 -0
- streamlit/static/static/js/index.BgVMiY_P.js +197 -0
- streamlit/static/static/js/index.BtuGy7By.js +6 -0
- streamlit/static/static/js/index.BuDuBmrs.js +1 -0
- streamlit/static/static/js/index.BvXU2oKV.js +1 -0
- streamlit/static/static/js/index.BxcwPacT.js +73 -0
- streamlit/static/static/js/index.CWX8KB81.js +1 -0
- streamlit/static/static/js/index.CXzZTo_q.js +1 -0
- streamlit/static/static/js/index.CcRWp_KL.js +1 -0
- streamlit/static/static/js/index.Cd-_xe55.js +3 -0
- streamlit/static/static/js/index.CdG2PXln.js +4537 -0
- streamlit/static/static/js/index.CjXvXmcP.js +1 -0
- streamlit/static/static/js/index.D1HZENZx.js +776 -0
- streamlit/static/static/js/index.D21Efo64.js +1617 -0
- streamlit/static/static/js/index.D9WgGVBx.js +7 -0
- streamlit/static/static/js/index.DEcsHtvb.js +12 -0
- streamlit/static/static/js/index.DFeMfr_K.js +1 -0
- streamlit/static/static/js/index.DHFBoItz.js +1 -0
- streamlit/static/static/js/index.D_PrBKnJ.js +3 -0
- streamlit/static/static/js/index.DmuRkekN.js +3855 -0
- streamlit/static/static/js/index.Do6eY8sf.js +1 -0
- streamlit/static/static/js/index.Dz3lP2P-.js +1 -0
- streamlit/static/static/js/index.Dz_UqF-s.js +1 -0
- streamlit/static/static/js/index.GkSUsPhJ.js +1 -0
- streamlit/static/static/js/index.H1U1IC_d.js +3 -0
- streamlit/static/static/js/index.g6p_4DPr.js +1 -0
- streamlit/static/static/js/index.g9x_GKss.js +1 -0
- streamlit/static/static/js/index.zo9jm08y.js +1 -0
- streamlit/static/static/js/input.DnaFglHq.js +2 -0
- streamlit/static/static/js/inputUtils.CQWz5UKz.js +1 -0
- streamlit/static/static/js/memory.Crb9x4-F.js +1 -0
- streamlit/static/static/js/mergeWith.ouAz0sK3.js +1 -0
- streamlit/static/static/js/number-overlay-editor._UaN-O48.js +9 -0
- streamlit/static/static/js/possibleConstructorReturn.CtGjGFHz.js +1 -0
- streamlit/static/static/js/sandbox.CBybYOhV.js +1 -0
- streamlit/static/static/js/sprintf.D7DtBTRn.js +1 -0
- streamlit/static/static/js/textarea.Cb_uJt5U.js +2 -0
- streamlit/static/static/js/threshold.DjX0wlsa.js +1 -0
- streamlit/static/static/js/timepicker.DKT7pfoF.js +4 -0
- streamlit/static/static/js/timer.CAwTRJ_g.js +1 -0
- streamlit/static/static/js/toConsumableArray.05Ikp13-.js +3 -0
- streamlit/static/static/js/uniqueId.D2FMWUEI.js +1 -0
- streamlit/static/static/js/useBasicWidgetState.urnZLANY.js +1 -0
- streamlit/static/static/js/useOnInputChange.BOKIIdJ1.js +1 -0
- streamlit/static/static/js/value.CgPGBV_l.js +1 -0
- streamlit/static/static/js/withFullScreenWrapper.C_N8J0Xx.js +1 -0
- streamlit/static/static/media/KaTeX_AMS-Regular.BQhdFMY1.woff2 +0 -0
- streamlit/static/static/media/KaTeX_AMS-Regular.DMm9YOAa.woff +0 -0
- streamlit/static/static/media/KaTeX_AMS-Regular.DRggAlZN.ttf +0 -0
- streamlit/static/static/media/KaTeX_Caligraphic-Bold.ATXxdsX0.ttf +0 -0
- streamlit/static/static/media/KaTeX_Caligraphic-Bold.BEiXGLvX.woff +0 -0
- streamlit/static/static/media/KaTeX_Caligraphic-Bold.Dq_IR9rO.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Caligraphic-Regular.CTRA-rTL.woff +0 -0
- streamlit/static/static/media/KaTeX_Caligraphic-Regular.Di6jR-x-.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Caligraphic-Regular.wX97UBjC.ttf +0 -0
- streamlit/static/static/media/KaTeX_Fraktur-Bold.BdnERNNW.ttf +0 -0
- streamlit/static/static/media/KaTeX_Fraktur-Bold.BsDP51OF.woff +0 -0
- streamlit/static/static/media/KaTeX_Fraktur-Bold.CL6g_b3V.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Fraktur-Regular.CB_wures.ttf +0 -0
- streamlit/static/static/media/KaTeX_Fraktur-Regular.CTYiF6lA.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Fraktur-Regular.Dxdc4cR9.woff +0 -0
- streamlit/static/static/media/KaTeX_Main-Bold.Cx986IdX.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Main-Bold.Jm3AIy58.woff +0 -0
- streamlit/static/static/media/KaTeX_Main-Bold.waoOVXN0.ttf +0 -0
- streamlit/static/static/media/KaTeX_Main-BoldItalic.DxDJ3AOS.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Main-BoldItalic.DzxPMmG6.ttf +0 -0
- streamlit/static/static/media/KaTeX_Main-BoldItalic.SpSLRI95.woff +0 -0
- streamlit/static/static/media/KaTeX_Main-Italic.3WenGoN9.ttf +0 -0
- streamlit/static/static/media/KaTeX_Main-Italic.BMLOBm91.woff +0 -0
- streamlit/static/static/media/KaTeX_Main-Italic.NWA7e6Wa.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Main-Regular.B22Nviop.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Main-Regular.Dr94JaBh.woff +0 -0
- streamlit/static/static/media/KaTeX_Main-Regular.ypZvNtVU.ttf +0 -0
- streamlit/static/static/media/KaTeX_Math-BoldItalic.B3XSjfu4.ttf +0 -0
- streamlit/static/static/media/KaTeX_Math-BoldItalic.CZnvNsCZ.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Math-BoldItalic.iY-2wyZ7.woff +0 -0
- streamlit/static/static/media/KaTeX_Math-Italic.DA0__PXp.woff +0 -0
- streamlit/static/static/media/KaTeX_Math-Italic.flOr_0UB.ttf +0 -0
- streamlit/static/static/media/KaTeX_Math-Italic.t53AETM-.woff2 +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Bold.CFMepnvq.ttf +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Bold.D1sUS0GD.woff2 +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Bold.DbIhKOiC.woff +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Italic.C3H0VqGB.woff2 +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Italic.DN2j7dab.woff +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Italic.YYjJ1zSn.ttf +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Regular.BNo7hRIc.ttf +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Regular.CS6fqUqJ.woff +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Regular.DDBCnlJ7.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Script-Regular.C5JkGWo-.ttf +0 -0
- streamlit/static/static/media/KaTeX_Script-Regular.D3wIWfF6.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Script-Regular.D5yQViql.woff +0 -0
- streamlit/static/static/media/KaTeX_Size1-Regular.C195tn64.woff +0 -0
- streamlit/static/static/media/KaTeX_Size1-Regular.Dbsnue_I.ttf +0 -0
- streamlit/static/static/media/KaTeX_Size1-Regular.mCD8mA8B.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Size2-Regular.B7gKUWhC.ttf +0 -0
- streamlit/static/static/media/KaTeX_Size2-Regular.Dy4dx90m.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Size2-Regular.oD1tc_U0.woff +0 -0
- streamlit/static/static/media/KaTeX_Size3-Regular.CTq5MqoE.woff +0 -0
- streamlit/static/static/media/KaTeX_Size3-Regular.DgpXs0kz.ttf +0 -0
- streamlit/static/static/media/KaTeX_Size4-Regular.BF-4gkZK.woff +0 -0
- streamlit/static/static/media/KaTeX_Size4-Regular.DWFBv043.ttf +0 -0
- streamlit/static/static/media/KaTeX_Size4-Regular.Dl5lxZxV.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Typewriter-Regular.C0xS9mPB.woff +0 -0
- streamlit/static/static/media/KaTeX_Typewriter-Regular.CO6r4hn1.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Typewriter-Regular.D3Ib7_Hf.ttf +0 -0
- streamlit/static/static/media/MaterialSymbols-Rounded.DcZbplWk.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-Bold.CFEfr7-q.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-BoldItalic.C-LkFXxa.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-Italic.CxFOx7N-.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-Regular.CBOlD63d.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-SemiBold.CFHwW3Wd.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-SemiBoldItalic.Cg2yRu82.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-Bold.-6c9oR8J.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-BoldItalic.DmM_grLY.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-Italic.I1ipWe7Q.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-Regular.DZLUzqI4.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-SemiBold.sKQIyTMz.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-SemiBoldItalic.C0wP0icr.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-Bold.8TUnKj4x.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-BoldItalic.CBVO7Ve7.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-Italic.DkFgL2HZ.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-Regular.CNJNET2S.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-SemiBold.CHyh9GC5.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-SemiBoldItalic.CBtz8sWN.woff2 +0 -0
- streamlit/static/static/media/balloon-0.Czj7AKwE.png +0 -0
- streamlit/static/static/media/balloon-1.CNvFFrND.png +0 -0
- streamlit/static/static/media/balloon-2.DTvC6B1t.png +0 -0
- streamlit/static/static/media/balloon-3.CgSk4tbL.png +0 -0
- streamlit/static/static/media/balloon-4.mbtFrzxf.png +0 -0
- streamlit/static/static/media/balloon-5.CSwkUfRA.png +0 -0
- streamlit/static/static/media/fireworks.B4d-_KUe.gif +0 -0
- streamlit/static/static/media/flake-0.DgWaVvm5.png +0 -0
- streamlit/static/static/media/flake-1.B2r5AHMK.png +0 -0
- streamlit/static/static/media/flake-2.BnWSExPC.png +0 -0
- streamlit/static/static/media/snowflake.JU2jBHL8.svg +11 -0
- streamlit/string_util.py +203 -0
- streamlit/temporary_directory.py +56 -0
- streamlit/testing/__init__.py +13 -0
- streamlit/testing/v1/__init__.py +17 -0
- streamlit/testing/v1/app_test.py +1050 -0
- streamlit/testing/v1/element_tree.py +2083 -0
- streamlit/testing/v1/local_script_runner.py +180 -0
- streamlit/testing/v1/util.py +53 -0
- streamlit/time_util.py +75 -0
- streamlit/type_util.py +460 -0
- streamlit/url_util.py +122 -0
- streamlit/user_info.py +519 -0
- streamlit/util.py +72 -0
- streamlit/vendor/__init__.py +0 -0
- streamlit/vendor/pympler/__init__.py +0 -0
- streamlit/vendor/pympler/asizeof.py +2869 -0
- streamlit/version.py +18 -0
- streamlit/watcher/__init__.py +28 -0
- streamlit/watcher/event_based_path_watcher.py +406 -0
- streamlit/watcher/folder_black_list.py +82 -0
- streamlit/watcher/local_sources_watcher.py +233 -0
- streamlit/watcher/path_watcher.py +185 -0
- streamlit/watcher/polling_path_watcher.py +124 -0
- streamlit/watcher/util.py +207 -0
- streamlit/web/__init__.py +13 -0
- streamlit/web/bootstrap.py +353 -0
- streamlit/web/cache_storage_manager_config.py +38 -0
- streamlit/web/cli.py +369 -0
- streamlit/web/server/__init__.py +26 -0
- streamlit/web/server/app_static_file_handler.py +93 -0
- streamlit/web/server/authlib_tornado_integration.py +60 -0
- streamlit/web/server/browser_websocket_handler.py +246 -0
- streamlit/web/server/component_request_handler.py +116 -0
- streamlit/web/server/media_file_handler.py +141 -0
- streamlit/web/server/oauth_authlib_routes.py +176 -0
- streamlit/web/server/oidc_mixin.py +108 -0
- streamlit/web/server/routes.py +295 -0
- streamlit/web/server/server.py +479 -0
- streamlit/web/server/server_util.py +161 -0
- streamlit/web/server/stats_request_handler.py +95 -0
- streamlit/web/server/upload_file_request_handler.py +137 -0
- streamlit/web/server/websocket_headers.py +56 -0
- streamlit_nightly-1.43.2.dev20250307.data/scripts/streamlit.cmd +16 -0
- streamlit_nightly-1.43.2.dev20250307.dist-info/METADATA +207 -0
- streamlit_nightly-1.43.2.dev20250307.dist-info/RECORD +563 -0
- streamlit_nightly-1.43.2.dev20250307.dist-info/WHEEL +5 -0
- streamlit_nightly-1.43.2.dev20250307.dist-info/entry_points.txt +2 -0
- streamlit_nightly-1.43.2.dev20250307.dist-info/top_level.txt +1 -0
@@ -0,0 +1,302 @@
|
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
import types
|
18
|
+
from pathlib import Path
|
19
|
+
from typing import Callable
|
20
|
+
|
21
|
+
from streamlit.errors import StreamlitAPIException
|
22
|
+
from streamlit.runtime.metrics_util import gather_metrics
|
23
|
+
from streamlit.runtime.scriptrunner_utils.script_run_context import get_script_run_ctx
|
24
|
+
from streamlit.source_util import page_icon_and_name
|
25
|
+
from streamlit.string_util import validate_icon_or_emoji
|
26
|
+
from streamlit.util import calc_md5
|
27
|
+
|
28
|
+
|
29
|
+
@gather_metrics("Page")
|
30
|
+
def Page(
|
31
|
+
page: str | Path | Callable[[], None],
|
32
|
+
*,
|
33
|
+
title: str | None = None,
|
34
|
+
icon: str | None = None,
|
35
|
+
url_path: str | None = None,
|
36
|
+
default: bool = False,
|
37
|
+
) -> StreamlitPage:
|
38
|
+
"""Configure a page for ``st.navigation`` in a multipage app.
|
39
|
+
|
40
|
+
Call ``st.Page`` to initialize a ``StreamlitPage`` object, and pass it to
|
41
|
+
``st.navigation`` to declare a page in your app.
|
42
|
+
|
43
|
+
When a user navigates to a page, ``st.navigation`` returns the selected
|
44
|
+
``StreamlitPage`` object. Call ``.run()`` on the returned ``StreamlitPage``
|
45
|
+
object to execute the page. You can only run the page returned by
|
46
|
+
``st.navigation``, and you can only run it once per app rerun.
|
47
|
+
|
48
|
+
A page can be defined by a Python file or ``Callable``.
|
49
|
+
|
50
|
+
Parameters
|
51
|
+
----------
|
52
|
+
|
53
|
+
page : str, Path, or callable
|
54
|
+
The page source as a ``Callable`` or path to a Python file. If the page
|
55
|
+
source is defined by a Python file, the path can be a string or
|
56
|
+
``pathlib.Path`` object. Paths can be absolute or relative to the
|
57
|
+
entrypoint file. If the page source is defined by a ``Callable``, the
|
58
|
+
``Callable`` can't accept arguments.
|
59
|
+
|
60
|
+
title : str or None
|
61
|
+
The title of the page. If this is ``None`` (default), the page title
|
62
|
+
(in the browser tab) and label (in the navigation menu) will be
|
63
|
+
inferred from the filename or callable name in ``page``. For more
|
64
|
+
information, see `Overview of multipage apps
|
65
|
+
<https://docs.streamlit.io/st.page.automatic-page-labels>`_.
|
66
|
+
|
67
|
+
icon : str or None
|
68
|
+
An optional emoji or icon to display next to the page title and label.
|
69
|
+
If ``icon`` is ``None`` (default), no icon is displayed next to the
|
70
|
+
page label in the navigation menu, and a Streamlit icon is displayed
|
71
|
+
next to the title (in the browser tab). If ``icon`` is a string, the
|
72
|
+
following options are valid:
|
73
|
+
|
74
|
+
- A single-character emoji. For example, you can set ``icon="🚨"``
|
75
|
+
or ``icon="🔥"``. Emoji short codes are not supported.
|
76
|
+
|
77
|
+
- An icon from the Material Symbols library (rounded style) in the
|
78
|
+
format ``":material/icon_name:"`` where "icon_name" is the name
|
79
|
+
of the icon in snake case.
|
80
|
+
|
81
|
+
For example, ``icon=":material/thumb_up:"`` will display the
|
82
|
+
Thumb Up icon. Find additional icons in the `Material Symbols \
|
83
|
+
<https://fonts.google.com/icons?icon.set=Material+Symbols&icon.style=Rounded>`_
|
84
|
+
font library.
|
85
|
+
|
86
|
+
url_path : str or None
|
87
|
+
The page's URL pathname, which is the path relative to the app's root
|
88
|
+
URL. If this is ``None`` (default), the URL pathname will be inferred
|
89
|
+
from the filename or callable name in ``page``. For more information,
|
90
|
+
see `Overview of multipage apps
|
91
|
+
<https://docs.streamlit.io/st.page.automatic-page-urls>`_.
|
92
|
+
|
93
|
+
The default page will have a pathname of ``""``, indicating the root
|
94
|
+
URL of the app. If you set ``default=True``, ``url_path`` is ignored.
|
95
|
+
``url_path`` can't include forward slashes; paths can't include
|
96
|
+
subdirectories.
|
97
|
+
|
98
|
+
default : bool
|
99
|
+
Whether this page is the default page to be shown when the app is
|
100
|
+
loaded. If ``default`` is ``False`` (default), the page will have a
|
101
|
+
nonempty URL pathname. However, if no default page is passed to
|
102
|
+
``st.navigation`` and this is the first page, this page will become the
|
103
|
+
default page. If ``default`` is ``True``, then the page will have
|
104
|
+
an empty pathname and ``url_path`` will be ignored.
|
105
|
+
|
106
|
+
Returns
|
107
|
+
-------
|
108
|
+
StreamlitPage
|
109
|
+
The page object associated to the given script.
|
110
|
+
|
111
|
+
Example
|
112
|
+
-------
|
113
|
+
>>> import streamlit as st
|
114
|
+
>>>
|
115
|
+
>>> def page2():
|
116
|
+
>>> st.title("Second page")
|
117
|
+
>>>
|
118
|
+
>>> pg = st.navigation([
|
119
|
+
>>> st.Page("page1.py", title="First page", icon="🔥"),
|
120
|
+
>>> st.Page(page2, title="Second page", icon=":material/favorite:"),
|
121
|
+
>>> ])
|
122
|
+
>>> pg.run()
|
123
|
+
"""
|
124
|
+
return StreamlitPage(
|
125
|
+
page, title=title, icon=icon, url_path=url_path, default=default
|
126
|
+
)
|
127
|
+
|
128
|
+
|
129
|
+
class StreamlitPage:
|
130
|
+
"""A page within a multipage Streamlit app.
|
131
|
+
|
132
|
+
Use ``st.Page`` to initialize a ``StreamlitPage`` object.
|
133
|
+
|
134
|
+
Attributes
|
135
|
+
----------
|
136
|
+
icon : str
|
137
|
+
The icon of the page.
|
138
|
+
|
139
|
+
If no icon was declared in ``st.Page``, this property returns ``""``.
|
140
|
+
|
141
|
+
title : str
|
142
|
+
The title of the page.
|
143
|
+
|
144
|
+
Unless declared otherwise in ``st.Page``, the page title is inferred
|
145
|
+
from the filename or callable name. For more information, see
|
146
|
+
`Overview of multipage apps
|
147
|
+
<https://docs.streamlit.io/st.page.automatic-page-labels>`_.
|
148
|
+
|
149
|
+
url_path : str
|
150
|
+
The page's URL pathname, which is the path relative to the app's root
|
151
|
+
URL.
|
152
|
+
|
153
|
+
Unless declared otherwise in ``st.Page``, the URL pathname is inferred
|
154
|
+
from the filename or callable name. For more information, see
|
155
|
+
`Overview of multipage apps
|
156
|
+
<https://docs.streamlit.io/st.page.automatic-page-urls>`_.
|
157
|
+
|
158
|
+
The default page will always have a ``url_path`` of ``""`` to indicate
|
159
|
+
the root URL (e.g. homepage).
|
160
|
+
|
161
|
+
"""
|
162
|
+
|
163
|
+
def __init__(
|
164
|
+
self,
|
165
|
+
page: str | Path | Callable[[], None],
|
166
|
+
*,
|
167
|
+
title: str | None = None,
|
168
|
+
icon: str | None = None,
|
169
|
+
url_path: str | None = None,
|
170
|
+
default: bool = False,
|
171
|
+
):
|
172
|
+
# Must appear before the return so all pages, even if running in bare Python,
|
173
|
+
# have a _default property. This way we can always tell which script needs to run.
|
174
|
+
self._default: bool = default
|
175
|
+
|
176
|
+
ctx = get_script_run_ctx()
|
177
|
+
if not ctx:
|
178
|
+
return
|
179
|
+
|
180
|
+
main_path = ctx.pages_manager.main_script_parent
|
181
|
+
if isinstance(page, str):
|
182
|
+
page = Path(page)
|
183
|
+
if isinstance(page, Path):
|
184
|
+
page = (main_path / page).resolve()
|
185
|
+
|
186
|
+
if not page.is_file():
|
187
|
+
raise StreamlitAPIException(
|
188
|
+
f"Unable to create Page. The file `{page.name}` could not be found."
|
189
|
+
)
|
190
|
+
|
191
|
+
inferred_name = ""
|
192
|
+
inferred_icon = ""
|
193
|
+
if isinstance(page, Path):
|
194
|
+
inferred_icon, inferred_name = page_icon_and_name(page)
|
195
|
+
elif hasattr(page, "__name__"):
|
196
|
+
inferred_name = str(page.__name__)
|
197
|
+
elif title is None:
|
198
|
+
# At this point, we know the page is not a string or a path, so it
|
199
|
+
# must be a callable. We expect it to have a __name__ attribute,
|
200
|
+
# but in special cases (e.g. a callable class instance), one may
|
201
|
+
# not exist. In that case, we should inform the user the title is
|
202
|
+
# mandatory.
|
203
|
+
raise StreamlitAPIException(
|
204
|
+
"Cannot infer page title for Callable. Set the `title=` keyword argument."
|
205
|
+
)
|
206
|
+
|
207
|
+
self._page: Path | Callable[[], None] = page
|
208
|
+
self._title: str = title or inferred_name.replace("_", " ")
|
209
|
+
self._icon: str = icon or inferred_icon
|
210
|
+
|
211
|
+
if self._title.strip() == "":
|
212
|
+
raise StreamlitAPIException(
|
213
|
+
"The title of the page cannot be empty or consist of underscores/spaces only"
|
214
|
+
)
|
215
|
+
|
216
|
+
self._url_path: str = inferred_name
|
217
|
+
if url_path is not None:
|
218
|
+
if url_path.strip() == "" and not default:
|
219
|
+
raise StreamlitAPIException(
|
220
|
+
"The URL path cannot be an empty string unless the page is the default page."
|
221
|
+
)
|
222
|
+
|
223
|
+
self._url_path = url_path.strip("/")
|
224
|
+
if "/" in self._url_path:
|
225
|
+
raise StreamlitAPIException(
|
226
|
+
"The URL path cannot contain a nested path (e.g. foo/bar)."
|
227
|
+
)
|
228
|
+
|
229
|
+
if self._icon:
|
230
|
+
validate_icon_or_emoji(self._icon)
|
231
|
+
|
232
|
+
# used by st.navigation to ordain a page as runnable
|
233
|
+
self._can_be_called: bool = False
|
234
|
+
|
235
|
+
@property
|
236
|
+
def title(self) -> str:
|
237
|
+
"""The title of the page.
|
238
|
+
|
239
|
+
Unless declared otherwise in ``st.Page``, the page title is inferred
|
240
|
+
from the filename or callable name. For more information, see
|
241
|
+
`Overview of multipage apps
|
242
|
+
<https://docs.streamlit.io/st.page.automatic-page-labels>`_.
|
243
|
+
"""
|
244
|
+
return self._title
|
245
|
+
|
246
|
+
@property
|
247
|
+
def icon(self) -> str:
|
248
|
+
"""The icon of the page.
|
249
|
+
|
250
|
+
If no icon was declared in ``st.Page``, this property returns ``""``.
|
251
|
+
"""
|
252
|
+
return self._icon
|
253
|
+
|
254
|
+
@property
|
255
|
+
def url_path(self) -> str:
|
256
|
+
"""The page's URL pathname, which is the path relative to the app's \
|
257
|
+
root URL.
|
258
|
+
|
259
|
+
Unless declared otherwise in ``st.Page``, the URL pathname is inferred
|
260
|
+
from the filename or callable name. For more information, see
|
261
|
+
`Overview of multipage apps
|
262
|
+
<https://docs.streamlit.io/st.page.automatic-page-urls>`_.
|
263
|
+
|
264
|
+
The default page will always have a ``url_path`` of ``""`` to indicate
|
265
|
+
the root URL (e.g. homepage).
|
266
|
+
"""
|
267
|
+
return "" if self._default else self._url_path
|
268
|
+
|
269
|
+
def run(self) -> None:
|
270
|
+
"""Execute the page.
|
271
|
+
|
272
|
+
When a page is returned by ``st.navigation``, use the ``.run()`` method
|
273
|
+
within your entrypoint file to render the page. You can only call this
|
274
|
+
method on the page returned by ``st.navigation``. You can only call
|
275
|
+
this method once per run of your entrypoint file.
|
276
|
+
|
277
|
+
"""
|
278
|
+
if not self._can_be_called:
|
279
|
+
raise StreamlitAPIException(
|
280
|
+
"This page cannot be called directly. Only the page returned from st.navigation can be called once."
|
281
|
+
)
|
282
|
+
|
283
|
+
self._can_be_called = False
|
284
|
+
|
285
|
+
ctx = get_script_run_ctx()
|
286
|
+
if not ctx:
|
287
|
+
return
|
288
|
+
|
289
|
+
with ctx.run_with_active_hash(self._script_hash):
|
290
|
+
if callable(self._page):
|
291
|
+
self._page()
|
292
|
+
return
|
293
|
+
else:
|
294
|
+
code = ctx.pages_manager.get_page_script_byte_code(str(self._page))
|
295
|
+
module = types.ModuleType("__main__")
|
296
|
+
# We want __file__ to be the path to the script
|
297
|
+
module.__dict__["__file__"] = self._page
|
298
|
+
exec(code, module.__dict__)
|
299
|
+
|
300
|
+
@property
|
301
|
+
def _script_hash(self) -> str:
|
302
|
+
return calc_md5(self._url_path)
|
streamlit/net_util.py
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
from __future__ import annotations
|
16
|
+
|
17
|
+
from typing import Final
|
18
|
+
|
19
|
+
from streamlit.logger import get_logger
|
20
|
+
|
21
|
+
_LOGGER: Final = get_logger(__name__)
|
22
|
+
|
23
|
+
# URLs for checking the current machine's external IP address.
|
24
|
+
_AWS_CHECK_IP: Final = "http://checkip.amazonaws.com"
|
25
|
+
_AWS_CHECK_IP_HTTPS: Final = "https://checkip.amazonaws.com"
|
26
|
+
|
27
|
+
# URL of Streamlit's help page.
|
28
|
+
_HELP_DOC: Final = "https://docs.streamlit.io/"
|
29
|
+
|
30
|
+
_external_ip: str | None = None
|
31
|
+
_internal_ip: str | None = None
|
32
|
+
|
33
|
+
|
34
|
+
def get_external_ip() -> str | None:
|
35
|
+
"""Get the *external* IP address of the current machine.
|
36
|
+
|
37
|
+
Returns
|
38
|
+
-------
|
39
|
+
string
|
40
|
+
The external IPv4 address of the current machine.
|
41
|
+
|
42
|
+
"""
|
43
|
+
global _external_ip
|
44
|
+
|
45
|
+
if _external_ip is not None:
|
46
|
+
return _external_ip
|
47
|
+
|
48
|
+
response = _make_blocking_http_get(_AWS_CHECK_IP, timeout=5)
|
49
|
+
|
50
|
+
if response is None:
|
51
|
+
response = _make_blocking_http_get(_AWS_CHECK_IP_HTTPS, timeout=5)
|
52
|
+
|
53
|
+
if _looks_like_an_ip_adress(response):
|
54
|
+
_external_ip = response
|
55
|
+
else:
|
56
|
+
_LOGGER.warning(
|
57
|
+
"Did not auto detect external IP.\nPlease go to %s for debugging hints.",
|
58
|
+
_HELP_DOC,
|
59
|
+
)
|
60
|
+
_external_ip = None
|
61
|
+
|
62
|
+
return _external_ip
|
63
|
+
|
64
|
+
|
65
|
+
def get_internal_ip() -> str | None:
|
66
|
+
"""Get the *local* IP address of the current machine.
|
67
|
+
|
68
|
+
From: https://stackoverflow.com/a/28950776
|
69
|
+
|
70
|
+
Returns
|
71
|
+
-------
|
72
|
+
string
|
73
|
+
The local IPv4 address of the current machine.
|
74
|
+
|
75
|
+
"""
|
76
|
+
global _internal_ip
|
77
|
+
|
78
|
+
if _internal_ip is not None:
|
79
|
+
return _internal_ip
|
80
|
+
|
81
|
+
import socket
|
82
|
+
|
83
|
+
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
|
84
|
+
try:
|
85
|
+
# Doesn't even have to be reachable
|
86
|
+
s.connect(("8.8.8.8", 1))
|
87
|
+
_internal_ip = s.getsockname()[0]
|
88
|
+
except Exception:
|
89
|
+
_internal_ip = "127.0.0.1"
|
90
|
+
|
91
|
+
return _internal_ip
|
92
|
+
|
93
|
+
|
94
|
+
def _make_blocking_http_get(url: str, timeout: float = 5) -> str | None:
|
95
|
+
import requests
|
96
|
+
|
97
|
+
try:
|
98
|
+
text = requests.get(url, timeout=timeout).text
|
99
|
+
if isinstance(text, str):
|
100
|
+
text = text.strip()
|
101
|
+
return text
|
102
|
+
except Exception:
|
103
|
+
return None
|
104
|
+
|
105
|
+
|
106
|
+
def _looks_like_an_ip_adress(address: str | None) -> bool:
|
107
|
+
if address is None:
|
108
|
+
return False
|
109
|
+
|
110
|
+
import socket
|
111
|
+
|
112
|
+
try:
|
113
|
+
socket.inet_pton(socket.AF_INET, address)
|
114
|
+
return True # Yup, this is an IPv4 address!
|
115
|
+
except (AttributeError, OSError):
|
116
|
+
pass
|
117
|
+
|
118
|
+
try:
|
119
|
+
socket.inet_pton(socket.AF_INET6, address)
|
120
|
+
return True # Yup, this is an IPv6 address!
|
121
|
+
except (AttributeError, OSError):
|
122
|
+
pass
|
123
|
+
|
124
|
+
# Nope, this is not an IP address.
|
125
|
+
return False
|
streamlit/platform.py
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
"""Platform module."""
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
|
19
|
+
from streamlit.proto.ForwardMsg_pb2 import ForwardMsg
|
20
|
+
from streamlit.runtime.scriptrunner_utils.script_run_context import get_script_run_ctx
|
21
|
+
|
22
|
+
|
23
|
+
def post_parent_message(message: str) -> None:
|
24
|
+
"""
|
25
|
+
Sends a string message to the parent window (when host configuration allows).
|
26
|
+
"""
|
27
|
+
ctx = get_script_run_ctx()
|
28
|
+
if ctx is None:
|
29
|
+
return
|
30
|
+
|
31
|
+
fwd_msg = ForwardMsg()
|
32
|
+
fwd_msg.parent_message.message = message
|
33
|
+
ctx.enqueue(fwd_msg)
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
3
|
+
# source: streamlit/proto/Alert.proto
|
4
|
+
# Protobuf Python Version: 5.26.1
|
5
|
+
"""Generated protocol buffer code."""
|
6
|
+
from google.protobuf import descriptor as _descriptor
|
7
|
+
from google.protobuf import descriptor_pool as _descriptor_pool
|
8
|
+
from google.protobuf import symbol_database as _symbol_database
|
9
|
+
from google.protobuf.internal import builder as _builder
|
10
|
+
# @@protoc_insertion_point(imports)
|
11
|
+
|
12
|
+
_sym_db = _symbol_database.Default()
|
13
|
+
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1bstreamlit/proto/Alert.proto\"\x87\x01\n\x05\x41lert\x12\x0c\n\x04\x62ody\x18\x01 \x01(\t\x12\x1d\n\x06\x66ormat\x18\x02 \x01(\x0e\x32\r.Alert.Format\x12\x0c\n\x04icon\x18\x03 \x01(\t\"C\n\x06\x46ormat\x12\n\n\x06UNUSED\x10\x00\x12\t\n\x05\x45RROR\x10\x01\x12\x0b\n\x07WARNING\x10\x02\x12\x08\n\x04INFO\x10\x03\x12\x0b\n\x07SUCCESS\x10\x04\x42*\n\x1c\x63om.snowflake.apps.streamlitB\nAlertProtob\x06proto3')
|
18
|
+
|
19
|
+
_globals = globals()
|
20
|
+
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
21
|
+
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'streamlit.proto.Alert_pb2', _globals)
|
22
|
+
if not _descriptor._USE_C_DESCRIPTORS:
|
23
|
+
_globals['DESCRIPTOR']._loaded_options = None
|
24
|
+
_globals['DESCRIPTOR']._serialized_options = b'\n\034com.snowflake.apps.streamlitB\nAlertProto'
|
25
|
+
_globals['_ALERT']._serialized_start=32
|
26
|
+
_globals['_ALERT']._serialized_end=167
|
27
|
+
_globals['_ALERT_FORMAT']._serialized_start=100
|
28
|
+
_globals['_ALERT_FORMAT']._serialized_end=167
|
29
|
+
# @@protoc_insertion_point(module_scope)
|
@@ -0,0 +1,90 @@
|
|
1
|
+
"""
|
2
|
+
@generated by mypy-protobuf. Do not edit manually!
|
3
|
+
isort:skip_file
|
4
|
+
*!
|
5
|
+
Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
6
|
+
|
7
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
+
you may not use this file except in compliance with the License.
|
9
|
+
You may obtain a copy of the License at
|
10
|
+
|
11
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
|
13
|
+
Unless required by applicable law or agreed to in writing, software
|
14
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
16
|
+
See the License for the specific language governing permissions and
|
17
|
+
limitations under the License.
|
18
|
+
"""
|
19
|
+
|
20
|
+
import builtins
|
21
|
+
import google.protobuf.descriptor
|
22
|
+
import google.protobuf.internal.enum_type_wrapper
|
23
|
+
import google.protobuf.message
|
24
|
+
import sys
|
25
|
+
import typing
|
26
|
+
|
27
|
+
if sys.version_info >= (3, 10):
|
28
|
+
import typing as typing_extensions
|
29
|
+
else:
|
30
|
+
import typing_extensions
|
31
|
+
|
32
|
+
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
|
33
|
+
|
34
|
+
@typing.final
|
35
|
+
class Alert(google.protobuf.message.Message):
|
36
|
+
"""NOTE: This proto type is used by some external services so needs to remain
|
37
|
+
relatively stable. While it isn't entirely set in stone, changing it
|
38
|
+
may require a good amount of effort so should be avoided if possible.
|
39
|
+
"""
|
40
|
+
|
41
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
42
|
+
|
43
|
+
class _Format:
|
44
|
+
ValueType = typing.NewType("ValueType", builtins.int)
|
45
|
+
V: typing_extensions.TypeAlias = ValueType
|
46
|
+
|
47
|
+
class _FormatEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Alert._Format.ValueType], builtins.type):
|
48
|
+
DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
|
49
|
+
UNUSED: Alert._Format.ValueType # 0
|
50
|
+
"""Plain, fixed width text."""
|
51
|
+
ERROR: Alert._Format.ValueType # 1
|
52
|
+
"""Shows an error message."""
|
53
|
+
WARNING: Alert._Format.ValueType # 2
|
54
|
+
"""Shows a warning message."""
|
55
|
+
INFO: Alert._Format.ValueType # 3
|
56
|
+
"""Shows an info log."""
|
57
|
+
SUCCESS: Alert._Format.ValueType # 4
|
58
|
+
"""Shows a success message."""
|
59
|
+
|
60
|
+
class Format(_Format, metaclass=_FormatEnumTypeWrapper):
|
61
|
+
"""Type of Alert"""
|
62
|
+
|
63
|
+
UNUSED: Alert.Format.ValueType # 0
|
64
|
+
"""Plain, fixed width text."""
|
65
|
+
ERROR: Alert.Format.ValueType # 1
|
66
|
+
"""Shows an error message."""
|
67
|
+
WARNING: Alert.Format.ValueType # 2
|
68
|
+
"""Shows a warning message."""
|
69
|
+
INFO: Alert.Format.ValueType # 3
|
70
|
+
"""Shows an info log."""
|
71
|
+
SUCCESS: Alert.Format.ValueType # 4
|
72
|
+
"""Shows a success message."""
|
73
|
+
|
74
|
+
BODY_FIELD_NUMBER: builtins.int
|
75
|
+
FORMAT_FIELD_NUMBER: builtins.int
|
76
|
+
ICON_FIELD_NUMBER: builtins.int
|
77
|
+
body: builtins.str
|
78
|
+
"""Content to display."""
|
79
|
+
format: global___Alert.Format.ValueType
|
80
|
+
icon: builtins.str
|
81
|
+
def __init__(
|
82
|
+
self,
|
83
|
+
*,
|
84
|
+
body: builtins.str = ...,
|
85
|
+
format: global___Alert.Format.ValueType = ...,
|
86
|
+
icon: builtins.str = ...,
|
87
|
+
) -> None: ...
|
88
|
+
def ClearField(self, field_name: typing.Literal["body", b"body", "format", b"format", "icon", b"icon"]) -> None: ...
|
89
|
+
|
90
|
+
global___Alert = Alert
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
3
|
+
# source: streamlit/proto/AppPage.proto
|
4
|
+
# Protobuf Python Version: 5.26.1
|
5
|
+
"""Generated protocol buffer code."""
|
6
|
+
from google.protobuf import descriptor as _descriptor
|
7
|
+
from google.protobuf import descriptor_pool as _descriptor_pool
|
8
|
+
from google.protobuf import symbol_database as _symbol_database
|
9
|
+
from google.protobuf.internal import builder as _builder
|
10
|
+
# @@protoc_insertion_point(imports)
|
11
|
+
|
12
|
+
_sym_db = _symbol_database.Default()
|
13
|
+
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1dstreamlit/proto/AppPage.proto\"\x86\x01\n\x07\x41ppPage\x12\x18\n\x10page_script_hash\x18\x01 \x01(\t\x12\x11\n\tpage_name\x18\x02 \x01(\t\x12\x0c\n\x04icon\x18\x03 \x01(\t\x12\x12\n\nis_default\x18\x04 \x01(\x08\x12\x16\n\x0esection_header\x18\x05 \x01(\t\x12\x14\n\x0curl_pathname\x18\x06 \x01(\tB,\n\x1c\x63om.snowflake.apps.streamlitB\x0c\x41ppPageProtob\x06proto3')
|
18
|
+
|
19
|
+
_globals = globals()
|
20
|
+
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
21
|
+
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'streamlit.proto.AppPage_pb2', _globals)
|
22
|
+
if not _descriptor._USE_C_DESCRIPTORS:
|
23
|
+
_globals['DESCRIPTOR']._loaded_options = None
|
24
|
+
_globals['DESCRIPTOR']._serialized_options = b'\n\034com.snowflake.apps.streamlitB\014AppPageProto'
|
25
|
+
_globals['_APPPAGE']._serialized_start=34
|
26
|
+
_globals['_APPPAGE']._serialized_end=168
|
27
|
+
# @@protoc_insertion_point(module_scope)
|
@@ -0,0 +1,64 @@
|
|
1
|
+
"""
|
2
|
+
@generated by mypy-protobuf. Do not edit manually!
|
3
|
+
isort:skip_file
|
4
|
+
*!
|
5
|
+
Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
6
|
+
|
7
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
+
you may not use this file except in compliance with the License.
|
9
|
+
You may obtain a copy of the License at
|
10
|
+
|
11
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
|
13
|
+
Unless required by applicable law or agreed to in writing, software
|
14
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
16
|
+
See the License for the specific language governing permissions and
|
17
|
+
limitations under the License.
|
18
|
+
"""
|
19
|
+
|
20
|
+
import builtins
|
21
|
+
import google.protobuf.descriptor
|
22
|
+
import google.protobuf.message
|
23
|
+
import typing
|
24
|
+
|
25
|
+
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
|
26
|
+
|
27
|
+
@typing.final
|
28
|
+
class AppPage(google.protobuf.message.Message):
|
29
|
+
"""A page in the app. Includes both the name of the page as well as the full
|
30
|
+
path to the corresponding script file.
|
31
|
+
|
32
|
+
NOTE: This proto type is used by some external services so needs to remain
|
33
|
+
relatively stable. While it isn't entirely set in stone, changing it
|
34
|
+
may require a good amount of effort so should be avoided if possible.
|
35
|
+
"""
|
36
|
+
|
37
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
38
|
+
|
39
|
+
PAGE_SCRIPT_HASH_FIELD_NUMBER: builtins.int
|
40
|
+
PAGE_NAME_FIELD_NUMBER: builtins.int
|
41
|
+
ICON_FIELD_NUMBER: builtins.int
|
42
|
+
IS_DEFAULT_FIELD_NUMBER: builtins.int
|
43
|
+
SECTION_HEADER_FIELD_NUMBER: builtins.int
|
44
|
+
URL_PATHNAME_FIELD_NUMBER: builtins.int
|
45
|
+
page_script_hash: builtins.str
|
46
|
+
page_name: builtins.str
|
47
|
+
icon: builtins.str
|
48
|
+
is_default: builtins.bool
|
49
|
+
"""A feature for MPA v2 to inform the frontend what's the default page"""
|
50
|
+
section_header: builtins.str
|
51
|
+
url_pathname: builtins.str
|
52
|
+
def __init__(
|
53
|
+
self,
|
54
|
+
*,
|
55
|
+
page_script_hash: builtins.str = ...,
|
56
|
+
page_name: builtins.str = ...,
|
57
|
+
icon: builtins.str = ...,
|
58
|
+
is_default: builtins.bool = ...,
|
59
|
+
section_header: builtins.str = ...,
|
60
|
+
url_pathname: builtins.str = ...,
|
61
|
+
) -> None: ...
|
62
|
+
def ClearField(self, field_name: typing.Literal["icon", b"icon", "is_default", b"is_default", "page_name", b"page_name", "page_script_hash", b"page_script_hash", "section_header", b"section_header", "url_pathname", b"url_pathname"]) -> None: ...
|
63
|
+
|
64
|
+
global___AppPage = AppPage
|