
    %ez                    (   U d Z ddlmZ ddlZddlmZmZmZmZm	Z	m
Z
mZmZmZmZmZ ddlZddlmZmZ ddlmZmZmZmZmZmZmZ ddlmZ ddlmZ dd	l 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, ddl-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6 ddl7m8Z8m9Z9m:Z: ddl;m<Z< ddl=m>Z> ddl?m@Z@ ddlAmBZB ddlCmDZD ddlEmFZF ddlGmHZH ddlImJZJ ddlKmLZL ddlMmNZN ddlOmPZP dd lQmRZR dd!lSmTZT dd"lUmVZV dd#lWmXZX dd$lYmZZZ dd%l[m\Z\ dd&l]m^Z^ dd'l_m`Z` dd(lambZb dd)lcmdZd dd*lemfZf dd+lgmhZh dd,limjZj dd-lkmlZl dd.lmmnZn dd/lompZp dd0lqmrZr dd1lsmtZt dd2lumvZv dd3lwmxZx dd4lymzZz dd5l{m|Z|m}Z} dd6l~mZ dd7lmZmZ dd8lmZ dd9lmZmZ dd:lmZ dd;lmZ dd<lmZ erdd=lmZ dd>lmZ dd?lmZmZ dd@l"mZ  ee          ZdAedB<   dCZdDedE<   dFZdAedG<    edH          Z edIdJK          ZeZe	e         ZdLadMedN<   dkdQZ G dR dJgee*e,e\e^e`ebe.ede4e6ehe9e<e>e2e@eBeFeJeHeLeNejelePeRe0eTenerepeteVeDeXevexeZeze#e%e(efR  ZdldZZdmd^Zednda            Zedodc            Zedpdd            ZdqdgZdrdjZdS )sz@Allows us to create and absorb changes (aka Deltas) to elements.    )annotationsN)TYPE_CHECKINGAnyCallableHashableIterableNoReturnOptionalTypeTypeVarcastoverload)FinalLiteral)configcursorenv_utilloggerruntime	type_utilutil)Cursor)
AlertMixin)AddRowsMetadata)
ArrowMixin)ArrowAltairMixin	prep_data)ArrowVegaLiteMixin)BalloonsMixin)
BokehMixin)	CodeMixin)PydeckMixin)	HelpMixin)
EmptyMixin)ExceptionMixin)FormData	FormMixincurrent_form_id)GraphvizMixin)HeadingMixin)IframeMixin)
ImageMixin)	JsonMixin)LayoutsMixin)MapMixin)MarkdownMixin)
MediaMixin)MetricMixin)PlotlyMixin)ProgressMixin)PyplotMixin)	SnowMixin)	TextMixin)
ToastMixin)ButtonMixin)CameraInputMixin)	ChatMixin)CheckboxMixin)ColorPickerMixin)DataEditorMixin)FileUploaderMixin)MultiSelectMixin)NumberInputMixin)
RadioMixin)SelectSliderMixin)SelectboxMixin)SliderMixin)TextWidgetsMixin)TimeWidgetsMixin)
WriteMixin)NoSessionContextStreamlitAPIException)
get_logger)	Block_pb2ForwardMsg_pb2)RootContainer)cachinglegacy_caching)get_script_run_ctx)dg_stack)NoValue)Message)typing)	DataFrameSeries)Datar   LOGGERi   z
Final[int]MAX_DELTA_BYTES)arrow_line_chartarrow_area_chartarrow_bar_chartarrow_scatter_chart&ARROW_DELTA_TYPES_THAT_MELT_DATAFRAMESValueDGDeltaGenerator)boundFbool_use_warning_has_been_displayedreturnNonec                    t           sda t          j        ddd          } t          j                    r-t          j        d                              d|  d           dS t          j	                    sXt          j        d          rFt          j        d	         }t          j        d                              d|  d
| d           dS dS dS dS )zPrint a warning if Streamlit is imported but not being run with `streamlit run`.
    The warning is printed only once, and is printed using the root logger.
    TzWarning:yellow)boldfgrootz
  z to view a Streamlit app on a browser, use Streamlit in a file and
  run it with the following command:

    streamlit run [FILE_NAME] [ARGUMENTS]z#global.showWarningOnDirectExecutionr   zb to view this Streamlit app on a browser, run it with the following
  command:

    streamlit run z [ARGUMENTS]N)re   clickstyler   is_replr   rK   warningr   existsr   
get_optionsysargv)rp   script_names     9lib/python3.11/site-packages/streamlit/delta_generator.py_maybe_print_use_warningrw   }   s.    + *.'+jtAAA 	f%%-- vw  v  v  v     !! 	f&71'
 '
 	 (1+Kf%%-- _w  _  _  FQ  _  _  _     	 	 	 	    c                     e Zd ZdZej        dddfdEdZdFdZdGdZdHdZ	e
dId            Ze
dId            ZdJdZe
dKd            ZdLd Ze
dMd!            Ze
dNd#            Ze
dFd$            ZdFd%Ze	 	 	 dOdPd.            Ze	 	 	 dOdQd0            Ze	 	 	 dOdRd2            Ze	 	 	 	 dSdPd3            Ze	 	 	 	 dSdTd6            Z	 	 	 	 dSdTd7Z ej                    dfdUd<Z	 dVdWdDZdS )Xrb   aG  Creator of Delta protobuf messages.

    Parameters
    ----------
    root_container: BlockPath_pb2.BlockPath.ContainerValue or None
      The root container for this DeltaGenerator. If None, this is a null
      DeltaGenerator which doesn't print to the app at all (useful for
      testing).

    cursor: cursor.Cursor or None
      This is either:
      - None: if this is the running DeltaGenerator for a top-level
        container (MAIN or SIDEBAR)
      - RunningCursor: if this is the running DeltaGenerator for a
        non-top-level container (created with dg.container())
      - LockedCursor: if this is a locked DeltaGenerator returned by some
        other DeltaGenerator method. E.g. the dg returned in dg =
        st.text("foo").

    parent: DeltaGenerator
      To support the `with dg` notation, DGs are arranged as a tree. Each DG
      remembers its own parent, and the root of the tree is the main DG.

    block_type: None or "vertical" or "horizontal" or "column" or "expandable"
      If this is a block DG, we track its type to prevent nested columns/expanders

    Nroot_container
int | Noner   Cursor | NoneparentDeltaGenerator | None
block_type
str | Nonerf   rg   c                   ||||j         k    rt          d          || _        || _        || _        || _        d| _        | j        j        D ]<}|j	        
                                D ] \  }}t          |          r| j        |_        !=dS )am  Inserts or updates elements in Streamlit apps.

        As a user, you should never initialize this object by hand. Instead,
        DeltaGenerator objects are initialized for you in two places:

        1) When you call `dg = st.foo()` for some method "foo", sometimes `dg`
        is a DeltaGenerator object. You can call methods on the `dg` object to
        update the element `foo` that appears in the Streamlit app.

        2) This is an internal detail, but `st.sidebar` itself is a
        DeltaGenerator. That's why you can call `st.sidebar.foo()` to place
        an element `foo` inside the sidebar.

        NzHDeltaGenerator root_container and cursor.root_container must be the same)rz   RuntimeError_root_container_provided_cursor_parent_block_type
_form_data	__class__	__bases____dict__itemscallable
__module__)selfrz   r   r}   r   mixinnamefuncs           rv   __init__zDeltaGenerator.__init__   s    0 &"&"777Z    . !'% ,0 ^- 	6 	6E#n2244 6 6
dD>> 6&*oDO6	6 	6rx   strc                *    t          j        |           S N)r   repr_r   s    rv   __repr__zDeltaGenerator.__repr__  s    z$rx   c                X    t          j        t          j                    | fz              d S r   rR   setgetr   s    rv   	__enter__zDeltaGenerator.__enter__  s%    X\^^tg-.....rx   typer   value	tracebackLiteral[False]c                `    t          j        t          j                    d d                    dS )NFr   )r   r   r   r   s       rv   __exit__zDeltaGenerator.__exit__   s*     	X\^^CRC())) urx   c                x    | | j         k    r.t          j                    }t          |          dk    r|d         S | S )zReturn the DeltaGenerator that's currently 'active'.
        If we are the main DeltaGenerator, and are inside a `with` block that
        creates a container, our active_dg is that container. Otherwise,
        our active_dg is self.
        r   r   )_main_dgrR   r   len)r   current_stacks     rv   
