
    gp                    ^   U d dl mZ d dlZd dlZd dlmZmZmZ d dlm	Z	 d dl
mZmZmZ d dlmZmZmZmZmZ d dlmZ d dlZd dl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%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+ d dl,m-Z- d dl.m/Z/m0Z0m1Z1 erd dl2m3Z3 dZ4de5d<   e4 dZ6de5d<    ed       G d d             Z7 ed       G d d             Z8ee8e7f   Z9de5d<   e G d dee:ef                Z;d)d Z<e G d! d"             Z=e G d# d$             Z>d*d%Z?	 	 	 	 	 	 	 	 d+d&Z@e G d' d(e0             ZAy),    )annotationsN)IteratorKeysViewMutableMapping)deepcopy)	dataclassfieldreplace)TYPE_CHECKINGAnyFinalUnioncast)	TypeAlias)configutil)StreamlitAPIExceptionUnserializableSessionStateError)WidgetState)WidgetStates)get_script_run_ctx)RegisterWidgetResultTValueFieldNameWidgetMetadatais_array_value_field_nameis_element_idis_keyed_element_id)QueryParams)	CacheStatCacheStatsProvidergroup_stats)SessionManagerz$$STREAMLIT_INTERNAL_KEYr   STREAMLIT_INTERNAL_KEY_PREFIX_SCRIPT_RUN_WITHOUT_ERRORSSCRIPT_RUN_WITHOUT_ERRORS_KEYT)frozenc                      e Zd ZU dZded<   y)
Serializedz:A widget value that's serialized to a protobuf. Immutable.WidgetStateProtovalueN__name__
__module____qualname____doc____annotations__     Z/var/www/openai/venv/lib/python3.12/site-packages/streamlit/runtime/state/session_state.pyr)   r)   <   s    Dr3   r)   c                      e Zd ZU dZded<   y)Valuez0A widget value that's not serialized. Immutable.r   r+   Nr,   r2   r3   r4   r6   r6   C   s
    :Jr3   r6   r   WStatec                      e Zd ZU dZ ee      Zded<    ee      Zded<   d Z	ddZ
dd	Zdd
ZddZd ZddZddZddZd dZd!dZd"dZd#dZ	 	 	 	 	 	 d$dZd%dZd&dZd'dZy)(WStateszA mapping of widget IDs to values. Widget values can be stored in
    serialized or deserialized form, but when values are retrieved from the
    mapping, they'll always be deserialized.
    default_factoryzdict[str, WState]stateszdict[str, WidgetMetadata[Any]]widget_metadatac                ,    t        j                  |       S Nr   repr_selfs    r4   __repr__zWStates.__repr__W       zz$r3   c                r   | j                   j                  |      }|t        |      t        |t              r|j
                  S | j                  j                  |      }|t        |      t        t        |j
                  j                  d            }|r|j
                  j                  |      nd}t        |      r|j                  }n|dk(  rt        j                  |      }|j                  ||j                         }| j#                  t%        ||             t	        |      | j                   |<   |S )zReturn the value of the widget with the given key.
        If the widget's value is currently stored in serialized form, it
        will be deserialized first.
        Nr+   