_active_dgzDeltaGenerator._active_dg-  sC     4=   %LNNM=!!A%%$R(( rx   c                ,    | j         r| j         j        n| S )zReturn this DeltaGenerator's root - that is, the top-level ancestor
        DeltaGenerator that we belong to (this generally means the st._main
        DeltaGenerator).
        )r   r   r   s    rv   r   zDeltaGenerator._main_dg?  s     )->t|$$$>rx   r   Callable[..., NoReturn]c                \     dd l fdt                    D             d	 fd}|S )
Nr   c                N    g | ]!}t          t          |                    |"S  )r   getattr).0method_namests     rv   
<listcomp>z.DeltaGenerator.__getattr__.<locals>.<listcomp>J  s@     
 
 
'hwr;?W?W6X6X

 
 
rx   argsr   kwargsrf   r	   c                     v r%j         t          j        k    rddiz  }nddiz  }nddiz  }t          |          )NzRMethod `%(name)s()` does not exist for `st.sidebar`. Did you mean `st.%(name)s()`?r   z^Method `%(name)s()` does not exist for `DeltaGenerator` objects. Did you mean `st.%(name)s()`?z.`%(name)s()` is not a valid Streamlit command.)r   rN   SIDEBARrJ   )r   r   messager   r   streamlit_methodss      rv   wrapperz+DeltaGenerator.__getattr__.<locals>.wrapperN  s{    ((('=+@@@FIOQUW G+.4d^< G KDN  (000rx   )r   r   r   r   rf   r	   )	streamlitdir)r   r   r   r   r   s   `` @@rv   __getattr__zDeltaGenerator.__getattr__G  sp    
 
 
 
+.r77
 
 
	1 	1 	1 	1 	1 	1 	1 	1( rx   ParentBlockTypesc              #  H   K   | }||j         	|j         V  |j        }|dS dS )znIterate all the block types used by this DeltaGenerator and all
        its ancestor DeltaGenerators.
        N)r   r   )r   
current_dgs     rv   _parent_block_typesz"DeltaGenerator._parent_block_typesd  sG      
 -1
$%1 ,,,,#+J $$$$$rx   parent_block_typesintc                4    t          d |D                       S )Nc              3  &   K   | ]}|d k    dV  dS )column   Nr   )r   parent_blocks     rv   	<genexpr>z>DeltaGenerator._count_num_of_parent_columns.<locals>.<genexpr>p  s,      XX|x?W?W1?W?W?W?WXXrx   )sum)r   r   s     rv   _count_num_of_parent_columnsz+DeltaGenerator._count_num_of_parent_columnso  s     XX);XXXXXXrx   c                P    | j         t          j        | j                  S | j         S )zReturn our Cursor. This will be None if we're not running in a
        ScriptThread - e.g., if we're running a "bare" script outside of
        Streamlit.
        )r   r   get_container_cursorr   r   s    rv   _cursorzDeltaGenerator._cursorr  s*      (.t/CDDD((rx   rd   c                    | j         d u S r   )r   r   s    rv   _is_top_levelzDeltaGenerator._is_top_level}  s    $,,rx   c                :    t          t          |                     S r   )r   idr   s    rv   r   zDeltaGenerator.id  s    2d88}}rx   c                T    | j         }|j        t          |j        j                  ndS )a  Returns the element's delta path as a string like "[0, 2, 3, 1]".

        This uniquely identifies the element's position in the front-end,
        which allows (among other potential uses) the MediaFileManager to maintain
        session-specific maps of MediaFile objects placed with their "coordinates".

        This way, users can (say) use st.image with a stream of different images,
        and Streamlit will expire the older images and replace them in place.
        Nz[])r   r   r   