json_value)
value_type)r<   getKeyError
isinstancer6   r+   r=   r   r   
WhichOneof__getattribute__r   datajsonloadsdeserializeridset_widget_metadatar
   )rC   kwstatemetadatavalue_field_namer+   deserializeds          r4   __getitem__zWStates.__getitem__Z   s   
 #>1+fe$<<
 ''++A. 1+LL##G,
   LL))*:; 	 %%56JJE-JJu%E,,UHKK@ 	  +	
 |,Ar3   c                "    || j                   |<   y r?   r<   rC   rT   vs      r4   __setitem__zWStates.__setitem__   s    Ar3   c                    | j                   |= y r?   r[   rC   rT   s     r4   __delitem__zWStates.__delitem__   s    KKNr3   c                ,    t        | j                        S r?   )lenr<   rB   s    r4   __len__zWStates.__len__   s    4;;r3   c              #  8   K   | j                   E d {    y 7 wr?   r[   rB   s    r4   __iter__zWStates.__iter__   s      ;;s   c                ,    t        | j                        S r?   )r   r<   rB   s    r4   keyszWStates.keys   s    $$r3   c                6    | D ch c]	  }|| |   f c}S c c}w r?   r2   r`   s     r4   itemszWStates.items   s"    &*+dDGd+++s   c                2    | D ch c]  }| |   	 c}S c c}w r?   r2   )rC   wids     r4   valueszWStates.values   s    %)*TcS	T***s   c                    | j                   j                  |j                          | j                  j                  |j                         y)zCopy all widget values and metadata from 'other' into this mapping,
        overwriting any data in this mapping that's also present in 'other'.
        N)r<   updater=   rC   others     r4   ro   zWStates.update   s4     	5<<(##E$9$9:r3   c                4    t        |      | |j                  <   y)zGSet a widget's serialized value, overwriting any existing value it has.N)r)   rR   )rC   widget_states     r4   set_widget_from_protozWStates.set_widget_from_proto   s     *< 8\__r3   c                     t        |      | |<   y)zISet a widget's deserialized value, overwriting any existing value it has.N)r6   r\   s      r4   set_from_valuezWStates.set_from_value   s    (Qr3   c                6    || j                   |j                  <   y)zBSet a widget's metadata, overwriting any existing metadata it has.N)r=   rR   )rC   widget_metas     r4   rS   zWStates.set_widget_metadata   s    /:[^^,r3   c           	         | j                   j                         D ci c].  \  }}t        | j                  j	                  |      ||      s||0 c}}| _         yc c}}w )z&Remove widget state for stale widgets.N)r<   rj   _is_stale_widgetr=   rI   )rC   active_widget_idsfragment_ids_this_runrT   r]   s        r4   remove_stale_widgetszWStates.remove_stale_widgets   s_     ))+
+1#$$((+!% qD+
 
s   3Ac                   | j                   j                  |      }|yt        |t              r|j                  S | j
                  j                  |      }|yt               }||_        |j                  }|j                  |j                        }t        |      r)t        ||      }|j                  j                  |       |S |dk(  r"t        ||t        j                   |             |S |dk(  r|j"                  j%                  |       |S |dk(  r|j&                  j%                  |       |S ||t        |||       |S )zGet the serialized value of the widget with the given id.

        If the widget doesn't exist, return None. If the widget exists but
        is not in serialized form, it will be serialized first.
        NrG   file_uploader_state_valuestring_trigger_value)r<   rI   rK   r)   r+   r=   r*   rR   rH   
serializerr   getattrrN   extendsetattrrO   dumpsr   CopyFromr   )rC   rT   itemrV   widgetr	   
serializedarrs           r4   get_serializedzWStates.get_serialized   s>    {{q!<dJ':: ''++A.!#	##((4
$U+&%(CHHOOJ'  l"FE4::j#9:  11,,55jA  ,,''00<  :#9
 FE:.r3   c                    | j                   j                         D cg c]$  }| j                  |      r| j                  |      & }}t        t        t
           |      }|S c c}w zGReturn a list of serialized widget values for each widget with a value.)r<   rh   r   r   listr*   )rC   	widget_idr<   s      r4   as_widget_stateszWStates.as_widget_states   sh     "[[--/
/	""9- 	*/ 	 

 d+,f5
s   )A!c                    | j                   j                  |      }|J |j                  }|y|j                  xs d}|j                  xs i } ||i | y)zCall the given widget's callback and return the callback's
        return value. If the widget has no callback, return None.

        If the widget doesn't exist, raise an Exception.
        Nr2   )r=   rI   callbackcallback_argscallback_kwargs)rC   r   rV   r   argskwargss         r4   call_callbackzWStates.call_callback   sg     ''++I6###$$%%+))/R$!&!r3   N)rT   strreturnr   )rT   r   r]   r7   r   None)rT   r   r   r   r   int)r   zKeysView[str])r   zset[tuple[str, Any]])r   zset[Any])rq   r9   r   r   )rs   r*   r   r   )rT   r   r]   r   r   r   )rx   WidgetMetadata[Any]r   r   )r{   set[str]r|   list[str] | Noner   r   )rT   r   r   zWidgetStateProto | Noner   zlist[WidgetStateProto])r   r   r   r   )r-   r.   r/   r0   r	   dictr<   r1   r=   rD   rY   r^   ra   rd   rf   rh   rj   rm   ro   rt   rv   rS   r}   r   r   r   r2   r3   r4   r9   r9   M   s    
 !&d ;F;6;D6QO3Q 1f %,+;9;
#
  0
 
	
 ,\"r3   r9   c                    d|  dS )Nzst.session_state has no key "z". Did you forget to initialize it? More info: https://docs.streamlit.io/develop/concepts/architecture/session-state#initializationr2   keys    r4   _missing_key_error_messager     s    
'u -j 	kr3   c                      e Zd ZU dZ ee      Zded<    ee      Zded<   ddZ	ddZ
ddZedd	       Zdd
ZdddZddZddZd ZddZy)KeyIdMappera#  A mapping of user-provided keys to element IDs.
    It also maps element IDs to user-provided keys so that this reverse mapping
    does not have to be computed ad-hoc.
    All built-in dict-operations such as setting and deleting expect the key as the
    argument, not the element ID.
    r:   dict[str, str]_key_id_mapping_id_key_mappingc                    || j                   v S r?   )r   rC   r   s     r4   __contains__zKeyIdMapper.__contains__$  s    d****r3   c                @    || j                   |<   || j                  |<   y r?   r   r   rC   r   r   s      r4   r^   zKeyIdMapper.__setitem__'  s"    $-S!*-Y'r3   c                &    | j                  |       y r?   )deleter   s     r4   ra   zKeyIdMapper.__delitem__+  s    Cr3   c                    | j                   S r?   r   rB   s    r4   id_key_mappingzKeyIdMapper.id_key_mapping.  s    ###r3   c                p    || _         |j                         D ci c]  \  }}||
 c}}| _        y c c}}w r?   )r   rj   r   )rC   key_id_mappingrT   r]   s       r4   set_key_id_mappingzKeyIdMapper.set_key_id_mapping2  s7    -1?1E1E1GH1GA11GHHs   2Nc                :    | j                   j                  ||      S r?   )r   rI   )rC   r   defaults      r4   get_id_from_keyzKeyIdMapper.get_id_from_key6  s    ##''W55r3   c                     | j                   |   S r?   r   )rC   r   s     r4   get_key_from_idzKeyIdMapper.get_key_from_id9  s    ##I..r3   c                    | j                   j                  |j                          | j                  j                  |j                         y r?   )r   ro   r   rp   s     r4   ro   zKeyIdMapper.update<  s6    ##E$9$9:##E$9$9:r3   c                l    | j                   j                          | j                  j                          y r?   )r   clearr   rB   s    r4   r   zKeyIdMapper.clear@  s&    ""$""$r3   c                V    | j                   |   }| j                   |= | j                  |= y r?   r   r   s      r4   r   zKeyIdMapper.deleteD  s.    ((-	  %  +r3   r   r   r   bool)r   r   r   r   r   r   r   r   r   r   )r   r   )r   r   r   r   r?   )r   r   r   r   r   r   )r   r   r   r   )rq   r   r   r   )r   r   )r-   r.   r/   r0   r	   r   r   r1   r   r   r^   ra   propertyr   r   r   r   ro   r   r   r2   r3   r4   r   r     si     ',D&AO^A&+D&AO^A+. $ $I6/;%,r3   r   c                     e Zd ZU dZ ee      Zded<    ee      Zded<    ee	      Z