delta_path)r   dgs     rv   _get_delta_path_strz"DeltaGenerator._get_delta_path_str  s*     _-/Z-Cs2:()))Mrx   
delta_typeelement_protorT   return_valueadd_rows_metadataOptional[AddRowsMetadata]element_widthelement_heightc                    d S r   r   r   r   r   r   r   r   r   s          rv   _enqueuezDeltaGenerator._enqueue  	     	rx   Type[NoValue]c                    d S r   r   r   s          rv   r   zDeltaGenerator._enqueue  r   rx   r`   c                    d S r   r   r   s          rv   r   zDeltaGenerator._enqueue  r   rx   c                    d S r   r   r   s          rv   r   zDeltaGenerator._enqueue  r   rx   Type[NoValue] | Value | NoneDeltaGenerator | Value | Nonec                    d S r   r   r   s          rv   r   zDeltaGenerator._enqueue  r   rx   c                   | j         }t          j        ||           t          j        ||           t	                       |}|t
          v rd}t          j                    }	t          |	j	        j
        |          }
|
                    |           d}|j        Y|j        R|j        j        |	j        j        dd<   |||	j        j        _        |||	j        j        _        t'          |	           d}|r=|j        |j                            ||          nd}t+          |j        ||          }n|}t          j        ||| j        |j        |j                   t1          ||          S )a\  Create NewElement delta, fill it, and enqueue it.

        Parameters
        ----------
        delta_type : str
            The name of the streamlit method being called
        element_proto : proto
            The actual proto in the NewElement type e.g. Alert/Button/Slider
        return_value : any or None
            The value to return to the calling script (for widgets)
        element_width : int or None
            Desired width for the element
        element_height : int or None
            Desired height for the element

        Returns
        -------
        DeltaGenerator or any
            If this element is NOT an interactive widget, return a
            DeltaGenerator that can be used to modify the newly-created
            element. Otherwise, if the element IS a widget, return the
            `return_value` parameter.

        arrow_vega_lite_chartFNT)r   r   )rz   r   r}   invoked_dg_id
used_dg_idreturned_dg_id)r   rP   %maybe_show_cached_st_function_warningrO   rw   r_   rM   
ForwardMsgr   deltanew_elementCopyFromr   r   r   metadataelement_dimension_specwidthheight_enqueue_messageget_locked_cursorrb   save_element_messager   _value_or_dg)r   r   r   r   r   r   r   r   
proto_typemsgmsg_el_protomsg_was_enqueued
new_cursor	output_dgs                 rv   r   zDeltaGenerator._enqueue  s   D _<RLLL5b*EEE 	!"""  
???0J '))sy4jAAm,,, !)bj.D)+)>CL#AAA&(<I39)=K3:S!!!# 	 :) 
,,)=N -      '!1!  II I 	$'u$<	
 	
 	
 	
 L)444rx   block_protoBlock_pb2.Blockdg_typetype | Nonec           	        | j         }|                    d          }t          |j                  }|dk    rT|                     |          }| j        t          j        k    r|dk    rt          d          |dk    rt          d          |dk    r |t          |          v rt          d          |d	k    r |t          |          v rt          d
          |j        |j
        |S t          j                    }|j
        j        |j        j        d d <   |j        j                            |           t%          j        |j        |j
        j        |j
        j        fz             }|t,          }t/          t,           ||j        |||                    }	t1          t3          |                    |	_        |j
                            d            t9          |           t;          j        || j        |j        |	j                   |	S )Nr   r   r   zpColumns cannot be placed inside other columns in the sidebar. This is only possible in the main area of the app.r   zKColumns can only be placed inside other columns up to one level of nesting.chat_messagez7Chat messages cannot nested inside other chat messages.
expandablez3Expanders may not be nested inside other expanders.)rz   parent_path)rz   r   r}   r   )r   r   ) r   
WhichOneoflistr   r   r   rN   r   rJ   	frozensetr   rM   r   r   r   r   	add_blockr   r   RunningCursorr	  indexrb   r   r&   r(   r   r   r   rO   save_block_messager   )
r   r  r  r   r   r   num_of_parent_columnsr   block_cursorblock_dgs
             rv   _blockzDeltaGenerator._block5  sX    _ !++F33
!""899!!$($E$E"% %! $(===)A--+ G   %q((+a   ''J)DV:W:W,W,W'I   %%*	BT8U8U*U*U'E   %);I'))%'Z%:"	$$[111
 +-
."*2B1DD
 
 
 ?$GG!1#%	  
 
 'r':':;; 	
$$t$<<<"'u#;		
 	
 	
 	
 rx   r   ra   datarX   r   IDataFrame | npt.NDArray[Any] | Iterable[Any] | dict[Hashable, Any] | None	DG | Nonec                   | j         | j        | S | j        j        st          d          |t	          |          dk    rd}n:t	          |          dk    r|                                \  }}nt          d          | j        j        d         t          v rX| j        j        d         j        A| j        j        d         	                    d	d          }t          | |          } ||fi | dS t          || j        j        d         | j        j        d                   \  }| j        j        d<   t          j                    }| j        j        |j        j        dd<   ddlmc m} t'          t)          |                                                     }	|                    |j        j        j        ||	           |r"||j        j        _        d
|j        j        _        t9          |           | S )a  Concatenate a dataframe to the bottom of the current one.

        Parameters
        ----------
        data : pandas.DataFrame, pandas.Styler, numpy.ndarray, Iterable, dict, or None
            Table to concat. Optional.

        **kwargs : pandas.DataFrame, numpy.ndarray, Iterable, dict, or None
            The named dataset to concat. Optional. You can only pass in 1
            dataset (including the one in the data parameter).

        Example
        -------
        >>> import streamlit as st
        >>> import pandas as pd
        >>> import numpy as np
        >>>
        >>> df1 = pd.DataFrame(
        ...    np.random.randn(50, 20),
        ...    columns=('col %d' % i for i in range(20)))
        ...
        >>> my_table = st.table(df1)
        >>>
        >>> df2 = pd.DataFrame(
        ...    np.random.randn(50, 20),
        ...    columns=('col %d' % i for i in range(20)))
        ...
        >>> my_table._arrow_add_rows(df2)
        >>> # Now the table shown in the Streamlit app contains the data for
        >>> # df1 followed by the data for df2.

        You can do the same thing with plots. For example, if you want to add
        more data to a line chart:

        >>> # Assuming df1 and df2 from the example above still exist...
        >>> my_chart = st.line_chart(df1)
        >>> my_chart._arrow_add_rows(df2)
        >>> # Now the chart shown in the Streamlit app contains the data for
        >>> # df1 followed by the data for df2.

        And for plots whose datasets are named, you can pass the data with a
        keyword argument where the key is the name:

        >>> my_chart = st._arrow_vega_lite_chart({
        ...     'mark': 'line',
        ...     'encoding': {'x': 'a', 'y': 'b'},
        ...     'datasets': {
        ...       'some_fancy_name': df1,  # <-- named dataset
        ...      },
        ...     'data': {'name': 'some_fancy_name'},
        ... }),
        >>> my_chart._arrow_add_rows(some_fancy_name=df2)  # <-- name used as keyword

        Nz&Only existing elements can `add_rows`.r    r   zLWrong number of arguments to add_rows().Command requires exactly one datasetr   r   arrow_T)r   r   	is_lockedrJ   r   popitempropsr_   
last_indexreplacer   _prep_data_for_add_rowsrM   r   r   r   streamlit.elements.arrowelementsarrowr   hashr   marshallr   arrow_add_rowsr  r   has_namer   )
r   r  r   r   st_method_name	st_methodnew_datar   arrow_protodefault_uuids
             rv   _arrow_add_rowszDeltaGenerator._arrow_add_rows  s   ~ '4<+?K|% 	R'(PQQQ Fq 0 0DD[[A))JD$$ (7   L|,0VVV"#67BJ
 "\/=EEhPRSSNn55IId%%f%%%4<SL|,L23=
 =
9$,$%89 '))%)\%<"6666666664 8 8 : :;;<<SY5:HlSSS 	5,0CI$)04CI$-rx   )
rz   r{   r   r|   r}   r~   r   r   rf   rg   )rf   r   rf   rg   )r   r   r   r   r   r   rf   r   )rf   rb   )r   r   rf   r   )rf   r   )r   r   rf   r   )rf   r|   )rf   rd   )NNN)r   r   r   rT   r   rg   r   r   r   r{   r   r{   rf   rb   )r   r   r   rT   r   r   r   r   r   r{   r   r{   rf   rg   )r   r   r   rT   r   r`   r   r   r   r{   r   r{   rf   r`   )NNNN)r   r   r   rT   r   r   r   r   r   r{   r   r{   rf   r   )r  r  r  r  rf   rb   r   )r   ra   r  rX   r   r  rf   r  )__name__r   __qualname____doc__rN   MAINr   r   r   r   propertyr   r   r   r   r   r   r   r   r   r   r   rL   Blockr  r-  r   rx   rv   rb   rb      s       \ B &3%7 $(,!%36 36 36 36 36j       / / / /       X" ? ? ? X?   : , , , X,Y Y Y Y ) ) ) X) - - - X-    XN N N N  8<$(%)	 	 	 	 X	  8<$(%)	 	 	 	 X	  8<$(%)	 	 	 	 X	 
 "7;$(%)	 	 	 	 X	 
 6:7;$(%)	 	 	 	 X	 6:7;$(%)d5 d5 d5 d5 d5P (7y'8'8#Q Q Q Q Qj u u u u u u urx   r  rX   r   r   r   r   tuple[Data, AddRowsMetadata]c                
   |t           v rdd l}t          |j        t	          j        |                     }t          |j        |j                  rt          |d          }|
                    d          }t          |d          }||t          d          |j        |z   }|j        |z   |z   }|                    |||          |_        |dz
  |_        t          |fi |j        ^}	}
nt	          j        | d	          }	|	|fS )
Nr   stepT)dropstopz+'RangeIndex' object has no attribute 'step')startr9  r7  r   )allow_styler)r_   pandasr   rV   r   convert_anything_to_df
isinstancer  
RangeIndex_get_pandas_index_attrreset_indexrJ   r  r   columns)r  r   r   pddfold_stepold_stopr:  r9  out_data_s              rv   r   r      s,    ;;;",	 @ F FGG bh.. 	4-b&99H T**B-b&99H8#3+A   &08;E$/(:XED}}5t(}KKBH+/!8( AA'8'@AA11 3DtLLL&&&rx   DataFrame | Seriesattr
Any | Nonec                .    t          | j        |d           S r   )r   r  )r  rJ  s     rv   r@  r@  ,  s     4:tT***rx   r   r   c                    d S r   r   r   r   s     rv   r   r   3      Crx   r   c                    d S r   r   rN  s     rv   r   r   8  rO  rx   c                    d S r   r   rN  s     rv   r   r   =  s	     Crx   r   DG | Value | Nonec                J    | t           u rdS | |S t          t          |           S )a  Return either value, or None, or dg.

    This is needed because Widgets have meaningful return values. This is
    unlike other elements, which always return None. Then we internally replace
    that None with a DeltaGenerator instance.

    However, sometimes a widget may want to return None, and in this case it
    should not be replaced by a DeltaGenerator. So we have a special NoValue
    object that gets replaced by None.

    N)rS   r   r`   rN  s     rv   r   r   J  s.     t}	urx   r   ForwardMsg_pb2.ForwardMsgc                l    t                      }|t                      |                    |            dS )z/Enqueues a ForwardMsg proto to send to the app.N)rQ   rI   enqueue)r   ctxs     rv   r   r   `  s6    


C
{   KKrx   r.  )r  rX   r   r   r   r   rf   r5  )r  rI  rJ  r   rf   rK  )r   rg   r   ra   rf   ra   )r   r   r   ra   rf   rg   )r   r`   r   ra   rf   r`   )r   r   r   ra   rf   rR  )r   rT  rf   rg   )r1  
__future__r   rs   rU   r   r   r   r   r   r	   r
   r   r   r   r   rm   typing_extensionsr   r   r   r   r   r   r   r   r   r   streamlit.cursorr   streamlit.elements.alertr   streamlit.elements.altair_utilsr   r!  r   streamlit.elements.arrow_altairr   r   "streamlit.elements.arrow_vega_liter   streamlit.elements.balloonsr   streamlit.elements.bokeh_chartr    streamlit.elements.coder!   %streamlit.elements.deck_gl_json_chartr"   streamlit.elements.doc_stringr#   streamlit.elements.emptyr$   streamlit.elements.exceptionr%   streamlit.elements.formr&   r'   r(   !streamlit.elements.graphviz_chartr)   streamlit.elements.headingr*   streamlit.elements.iframer+   streamlit.elements.imager,   streamlit.elements.jsonr-   streamlit.elements.layoutsr.   streamlit.elements.mapr/   streamlit.elements.markdownr0   streamlit.elements.mediar1   streamlit.elements.metricr2   streamlit.elements.plotly_chartr3   streamlit.elements.progressr4   streamlit.elements.pyplotr5   streamlit.elements.snowr6   streamlit.elements.textr7   streamlit.elements.toastr8   !streamlit.elements.widgets.buttonr9   'streamlit.elements.widgets.camera_inputr:   streamlit.elements.widgets.chatr;   #streamlit.elements.widgets.checkboxr<   'streamlit.elements.widgets.color_pickerr=   &streamlit.elements.widgets.data_editorr>   (streamlit.elements.widgets.file_uploaderr?   &streamlit.elements.widgets.multiselectr@   'streamlit.elements.widgets.number_inputrA    streamlit.elements.widgets.radiorB   (streamlit.elements.widgets.select_sliderrC   $streamlit.elements.widgets.selectboxrD   !streamlit.elements.widgets.sliderrE   'streamlit.elements.widgets.text_widgetsrF   'streamlit.elements.widgets.time_widgetsrG   streamlit.elements.writerH   streamlit.errorsrI   rJ   streamlit.loggerrK   streamlit.protorL   rM   !streamlit.proto.RootContainer_pb2rN   streamlit.runtimerO   rP   streamlit.runtime.scriptrunnerrQ   1streamlit.runtime.scriptrunner.script_run_contextrR   streamlit.runtime.staterS   google.protobuf.messagerT   numpynptr<  rV   rW   rX   r/  rY   __annotations__rZ   r_   r`   ra   r   	BlockTyper   re   rw   rb   r   r@  r   r   r   rx   rv   <module>r     s   G F F " " " " " " 



                           , , , , , , , , P P P P P P P P P P P P P P P P P P # # # # # # / / / / / / ; ; ; ; ; ; / / / / / / G G G G G G G G A A A A A A 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - = = = = = = 3 3 3 3 3 3 / / / / / / 7 7 7 7 7 7 H H H H H H H H H H ; ; ; ; ; ; 3 3 3 3 3 3 1 1 1 1 1 1 / / / / / / - - - - - - 3 3 3 3 3 3 + + + + + + 5 5 5 5 5 5 / / / / / / 1 1 1 1 1 1 7 7 7 7 7 7 5 5 5 5 5 5 1 1 1 1 1 1 - - - - - - - - - - - - / / / / / / 9 9 9 9 9 9 D D D D D D 5 5 5 5 5 5 = = = = = = D D D D D D B B B B B B F F F F F F C C C C C C D D D D D D 7 7 7 7 7 7 F F F F F F ? ? ? ? ? ? 9 9 9 9 9 9 D D D D D D D D D D D D / / / / / / D D D D D D D D ' ' ' ' ' ' 5 5 5 5 5 5 5 5 ; ; ; ; ; ; 5 5 5 5 5 5 5 5 = = = = = = F F F F F F + + + + + + .//////######((((((((------ 
8$$ $ $ $ $. . . . .1 &     	WT)*** 	I&  ).  - - - -   4f	 f	 f	 f	 f	 f	f	f	 f	 	f	
 f	 f	 f	 f	 f	 f	 f	 f	 f	 f	 f	  !f	" #f	$ %f	& 'f	( )f	* +f	, -f	. /f	0 1f	2 3f	4 5f	6 7f	8 9f	: ;f	< =f	> ?f	@ Af	B Cf	D Ef	F Gf	H If	J Kf	L Mf	N Of	P Qf	R Sf	T Uf	V Wf	X Yf	 f	 f	 f	R)' )' )' )'X+ + + + 
   
 
   
 
	 	 	 
	   ,     rx   