ded<    ee      Zded	<    ee      Zd
ed<   d Zd)dZd)dZed*d       Zd+dZd,dZd-dZd.dZd/dZd0dZd1dZd2dZd3dZd4dZd)dZd5dZd6dZ d)dZ!d7dZ"d8dZ#d9d Z$d:d!Z%d;d"Z&	 	 	 	 	 	 d<d#Z'd=d$Z(d>d%Z)d)d&Z*d)d'Z+y()?SessionStatea  SessionState allows users to store values that persist between app
    reruns.

    Example
    -------
    >>> if "num_script_runs" not in st.session_state:
    ...     st.session_state.num_script_runs = 0
    >>> st.session_state.num_script_runs += 1
    >>> st.write(st.session_state.num_script_runs)  # writes 1

    The next time your script runs, the value of
    st.session_state.num_script_runs will be preserved.
    >>> st.session_state.num_script_runs += 1
    >>> st.write(st.session_state.num_script_runs)  # writes 2
    r:   dict[str, Any]
_old_state_new_session_stater9   _new_widget_stater   _key_id_mapperr   query_paramsc                ,    t        j                  |       S r?   r@   rB   s    r4   rD   zSessionState.__repr__m  rE   r3   c                    | D ]  }	 | |   | j                   |<    | j                  j                          | j                  j                          y# t        $ r Y Xw xY w)zCopy all current session_state and widget_state values into our
        _old_state dict, and then clear our current session_state and
        widget_state.
        N)r   rJ   r   r   r   )rC   
key_or_wids     r4   _compact_statezSessionState._compact_stateq  sb    
 J.2:.>
+  	%%'$$&   s   A	AAc                    | j                   j                          | j                  j                          | j                  j                          | j                  j                          y)z;Reset self completely, clearing all current and old values.N)r   r   r   r   r   rB   s    r4   r   zSessionState.clear  sH    %%'$$&!!#r3   c                    | j                   j                  }i }| j                         D ];  }t        |      st	        |      s	| |   ||<   "t        |      s.	 ||   }| |   ||<   = |S # t        $ r Y Kw xY w)zAThe combined session and widget state, excluding keyless widgets.)r   r   _keysr   _is_internal_keyr   rJ   )rC   wid_key_mapstaterT   r   s        r4   filtered_statezSessionState.filtered_state  s     ))88 " A #,<Q,?7a$Q'%a.C!%aE#J      s   A))	A54A5c                D   | j                   j                         D ch c]  }| j                  |       }}t        | j                  j                               }| j
                  j                         D ch c]  }| j                  |       }}||z  |z  S c c}w c c}w )zAll keys active in Session State, with widget keys converted
        to widget ids when one is known. (This includes autogenerated keys
        for widgets that don't have user_keys defined, and which aren't
        exposed to user code.)
        )r   rh   _get_widget_idsetr   r   )rC   rT   old_keysnew_widget_keysnew_session_state_keyss        r4   r   zSessionState._keys  s     59OO4H4H4JK4JqD''*4JKd4499;<,0,C,C,H,H,J"
,JqD",J 	 "
 /),BBB L"
s   B6Bc                    || j                   v S )zCTrue if a value with the given key is in the current session state.)r   )rC   user_keys     r4   is_new_state_valuezSessionState.is_new_state_value  s    42222r3   c                4    t        | j                               S )zqReturn an iterator over the keys of the SessionState.
        This is a shortcut for `iter(self.keys())`
        )iterr   rB   s    r4   rf   zSessionState.__iter__  s     DJJL!!r3   c                4    t        | j                               S )z+Return the number of items in SessionState.)rc   r   rB   s    r4   rd   zSessionState.__len__  s    4::<  r3   c                    | j                   j                  }| j                  |      }||v r
||k(  r||   }	 | j                  ||      S # t        $ r t	        t        |            w xY wr?   )r   r   r   _getitemrJ   r   )rC   r   r   r   s       r4   rY   zSessionState.__getitem__  sr    ))88'',	#	S(8i(C	<==C00 	<5c:;;	<s   A	 	A'c                ,   ||J |	 | j                   |   S |	 | j                  |   S |	 | j                  |   S |	 | j                  |   S t        # t        $ r Y Gw xY w# t        $ r Y Dw xY w# t        $ r Y Aw xY w# t        $ r Y t        w xY w)zGet the value of an entry in Session State, using either the
        user-provided key or a widget id as appropriate for the internal dict
        being accessed.

        At least one of the arguments must have a value.
        )r   rJ   r   r   rC   r   r   s      r4   r   zSessionState._getitem  s     #y'<<<..x88  --i88  y11 x00
 ;         	sE   A A$ A3  B 	A! A!$	A0/A03	A?>A?	BBc                    t               }|N| j                  j                  |d      }|j                  }|j                  }||v s||v rt        d| d| d      || j                  |<   y)zSet the value of the session_state entry with the given user_key.

        If the key corresponds to a widget or form that's been instantiated
        during the current script run, raise a StreamlitAPIException instead.
        Nz`st.session_state.z0` cannot be modified after the widget with key `z` is instantiated.)r   r   r   widget_ids_this_runform_ids_this_runr   r   )rC   r   r+   ctxr   
widget_idsform_idss          r4   r^   zSessionState.__setitem__  s     !"?++;;HdKI00J,,HJ&(h*>+(
 3""*+=? 
 -2)r3   c                   | j                  |      }|| v s|| v st        t        |            || j                  v r| j                  |= || j                  v r| j                  |= || j
                  v r| j
                  j                  |       || j                  v r| j                  |= || j                  v r| j                  |= y y r?   )r   rJ   r   r   r   r   r   r   r   s      r4   ra   zSessionState.__delitem__  s    '',	tyD05c:;;$)))'',$//!$$%%%&&s+...&&y1'	* (r3   c                \    |j                   D ]  }| j                  j                  |        y)zHSet the value of all widgets represented in the given WidgetStatesProto.N)widgetsr   rt   )rC   widget_statesr   s      r4   set_widgets_from_protoz#SessionState.set_widgets_from_proto  s&    "**E""88? +r3   c                    | j                          | j                          | j                  |       | j                          y)zCalled by ScriptRunner before its script re-runs.

        Update widget data and call callbacks on widgets whose value changed
        between the previous and current script runs.
        N)_reset_triggersr   r   _call_callbacks)rC   latest_widget_statess     r4   on_script_will_rerunz!SessionState.on_script_will_rerun"  s7     	##$89r3   c                    ddl m} | j                  D cg c]  }| j                  |      s| }}|D ]  }	 | j                  j	                  |         yc c}w # |$ r t        j                  d       Y Cw xY w)zCall any callback associated with each widget whose value
        changed between the previous and current script runs.
        r   )RerunExceptionz0Calling st.rerun() within a callback is a no-op.N)streamlit.runtime.scriptrunnerr   r   _widget_changedr   stwarning)rC   r   rl   changed_widget_idss       r4   r   zSessionState._call_callbacks.  s     	B  11
1CT5I5I#5NC1 	 
 &CO&&44S9 &
 " O

MNOs   AAAA87A8c                |    | j                   j                  |      }| j                  j                  |      }||k7  }|S )zuTrue if the given widget's value changed between the previous
        script run and the current script run.
        )r   rI   r   )rC   r   	new_value	old_valuechangeds        r4   r   zSessionState._widget_changed=  s=     **..y9	OO''	2	!Y.r3   c                F    | j                          | j                  |       y)a  Called by ScriptRunner after its script finishes running.
         Updates widgets to prepare for the next script run.

        Parameters
        ----------
        widget_ids_this_run: set[str]
            The IDs of the widgets that were accessed during the script
            run. Any widget state whose ID does *not* appear in this set
            is considered "stale" and will be removed.
        N)r   _remove_stale_widgets)rC   r   s     r4   on_script_finishedzSessionState.on_script_finishedF  s     	""#67r3   c                   | j                   D ]z  }| j                   j                  j                  |      }|+|j                  dk(  rt	        d      | j                   |<   S|j                  dk(  sct	        d      | j                   |<   | | j
                  D ]h  }| j                   j                  j                  |      }|+|j                  dk(  rd| j
                  |<   J|j                  dk(  sZd| j
                  |<   j y)z8Set all trigger values in our state dictionary to False.Ntrigger_valueFr   )r   r=   rI   rH   r6   r   )rC   state_idrV   s      r4   r   zSessionState._reset_triggersT  s    ..H--==AA(KH#&&/97<U|D**84((,BB7<T{D**84 / H--==AA(KH#&&/905DOOH-((,BB04DOOH- (r3   c           	     f   t               }|y| j                  j                  ||j                         | j                  j                         D ci c]M  \  }}t        |      r:t        | j                  j                  j                  |      ||j                        s||O c}}| _        yc c}}w )zHRemove widget state for widgets whose ids aren't in `active_widget_ids`.N)
r   r   r}   r|   r   rj   r   rz   r=   rI   )rC   r{   r   rT   r]   s        r4   r  z"SessionState._remove_stale_widgetsf  s     ";33%%	
 --/
/1!!$'**::>>qA%--	 qD/
 
s   AB-c                N    |j                   }|| j                  j                  |<   y)zSet a widget's metadata.N)rR   r   r=   )rC   r=   r   s      r4   _set_widget_metadataz!SessionState._set_widget_metadata  s#    #&&	<K..y9r3   c                6    | j                   j                         S r   )r   r   rB   s    r4   get_widget_stateszSessionState.get_widget_states  s    %%6688r3   c                :    | j                   j                  ||      S )znTurns a value that might be a widget id or a user provided key into
        an appropriate widget id.
        )r   r   r`   s     r4   r   zSessionState._get_widget_id  s     ""221a88r3   c                "    || j                   |<   y r?   )r   r   s      r4   _set_key_widget_mappingz$SessionState._set_key_widget_mapping  s    (1H%r3   c                   |j                   }| j                  |       || j                  ||       || vrJ||| vrD|j                  }t	         |d|j                               }| j
                  j                  ||       t        t        | |         }t	        |      }|duxr | j                  |      }t        ||      S )a  Register a widget with the SessionState.

        Returns
        -------
        RegisterWidgetResult[T]
            Contains the widget's current value, and a bool that will be True
            if the frontend needs to be updated with the current value.
        N)rR   r  r  rQ   r   r   rv   r   r   r   r   )rC   rV   r   r   rQ   initial_widget_valuewidget_valuewidget_value_changeds           r4   register_widgetzSessionState.register_widget  s     KK	!!(+((H=D h&6($:N $00L#+Lx{{,K#L ""11)=QR
 AtI/-  (t3  
8O8O9
 $L2FGGr3   c                .    	 | |    y# t         $ r Y yw xY wNTF)rJ   r   s     r4   r   zSessionState.__contains__  s'    	I   		s    	c                :    ddl m} t        dd ||             }|gS )Nr   )asizeofst_session_state ) streamlit.vendor.pympler.asizeofr  r    )rC   r  stats      r4   	get_statszSessionState.get_stats  s    <+R?vr3   c                    | D ]  }	 t        j                  | |           y# t        $ r&}dt        | |          d| d}t	        |      |d}~ww xY w)zVerify that everything added to session state can be serialized.
        We use pickleability as the metric for serializability, and test for
        pickleability by just trying it.
        z%Cannot serialize the value (of type `z`) of 'a  ' in st.session_state.
                Streamlit has been configured to use [pickle](https://docs.python.org/3/library/pickle.html) to
                serialize session_state values. Please convert the value to a pickle-serializable type. To learn
                more about this behavior, see [our docs](https://docs.streamlit.io/knowledge-base/using-streamlit/serializable-session-state). N)pickler   	Exceptiontyper   )rC   rT   eerr_msgs       r4   _check_serializablez SessionState._check_serializable  sn    
 AFT!W%   FCDaM?RYZ[Y\ ]P S 6g>AEFs   "	A!AAc                P    t        j                  d      r| j                          yy)zVerify that session state can be serialized, if the relevant config
        option is set.

        See `_check_serializable` for details.z&runner.enforceSerializableSessionStateN)r   
get_optionr&  rB   s    r4   maybe_check_serializablez%SessionState.maybe_check_serializable  s%    
 EF$$& Gr3   N)r   r   )r   r   )r   r   )r   r   r   r   )r   zIterator[Any]r   )r   r   r   r   )r   
str | Noner   r*  r   r   )r   r   r+   r   r   r   r   )r   WidgetStatesProtor   r   )r   r+  r   r   )r   r   r   r   )r   r   r   r   )r{   r   r   r   )r=   r   r   r   r   )rT   r   r   r   )r   r   r   r   r   r   )rV   zWidgetMetadata[T]r   r*  r   zRegisterWidgetResult[T]r   r   zlist[CacheStat]),r-   r.   r/   r0   r	   r   r   r1   r   r9   r   r   r   r   r   rD   r   r   r   r   r   r   rf   rd   rY   r   r^   ra   r   r   r   r   r  r   r  r  r  r   r  r  r   r  r&  r)  r2   r3   r4   r   r   J  s   " "'t!<J< */t)DD "'w!?w? #("DNKD !&k BL+B '$  2C3"!
<)V2*+*@

O85$
4L
992%H)%H5?%H	 %HNF'r3   r   c                ,    | j                  t              S r?   )
startswithr$   r   s    r4   r   r     s    >>788r3   c                J    | sy| j                   |v ry|r| j                  |vryyr  )rR   fragment_id)rV   r{   r|   s      r4   rz   rz     s3    
 	)	) 
8#7#7?T#Tr3   c                       e Zd ZU ded<   ddZy)SessionStateStatProviderr#   _session_mgrc                    g }| j                   j                         D ]7  }|j                  j                  }|j	                  |j                                9 t        |      S r?   )r3  list_active_sessionssessionsession_stater   r  r"   )rC   statssession_infor7  s       r4   r  z"SessionStateStatProvider.get_stats  sT    !# --BBDL(00>>MLL0023 E 5!!r3   Nr,  )r-   r.   r/   r1   r  r2   r3   r4   r2  r2    s      "r3   r2  )r   r   r   r   r   )rV   zWidgetMetadata[Any] | Noner{   r   r|   r   r   r   )B
__future__r   rO   r!  collections.abcr   r   r   copyr   dataclassesr   r	   r
   typingr   r   r   r   r   typing_extensionsr   	streamlitr   r   r   streamlit.errorsr   r    streamlit.proto.WidgetStates_pb2r   r*   r   r+  7streamlit.runtime.scriptrunner_utils.script_run_contextr   streamlit.runtime.state.commonr   r   r   r   r   r   r   $streamlit.runtime.state.query_paramsr   streamlit.runtime.statsr    r!   r"   !streamlit.runtime.session_managerr#   r$   r1   r&   r)   r6   r7   r   r9   r   r   r   r   rz   r2  r2   r3   r4   <module>rH     s   #   > >  1 1  (  " S L N V   = N N@ (B u A$%%?@ u 
 $   $   %+,	 , @"nS#X& @" @"F ., ., .,b R' R' R'j9( , 
	" "1 " "r3   