
    6DhR                       S SK r S SKrS SKrS SKrS SKJr  S SKrS SKrS SKrS SK	r	S SK
r
S SKJs  Jr  S SKJr  S>S jrS rS?S jrS rS rS	 rS
 rS rS rS r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r  " S S\5      r! " S S\5      r" " S S\5      r# " S S\5      r$ " S  S!\5      r% " S" S#\5      r& " S$ S%\5      r' " S& S'\5      r( " S( S)\5      r) " S* S+\5      r* " S, S-\5      r+ " S. S/\5      r, " S0 S1\5      r- " S2 S3\5      r. " S4 S5\5      r/ " S6 S7\/5      r0 " S8 S9\5      r1 " S: S;\5      r2 " S< S=\/5      r3g)@    N)import_module)
get_modulec                 t    S[        U 5      ;   a  U R                  nOU n[        R                  " SU-   S-   XS9$ )z"Emulate python-3.4 re.fullmatch().patternz(?:z)\Zflags)dirr   rematch)regexstringr   regex_strings       N/var/www/html/env/lib/python3.13/site-packages/_plotly_utils/basevalidators.py	fullmatchr      s7    CJ}}88EL(616GG    c                    [        SSS9n[        SSS9nU(       a7  UR                  U 5      (       a!  [        U S5      (       a  U R                  5       $ [	        U [
        [        45      (       a  U  Vs/ s H  n[        U5      PM     sn$ U(       aV  [	        XR                  5      (       a<  U R                  S:X  a  U R                  5       $ U  Vs/ s H  n[        U5      PM     sn$ U(       aB  [	        XR                  UR                  45      (       a  U  Vs/ s H  n[        U5      PM     sn$ [        U 5      (       a  [        UR                  U 5      5      $ U $ s  snf s  snf s  snf )NnumpyFshould_loadpandasitemr   )r   isscalarhasattrr   
isinstancelisttupleto_scalar_or_listndarrayndimSeriesIndexis_numpy_convertablearray)vnppdes       r   r   r      s    
G	/B	H%	0B	bkk!nnF!3!3vvx!dE]##./0a!!$a00	
1jj))66Q;668O./0a!!$a00	
1yy"((344./0a!!$a00	a	 	  !-- 1 10s   2EE!E&c                    [        S5      nUc   eU(       d  SnO[        U[        5      (       a  U4nU(       a  US   OSn1 SknSSSS	S
.n[        R                  " U SSS9n [        U [        R
                  5      (       ap  U R                  [        R                  :X  aA  U R                  R                  b*  U R                  R                  S5      R                  5       n OU R                  5       n O[        U [        R                  5      (       a  U R                  n0 nUR                  5        H[  u  pU
[        R                  :X  d  M  U
R                  c  M*  [        R                  " U	5      R                  R                  S5      X'   M]     U(       a  U R                   " S0 UD6n U R                  5       n [        XR"                  5      (       dh  [%        U 5      (       a  ['        UR)                  U 5      XS9$ U  Vs/ s H  n[+        U5      PM     nnUR-                  US5      nUR)                  USUS9nOU R                  R.                  U;   at  U(       aM  U R                  R.                  U;  a3  UR-                  US5      nUR1                  U R3                  U5      5      nO0UR1                  U R5                  5       5      nOU R5                  5       nU(       a%  UR                  R.                  U;  a  [7        S5      eSU;  a*  UR                  R.                  S;  a  UR)                  U S	S9nSUR8                  S'   U$ s  snf )aX  
Convert an array-like value into a read-only numpy array

Parameters
----------
v : array like
    Array like value (list, tuple, numpy array, pandas series, etc.)
kind : str or tuple of str
    If specified, the numpy dtype kind (or kinds) that the array should
    have, or be converted to if possible.
    If not specified then let numpy infer the datatype
force_numeric : bool
    If true, raise an exception if the resulting numpy array does not
    have a numeric dtype (i.e. dtype.kind not in ['u', 'i', 'f'])
Returns
-------
np.ndarray
    Numpy array with the 'WRITEABLE' flag set to False
r   N r   >   fiuuint32int32float64object)r,   r+   r*   OT)allow_seriespass_throughkindforce_numericC)orderdtypezBInput value is not numeric and force_numeric parameter set to TrueU)r,   r+   r*   r1   Mr9   F	WRITEABLE)r   r   strnwfrom_nativer    r9   Datetime	time_zonedtreplace_time_zoneto_numpy	DataFrameschemaitemscolwith_columnsr   r"   copy_to_readonly_numpy_arrayr#   r   getr5   ascontiguousarrayastypecopy
ValueErrorr   )r$   r5   r6   r%   
first_kindnumeric_kindskind_default_dtypesrG   	overrideskeyvalr'   v_listr9   new_vs                  r   rK   rK   6   s   ( 
G	B>> 	D#		w adJ $M	 	qt$?A!RYY77bkk!agg&7&7&C&&t,557A

A	Ar||	$	$	HCbkk!cmm&?!#!A!A$!G	 ' ++AJJLa$$""/$ 
 566Aq'*AF6 (++J=E HHV3eH<E	
	&AGGLL, (++J=E((%9E ((2E  ))>P
 	
 $ ;;#<<HHQhH/E  %EKKLU 7s   =Mc                 @    [        U S5      =(       d    [        U S5      $ )zW
Return whether a value is meaningfully convertable to a numpy array
via 'numpy.array'
	__array____array_interface__)r   r$   s    r   r"   r"      s    
 1k"Gga1F&GGr   c                    [        SSS9n[        SSS9nU(       a  [        XR                  5      (       dL  U(       a&  [        XR                  UR                  45      (       d  [        U [
        R                  5      (       a  g[        U 5      (       a4  [        SSS9nU(       a#  UR                  U 5      nUR                  S:X  a  ggg)z@
Return whether a value is considered to be a homogeneous array
r   Fr   r   Tr)   )	r   r   r   r    r!   r?   r"   r#   shape)r$   r%   r&   v_numpys       r   is_homogeneous_arrayr`      s     
G	/B	H%	0B
q**%%:a))RXX!677q"))$$AT2hhqkG}}"r   c                 .    [        U [        [        45      $ )z<
Return whether a value is considered to be an simple array
)r   r   r   r\   s    r   is_simple_arrayrb      s     a$''r   c                 <    [        U 5      =(       d    [        U 5      $ )z5
Return whether a value is considered to be an array
)rb   r`   r\   s    r   is_arrayrd      s     18!5a!88r   c                     [        U [        5      (       d  [        U 5      n SR                  U R                  U R                  S9$ )zD
Return a type string of the form module.name for the input value v
z'{module}.{name}')modulename)r   typeformat
__module____name__r\   s    r   type_strrl      s8     aG%%Q\\

%KKr   c                 R    [        U [        5      =(       a    SU ;   =(       a    SU ;   $ )zM
Return whether a value is considered to be a typed array spec for plotly.js
bdatar9   )r   dictr\   s    r   is_typed_array_specrp      s#     a@7a<@GqL@r   c                 .    U S L =(       d    [        U 5      $ N)rp   r\   s    r   is_none_or_typed_array_specrs      s    9.+A..r   c                   D    \ rS rSrSrSS jrS rSS jrS rS r	S	 r
S
rg)BaseValidator   z&
Base class for all validator classes
Nc                 6    X l         Xl        X0l        SU l        g)al  
Construct a validator instance

Parameters
----------
plotly_name : str
    Name of the property being validated
parent_name : str
    Names of all of the ancestors of this property joined on '.'
    characters. e.g.
    plotly_name == 'range' and parent_name == 'layout.xaxis'
role : str
    The role string for the property as specified in
    plot-schema.json
FN)parent_nameplotly_namerolearray_ok)selfry   rx   rz   _s        r   __init__BaseValidator.__init__   s      '&	r   c                     [        5       e)z
Returns a string that describes the values that are acceptable
to the validator

Should start with:
    The '{plotly_name}' property is a...

For consistancy, string should have leading 4-space indent
NotImplementedErrorr|   s    r   descriptionBaseValidator.description	  s     "##r   c           
          U R                   nU(       a  U H  nUS[        U5      -   S-   -  nM     [        SR                  UU R                  [        U5      [        U5      U R                  5       S95      e)a  
Helper method to raise an informative exception when an invalid
value is passed to the validate_coerce method.

Parameters
----------
v :
    Value that was input to validate_coerce and could not be coerced
inds: list of int or None (default)
    Indexes to display after property name. e.g. if self.plotly_name
    is 'prop' and inds=[2, 1] then the name in the validation error
    message will be 'prop[2][1]`
Raises
-------
ValueError
[]z|
    Invalid value of type {typ} received for the '{name}' property of {pname}
        Received value: {v}

{valid_clr_desc})rg   pnametypr$   valid_clr_desc)ry   r>   rP   ri   rx   rl   reprr   )r|   r$   indsrg   r+   s        r   raise_invalid_valBaseValidator.raise_invalid_val  s~    " c!fs**   F&&QKq'#//1  
 	
r   c           	          U(       a@  [        SR                  U R                  U R                  US S U R	                  5       S95      eg )Nz
    Invalid element(s) received for the '{name}' property of {pname}
        Invalid elements include: {invalid}

{valid_clr_desc}
   )rg   r   invalidr   )rP   ri   ry   rx   r   )r|   invalid_elss     r   raise_invalid_elements$BaseValidator.raise_invalid_elements9  sU     F))**',#'#3#3#5	    r   c                     [        5       e)aO  
Validate whether an input value is compatible with this property,
and coerce the value to be compatible of possible.

Parameters
----------
v
    The input value to be validated

Raises
------
ValueError
    if `v` cannot be coerced into a compatible form

Returns
-------
The input `v` in a form that's compatible with this property
r   r|   r$   s     r   validate_coerceBaseValidator.validate_coerceH  s    & "##r   c                 `    [        U5      (       a  U$ [        U5      (       a  [        U5      $ U$ )a  
Convert output value of a previous call to `validate_coerce` into a
form suitable to be returned to the user on upon property
access.

Note: The value returned by present must be either immutable or an
instance of BasePlotlyType, otherwise the value could be mutated by
the user and we wouldn't get notified about the change.

Parameters
----------
v
    A value that was the ouput of a previous call the
    `validate_coerce` method on the same object

Returns
-------

)r`   rb   r   r   s     r   presentBaseValidator.present]  s/    (  "" HQ8OHr   )r{   rx   ry   rz   rr   )rk   rj   __qualname____firstlineno____doc__r~   r   r   r   r   r   __static_attributes__r)   r   r   ru   ru      s&    *
$"
H$*r   ru   c                   8   ^  \ rS rSrSrU 4S jrS rS rSrU =r	$ )DataArrayValidatori{  z
"data_array": {
    "description": "An {array} of data. The value MUST be an
                    {array}, or we ignore it.",
    "requiredOpts": [],
    "otherOpts": [
        "dflt"
    ]
},
c                 @   > [         [        U ]
  " SXS.UD6  SU l        g )Nry   rx   Tr)   )superr   r~   r{   r|   ry   rx   kwargs	__class__s       r   r~   DataArrayValidator.__init__  s,     $0 	
#	
@F	
 r   c                 4    SR                  U R                  S9$ )Nzv    The '{plotly_name}' property is an array that may be specified as a tuple,
    list, numpy array, or pandas Seriesry   ri   ry   r   s    r   r   DataArrayValidator.description  $    ++16(( ,2 ,
	
r   c                     [        U5      (       a   U$ [        U5      (       a  [        U5      nU$ [        U5      (       a  [	        U5      nU$ U R                  U5        U$ rr   )rs   r`   rK   rb   r   r   r   s     r   r   "DataArrayValidator.validate_coerce  sh    &q))  "!$$,Q/A
 	 Q!!$A  ""1%r   r{   
rk   rj   r   r   r   r~   r   r   r   __classcell__r   s   @r   r   r   {  s    	

 
r   r   c                   h   ^  \ rS rSrSr  SU 4S jjr0 4S jr\S 5       rS r	S r
S rS	 rS
rU =r$ )EnumeratedValidatori  a  
"enumerated": {
    "description": "Enumerated value type. The available values are
                    listed in `values`.",
    "requiredOpts": [
        "values"
    ],
    "otherOpts": [
        "dflt",
        "coerceNumber",
        "arrayOk"
    ]
},
c                 R  > [         [        U ]
  " SXS.UD6  X0l        X@l        XPl        X`l        / U l        / U l        U R                   H  nU(       a  [        U[        5      (       a  US   S:X  a|  US   S:X  as  [        U5      S:  ad  USS nU R                  R                  [        R                  " U5      5        U R                  R                  [        R                  U5      5        M  U R                  R                  S 5        U R                  R                  S 5        M     g )Nr   r   /   r)   )r   r   r~   valuesr{   coerce_numberr   
val_regexsregex_replacementsr   r>   lenappendr
   compilebuild_regex_replacement)
r|   ry   rx   r   r{   r   r   r$   	regex_strr   s
            r   r~   EnumeratedValidator.__init__  s     	!41 	
#	
@F	
  *
 
 #%
 AZ3''AaDCKAbESLSQRVVWZaG	&&rzz)'<=''..'??	J &&t,''..t4 r   c                 f    U R                   nU" U R                  U R                  U R                  S9$ )z_
A custom deepcopy method is needed here because compiled regex
objects don't support deepcopy
)r   )r   ry   rx   r   )r|   memodictclss      r   __deepcopy__ EnumeratedValidator.__deepcopy__  s,    
 nn4##T%5%5dkkJJr   c                 v    [         R                  " SU 5      nU(       a  UR                  S5      nSU-   S-   U4$ g )Nz7\^(\w)\(\[2\-9\]\|\[1\-9\]\[0\-9\]\+\)\?\( domain\)\?\$r   ^z1$)r
   r   group)r   r   anchor_chars      r   r   +EnumeratedValidator.build_regex_replacement  sA     F	
 ++a.K$t+[88r   c                     [        U[        5      (       a:  U R                   H*  nU(       d  M  [        R                  " US   US   U5      nM,     U$ )z9
Return v with any applicable regex replacements applied
r   r   )r   r>   r   r
   sub)r|   r$   	repl_argss      r   perform_replacemenet(EnumeratedValidator.perform_replacemenet  sG     a!44	9y|Yq\1=A 5 r   c           	      @   / n/ n[        U R                  U R                  5       H6  u  p4Ub  UR                  UR                  5        M%  UR                  U5        M8     SR                  U R                  S9nU(       aA  SR                  [        R                  " [        U5      SSSS95      nUSR                  US9-   nU(       aA  SR                  [        R                  " [        U5      SSSS95      nUS	R                  US
9-   nU R                  (       a  US-   nU$ )NE    The '{name}' property is an enumeration that may be specified as:rg   
            Finitial_indentsubsequent_indentbreak_on_hyphenszA
      - One of the following enumeration values:
{enum_vals_str}enum_vals_strzZ
      - A string that matches one of the following regular expressions:
{enum_regexs_str})enum_regexs_strC
      - A tuple, list, or one-dimensional numpy array of the above)zipr   r   r   r   ri   ry   jointextwrapwrapr   r{   )r|   	enum_valsenum_regexsr$   r   descr   r   s           r   r   EnumeratedValidator.description  sD    	DKK9HA ""5==1  #	 :
IIO!! JP J
 	
  IIO#+&.%*	M 6"/    "ii%#+&.%*	O V$3    ==FF  r   c                     [        U[        5      n[        U R                  U R                  5       H.  u  p4U(       a  U(       a  [        XA5      SLnOX:H  nU(       d  M.    g   g)z?
Return whether a value matches one of the enumeration options
NTF)r   r>   r   r   r   r   )r|   r'   is_strr$   r   	in_valuess         r   r   EnumeratedValidator.in_valuesJ  sU     As#DKK9HA%%e/t;	 F	y : r   c                    [        U5      (       a   U$ U R                  (       a  [        U5      (       a  U Vs/ s H  o R                  U5      PM     nnU Vs/ s H  o@R	                  U5      (       a  M  UPM     nnU(       a  U R                  US S 5        [        U5      (       a  [        U5      nU$ [        U5      n U$ U R                  U5      nU R	                  U5      (       d  U R                  U5        U$ s  snf s  snf )Nr   )
rs   r{   rd   r   r   r   r`   rK   r   r   )r|   r$   v_el
v_replacedr'   r   s         r   r   #EnumeratedValidator.validate_coerce[  s    &q))   ]]x{{FGHad33D9aJH&0Lj9J1jKL++K,<=#A&&03  &a(
  ))!,A>>!$$&&q) ILs   C>D6D)r{   r   r   r   r   r   )FF)rk   rj   r   r   r   r~   r   staticmethodr   r   r   r   r   r   r   r   s   @r   r   r     sO    ( ,5\ %' K  0	<|" r   r   c                   8   ^  \ rS rSrSrU 4S jrS rS rSrU =r	$ )BooleanValidatorip  z
"boolean": {
    "description": "A boolean (true/false) value.",
    "requiredOpts": [],
    "otherOpts": [
        "dflt"
    ]
},
c                 2   > [         [        U ]
  " SXS.UD6  g Nr   r)   )r   r   r~   r   s       r   r~   BooleanValidator.__init__{  s#    . 	
#	
@F	
r   c                 4    SR                  U R                  S9$ )NzX    The '{plotly_name}' property must be specified as a bool
    (either True, or False)r   r   r   s    r   r   BooleanValidator.description  s$    %v((  &  
	
r   c                 x    [        U5      (       a   U$ [        U[        5      (       d  U R                  U5        U$ rr   )rs   r   boolr   r   s     r   r    BooleanValidator.validate_coerce  s9    &q))  At$$""1%r   r)   r   r   s   @r   r   r   p  s    


 r   r   c                   4   ^  \ rS rSrU 4S jrS rS rSrU =r$ )SrcValidatori  c                 R   > [         [        U ]
  " SXS.UD6  [        S5      U l        g )Nr   chart_studior)   )r   r   r~   r   r   r   s       r   r~   SrcValidator.__init__  s1    lD* 	
#	
@F	
 '~6r   c                 4    SR                  U R                  S9$ )Nzi    The '{plotly_name}' property must be specified as a string or
    as a plotly.grid_objs.Column objectr   r   r   s    r   r   SrcValidator.description  r   r   c                    [        U5      (       a   U$ [        U[        5      (       a   U$ U R                  (       a<  [        XR                  R                  R
                  5      (       a  UR                  nU$ U R                  U5        U$ rr   )rs   r   r>   r   	grid_objsColumnidr   r   s     r   r   SrcValidator.validate_coerce  s|    &q))  3  :a1B1B1L1L1S1S#T#TA  ""1%r   )r   	rk   rj   r   r   r~   r   r   r   r   r   s   @r   r   r     s    7
 r   r   c                   >   ^  \ rS rSrSr SU 4S jjrS rS rSrU =r	$ )NumberValidatori  ae  
"number": {
    "description": "A number or a numeric value (e.g. a number
                    inside a string). When applicable, values
                    greater (less) than `max` (`min`) are coerced to
                    the `dflt`.",
    "requiredOpts": [],
    "otherOpts": [
        "dflt",
        "min",
        "max",
        "arrayOk"
    ]
},
c                    > [         [        U ]
  " SXS.UD6  Uc  Ub  [        S5      U l        OX0l        Uc  Ub  [        S5      U l        OX@l        Uc  Ub  SU l        OSU l        XPl        g )Nr   z-infinfTFr)   )r   r
  r~   floatmin_valmax_valhas_min_maxr{   )r|   ry   rx   minmaxr{   r   r   s          r   r~   NumberValidator.__init__  sx     	ot- 	
#	
@F	

 ;3? =DLL ;3? <DLL?co#D$D r   c                     SR                  U R                  S9nU R                  (       d  US-   nO'USR                  U R                  U R                  S9-   nU R
                  (       a  US-   nU$ )NzE    The '{plotly_name}' property is a number and may be specified as:r   z
      - An int or floatz?
      - An int or float in the interval [{min_val}, {max_val}]r  r  r   )ri   ry   r  r  r  r{   r|   r   s     r   r   NumberValidator.description  s    IIO(( JP J
 	
   BBH& LL$,, CI C  ==FF  r   c                    [        U5      (       a   U$ U R                  (       a  [        U5      (       a  [        S5      n [	        USS9nU R                  (       a  UR                  U R                  W:*  X0R                  :*  5      nUR                  U5      (       dF  UR                  U5      nUR                  USS9U   S S R!                  5       nU R#                  U5        WnU$ U R                  (       a  [%        U5      (       a  U Vs/ s H&  n['        U[(        R*                  5      (       a  M$  UPM(     nnU(       a  U R#                  US S 5        U R                  (       aQ  U Vs/ s H)  opR                  Us=::  a  U R                  ::  a  M%  O  UPM+     nnU(       a  U R#                  US S 5        [-        U5      nU$ ['        U[(        R*                  5      (       d  U R                  U5        U R                  (       a4  U R                  Us=::  a  U R                  ::  d  O  U R                  U5        U$ ! [
        [        [        4 a    U R                  U5         GNf = fs  snf s  snf )Nr   Tr6   r0   r<   r   )rs   r{   r`   r   rK   rP   	TypeErrorOverflowErrorr   r  logical_andr  r  alllogical_notr#   tolistr   rb   r   numbersNumberr   	r|   r$   r%   v_arrayv_valid	v_invalidsome_invalid_elsr'   r   s	            r   r   NumberValidator.validate_coerce  s   &q))` _ ]]3A66G$B*6qM
 ..LLG+W-D vvg "w 7I')xxx'B9'M(fh % //0@AA2 1 ]]q11&'Maz!W^^/L1aKM++K,<= *+W!QLLA4U4Uq4Uq!W//CR0@A!!$A  a00&&q) 9T\\9**1-W 	=9 *&&q)** N Xs*   
H< #I)3I)+$I.I.<&I&%I&)r{   r  r  r  )NNFr   r   s   @r   r
  r
    s#    " FK!8>2 2r   r
  c                   D   ^  \ rS rSrSr    SU 4S jjrS rS rSrU =r	$ )IntegerValidatori.  aQ  
"integer": {
    "description": "An integer or an integer inside a string. When
                    applicable, values greater (less) than `max`
                    (`min`) are coerced to the `dflt`.",
    "requiredOpts": [],
    "otherOpts": [
        "dflt",
        "min",
        "max",
        "extras",
        "arrayOk"
    ]
},
c                   > [         [        U ]
  " SXS.UD6  Uc  Ub  [        R                  * S-
  U l        OX0l        Uc  Ub  [        R                  U l        OX@l        Uc  Ub  SU l        OSU l        Ub  UO/ U l        X`l	        g )Nr   r   TFr)   )
r   r)  r~   sysmaxsizer  r  r  extrasr{   )	r|   ry   rx   r  r  r-  r{   r   r   s	           r   r~   IntegerValidator.__init__?  s     	. 	
#	
@F	

 ;3?KK<!+DLL ;3?;;DLL?co#D$D & 2f r   c                 V   SR                  U R                  S9nU R                  (       d  US-   nO'USR                  U R                  U R                  S9-   nU R
                  (       a*  USR                  U R
                  U R
                  S   S9-   nU R                  (       a  US	-   nU$ )
NzF    The '{plotly_name}' property is a integer and may be specified as:r   z6
      - An int (or float that will be cast to an int)ze
      - An int (or float that will be cast to an int)
        in the interval [{min_val}, {max_val}]r  7
        OR exactly one of {extras} (e.g. '{eg_extra}')r   r-  eg_extrar   )ri   ry   r  r  r  r-  r{   r  s     r   r   IntegerValidator.descriptionc  s    JJP&(( KQ K
 	
 99  228& LL$,, 39 3D ;;:&dkk"o&F	G  ==FF  r   c                 L   [        U5      (       a   U$ XR                  ;   a  U$ U R                  (       a  [        U5      (       a  [	        S5      n[        USSS9nUR                  R                  S;  a  U R                  U5        U R                  (       a  UR                  U R                  U:*  X0R                  :*  5      nUR                  U5      (       dF  UR                  U5      nUR                  USS9U   S S R!                  5       nU R#                  U5        UnU$ U R                  (       a  [%        U5      (       a  U Vs/ s H-  n['        U[(        5      (       a  M  XpR                  ;  d  M+  UPM/     nnU(       a  U R#                  US S 5        U R                  (       ax  U Vs/ s HP  n['        U[(        5      (       a%  U R                  Us=::  a  U R                  ::  a  M;  O  XpR                  ;  d  MN  UPMR     nnU(       a  U R#                  US S 5        [+        U5      nU$ ['        U[(        5      (       d  U R                  U5        U R                  (       a4  U R                  Us=::  a  U R                  ::  d  O  U R                  U5        U$ s  snf s  snf )Nr   )r+   r,   Tr4   r0   r<   r   )rs   r-  r{   r`   r   rK   r9   r5   r   r  r  r  r  r  r  r#   r  r   rb   r   intr   r"  s	            r   r    IntegerValidator.validate_coerce  sR   &q))x w ++H]]3A66G$B2
$G }}!!3&&q) ..LLG+W-D vvg "w 7I')xxx'B9'M(fh % //0@AAD C ]]q11 aJq#$61KK;O1   ++K,<=  &q#..4<<13T3T 3T,    //CR0@A!!$A  a%%&&q) 9T\\9**1-?s$   J%J6J.:J!,J!?J!)r{   r-  r  r  r  )NNNFr   r   s   @r   r)  r)  .  s,    ( "!H&P> >r   r)  c                   T   ^  \ rS rSrSr    SU 4S jjr\S 5       rS rS r	Sr
U =r$ )	StringValidatori  a&  
"string": {
    "description": "A string value. Numbers are converted to strings
                    except for attributes with `strict` set to true.",
    "requiredOpts": [],
    "otherOpts": [
        "dflt",
        "noBlank",
        "strict",
        "arrayOk",
        "values"
    ]
},
c                 b   > [         [        U ]
  " SXS.UD6  X0l        X@l        XPl        X`l        g r   )r   r8  r~   no_blankstrictr{   r   )	r|   ry   rx   r:  r;  r{   r   r   r   s	           r   r~   StringValidator.__init__  s:     	ot- 	
#	
@F	
 ! r   c                 L    U b  [        U [        5      (       a  U $ [        U 5      $ )zU
Convert a value to a string if it's not None, a string,
or a unicode (on Python 2).
)r   r>   r\   s    r   to_str_or_unicode_or_none)StringValidator.to_str_or_unicode_or_none  s#     9
1c**Hq6Mr   c           	         SR                  U R                  S9nU R                  (       a  US-   nObU R                  (       aL  SR	                  [
        R                  " [        U R                  5      SSSS95      nUSR                  US	9-   nOUS
-   nU R                  (       d  US-   nU R                  (       a  US-   nU$ )NzF    The '{plotly_name}' property is a string and must be specified as:r   z
      - A non-empty stringr   r   Fr   z2
      - One of the following strings:
{valid_str})	valid_strz
      - A stringz4
      - A number that will be converted to a stringr   )
ri   ry   r:  r   r   r   r   r   r;  r{   )r|   r   rA  s      r   r   StringValidator.description  s    JJP&(( KQ K
 	
 == 
 [[		%#+&.%*	I v'      {{77  ==FF  r   c                 p   [        U5      (       a   U$ U R                  (       Ga  [        U5      (       Ga  U R                  (       aA  U Vs/ s H  n[	        U[
        5      (       a  M  UPM     nnU(       a  U R                  U5        [        U5      (       a  [        S5      n[        USS9nU R                  (       a0  XS:H     S S R                  5       nU(       a  U R                  U5        U R                  (       aW  UR                  UR                  XR                  5      5      nX   S S R                  5       nU(       a  U R                  U5        U$ [        U5      (       a  U R                  (       d%  U Vs/ s H  n[         R#                  U5      PM     nnU R                  (       a1  U Vs/ s H  o"S:X  d  M
  UPM     nnU(       a  U R                  U5        U R                  (       a;  U Vs/ s H  o!U R                  ;  d  M  UPM     nnU(       a  U R                  U5        [%        U5      nU$ U R                  (       a'  [	        U[
        5      (       d  U R'                  U5        ON[	        U[
        5      (       a  O8[	        U[(        [*        45      (       a  [        U5      nOU R'                  U5        U R                  (       a   [-        U5      S:X  a  U R'                  U5        U R                  (       a   XR                  ;  a  U R'                  U5        U$ s  snf s  snf s  snf s  snf )Nr   r:   r5    r   r   )rs   r{   rd   r;  r   r>   r   r`   r   rK   r:  r  r   r  isinrb   r8  r>  r   r   r5  r  r   )r|   r$   r'   r   r%   invalid_indss         r   r   StringValidator.validate_coerce.  ss   &q))@  ]]]x{{ {{*+F!Q:a3Eq!F//<#A&&( 1= =="#G*Sb/"8"8":K"33K@ ;;#%>>"''![[2I#JL"#/#2"6"="="?K"33K@L K !##{{OPQq!BB1EqAQ ==./";a71aK";"33K@ ;;./"HaDKK3G1aK"H"33K@%a(* % {{!!S))**1-a%%C<00AA**1-}}Q1&&q){{q3&&q)w G0 R #< #Is*   L$)L$>L)4	L.L.6L3L3)r{   r:  r;  r   )FFFN)rk   rj   r   r   r   r~   r   r>  r   r   r   r   r   s   @r   r8  r8    sA    & $  3jB Br   r8  c                      ^  \ rS rSrSr\R                  " S5      r\R                  " S5      r\R                  " S5      r	/ SQr
 SU 4S jjrS rS	 rSS
 jrSS jrS r\SS j5       rSrU =r$ )ColorValidatoris  a  
"color": {
    "description": "A string describing color. Supported formats:
                    - hex (e.g. '#d3d3d3')
                    - rgb (e.g. 'rgb(255, 0, 0)')
                    - rgba (e.g. 'rgb(255, 0, 0, 0.5)')
                    - hsl (e.g. 'hsl(0, 100%, 50%)')
                    - hsv (e.g. 'hsv(0, 100%, 100%)')
                    - named colors(full list:
                      http://www.w3.org/TR/css3-color/#svg-color)",
    "requiredOpts": [],
    "otherOpts": [
        "dflt",
        "arrayOk"
    ]
},
z #([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})z+(rgb|hsl|hsv)a?\([\d.]+%?(,[\d.]+%?){2,3}\)zvar\(\-\-.*\))	aliceblueantiquewhiteaqua
aquamarineazurebeigebisqueblackblanchedalmondblue
bluevioletbrown	burlywood	cadetblue
chartreuse	chocolatecoralcornflowerbluecornsilkcrimsoncyandarkbluedarkcyandarkgoldenroddarkgraydarkgrey	darkgreen	darkkhakidarkmagentadarkolivegreen
darkorange
darkorchiddarkred
darksalmondarkseagreendarkslatebluedarkslategraydarkslategreydarkturquoise
darkvioletdeeppinkdeepskybluedimgraydimgrey
dodgerblue	firebrickfloralwhiteforestgreenfuchsia	gainsboro
ghostwhitegold	goldenrodgraygreygreengreenyellowhoneydewhotpink	indianredindigoivorykhakilavenderlavenderblush	lawngreenlemonchiffon	lightblue
lightcoral	lightcyanlightgoldenrodyellow	lightgray	lightgrey
lightgreen	lightpinklightsalmonlightseagreenlightskybluelightslategraylightslategreylightsteelbluelightyellowlime	limegreenlinenmagentamaroonmediumaquamarine
mediumbluemediumorchidmediumpurplemediumseagreenmediumslatebluemediumspringgreenmediumturquoisemediumvioletredmidnightblue	mintcream	mistyrosemoccasinnavajowhitenavyoldlaceolive	olivedraborange	orangeredorchidpalegoldenrod	palegreenpaleturquoisepalevioletred
papayawhip	peachpuffperupinkplum
powderbluepurplered	rosybrown	royalbluerebeccapurplesaddlebrownsalmon
sandybrownseagreenseashellsiennasilverskyblue	slateblue	slategray	slategreysnowspringgreen	steelbluetantealthistletomato	turquoisevioletwheatwhite
whitesmokeyellowyellowgreenc                 J   > [         [        U ]
  " SXS.UD6  X0l        X@l        g r   )r   rJ  r~   r{   colorscale_path)r|   ry   rx   r{   r  r   r   s         r   r~   ColorValidator.__init__!  s3     	nd, 	
#	
@F	
 !
  /r   c                     U R                   S L$ rr   r  r   s    r   numbers_allowedColorValidator.numbers_allowed/  s    ##4//r   c                     SR                  U R                  S9nU R                  (       a  USR                  U R                  S9-   nU R                  (       a  US-   nU$ )NaT      The '{plotly_name}' property is a color and may be specified as:
      - A hex string (e.g. '#ff0000')
      - An rgb/rgba string (e.g. 'rgb(255,0,0)')
      - An hsl/hsla string (e.g. 'hsl(0,100%,50%)')
      - An hsv/hsva string (e.g. 'hsv(0,100%,100%)')
      - A named CSS color: see https://plotly.com/python/css-colors/ for a listr   z\
      - A number that will be interpreted as a color
        according to {colorscale_path}r  z,
      - A list or array of any of the above)ri   ry   r  r{   )r|   valid_color_descriptions     r   r   ColorValidator.description2  s    #S TZSY(( TZ T
 	  '**0&$($8$8 +1 + $ =='// $ '&r   c                 R   [        U5      (       a   U$ U R                  (       a  [        U5      (       a  [        U5      nU R	                  5       (       a  UR
                  R                  S;   a   U$ U Vs/ s H  o0R                  USS9PM     nnU R                  X5      nU(       a  U(       a  U R                  U5        U$ U R	                  5       (       d  U(       a  [        USS9nU$ [        USS9n U$ U R                  (       af  [        U5      (       aV  U Vs/ s H  o0R                  USS9PM     nnU R                  X5      nU(       a  U(       a  U R                  U5        U$ Un U$ U R                  U5      nUc  U(       a  U R                  U5        UnU$ s  snf s  snf )N)r,   r+   r*   F)should_raiser1   rD  r:   )rs   r{   r`   rK   r  r9   r5   r   find_invalid_elsr   rb   	vc_scalarr   )r|   r$   r  r'   validated_vr   s         r   r   ColorValidator.validate_coerceP  s   &q))J I ]]3A66,Q/A##%%!'',,/*I > ; UVVTUq33AE3JTUV"33AC<//<0 + ))++{4[sKA( % 5[sKA$ # ]]q11PQRPQ1///FPQKR//?K|++K8     ..+K"|&&q)A; W Ss   6FF$c                     Uc  / n[        X5       H?  u  pE[        U5      (       a  U R                  XEU5        M)  Ub  M.  UR                  U5        MA     U$ )z
Helper method to find invalid elements in orig array.
Elements are invalid if their corresponding element in
the validated array is None.

This method handles deeply nested list structures
)r   rd   r  r   )r|   orig	validatedr   orig_elvalidated_els         r   r  ColorValidator.find_invalid_elsy  sX     K%(%9!G  %%g[I'&&w/ &: r   c                 D    [         R                  XR                  5       S9$ )z(Helper to validate/coerce a scalar colorallow_number)rJ  perform_validate_coercer  r   s     r   r  ColorValidator.vc_scalar  s&    55002 6 
 	
r   c                    [        U [        R                  5      (       a	  U(       a  U $ [        U [        5      (       d  gU R	                  SS5      R                  5       n[        [        R                  U5      (       a  U $ [        [        R                  U5      (       a  U $ [        [        R                  U5      (       a  U $ U[        R                  ;   a  U $ g)a  
Validate, coerce, and return a single color value. If input cannot be
coerced to a valid color then return None.

Parameters
----------
v : number or str
    Candidate color value

allow_number : bool
    True if numbers are allowed as colors

Returns
-------
number or str or None
N rE  )r   r   r!  r>   replacelowerr   rJ  re_hex
re_rgb_etcre_ddknamed_colors)r$   r  v_normalizeds      r   r  &ColorValidator.perform_validate_coerce  s    & a((\HAs## 99S"-335L ..==>44lCC >00,?? !<!<< r   )r{   r  )FN)Trr   )rk   rj   r   r   r   r
   r   r  r  r   r  r~   r  r   r   r  r  r   r  r   r   r   s   @r   rJ  rJ  s  sz    $ ZZ;<FJKJZZ()FULp IM/0'<'R(
 / /r   rJ  c                   8   ^  \ rS rSrSrU 4S jrS rS rSrU =r	$ )ColorlistValidatori  z
"colorlist": {
  "description": "A list of colors. Must be an {array} containing
                  valid colors.",
  "requiredOpts": [],
  "otherOpts": [
    "dflt"
  ]
}
c                 2   > [         [        U ]
  " SXS.UD6  g r   )r   r  r~   r   s       r   r~   ColorlistValidator.__init__  s#     $0 	
#	
@F	
r   c                 4    SR                  U R                  S9$ )Nz    The '{plotly_name}' property is a colorlist that may be specified
    as a tuple, list, one-dimensional numpy array, or pandas Series of valid
    color stringsr   r   r   s    r   r   ColorlistValidator.description  s&     V((  
	
r   c                 ^   [        U5      (       a   U$ [        U5      (       am  U Vs/ s H  n[        R                  USS9PM     nn[	        X5       VVs/ s H  u  pEUb  M
  UPM     nnnU(       a  U R                  U5        [        U5      nU$ U R                  U5        U$ s  snf s  snnf )NFr  )rs   rd   rJ  r  r   r   r   r   r|   r$   r'   r  elr  r   s          r   r   "ColorlistValidator.validate_coerce  s    &q))  a[[WXWXRS66qu6MWX  
 ,/q+>+>'r,+>   ++K8!!$A  ""1%s   B$	B)#B)r)   r   r   s   @r   r  r    s    	


 r   r  c                   N   ^  \ rS rSrSrU 4S jr\S 5       rS rS r	S r
SrU =r$ )	ColorscaleValidatori  am  
"colorscale": {
    "description": "A Plotly colorscale either picked by a name:
                    (any of Greys, YlGnBu, Greens, YlOrRd, Bluered,
                    RdBu, Reds, Blues, Picnic, Rainbow, Portland,
                    Jet, Hot, Blackbody, Earth, Electric, Viridis)
                    customized as an {array} of 2-element {arrays}
                    where the first element is the normalized color
                    level value (starting at *0* and ending at *1*),
                    and the second item is a valid color string.",
    "requiredOpts": [],
    "otherOpts": [
        "dflt"
    ]
},
c                 @   > [         [        U ]
  " SXS.UD6  S U l        g r   )r   r  r~   _named_colorscalesr   s       r   r~   ColorscaleValidator.__init__  s-    !41 	
#	
@F	

 #'r   c                    U R                   Gc+  SS KnSS KnSSKJn  UR                  UR                  UR                  5      UR                  UR                  5      UR                  UR                  5      5      nU Vs0 s H  n[        U[        5      (       d  M  [        U5      S:X  d  M+  [        US   [        5      (       d  ME  [        US   [        5      (       d  M_  US   R                  S5      (       a  Mz  US   R!                  S5      (       a  M  US   R#                  5       US   _M     snU l         U R                   $ s  snf )Nr   )colors   r   _rr}   )r  inspect	itertoolsplotlyr  chain
getmembers
sequential	divergingcyclicalr   r   r   r>   r   endswith
startswithr  )r|   r  r  r  colorscale_memberscs         r   named_colorscales%ColorscaleValidator.named_colorscales  s   ""*%!*""6#4#45""6#3#34""6??3" ,	'+Aa' # FaK # qtS)	 #
 qtT* # !d+ # !, #!

ad"+	'D# &&&	's*   ?EE-EE!E<EEc                     SR                  [        R                  " [        [	        [        U R                  5      5      5      SSSSS95      nSR                  U R                  US9nU$ )	Nr   r   z             FP   r   r   r   widtha      The '{plotly_name}' property is a colorscale and may be
    specified as:
      - A list of colors that will be spaced evenly to create the colorscale.
        Many predefined colorscale lists are included in the sequential, diverging,
        and cyclical modules in the plotly.colors package.
      - A list of 2-element lists where the first element is the
        normalized color level value (starting at 0 and ending at 1),
        and the second item is a valid color string.
        (e.g. [[0, 'green'], [0.5, 'red'], [1.0, 'rgb(0, 0, 255)']])
      - One of the following named colorscales:
{colorscales_str}.
        Appending '_r' to a named colorscale reverses it.
)ry   colorscales_str)	r   r   r   r   sortedr   r#  ri   ry   )r|   r)  r   s      r   r   ColorscaleValidator.description(  sm    ))MMVD!7!789:'"*!&
 F((/  
 	" r   c                    SnUc  SnGOM[        U[        5      (       a  UR                  5       nX0R                  ;   a  U R                  U   nSnOCUR	                  S5      (       a-  US S U R                  ;   a  U R                  US S    S S S2   nSnU(       a8  [        U5      S-
  n[        U5       VVs/ s H  u  pVSU-  SU-  -  U/PM     nnnGO[        U5      (       Gar  [        U5      S:  Gab  [        US   [        5      (       at  U Vs/ s H  n[        R                  U5      b  M  UPM     nn[        U5      S:X  a:  Sn[        U5      S-
  n[        U5       VVs/ s H  u  pVSU-  SU-  -  U/PM     nnnOU Vs/ s H  n[        U5      (       aw  [        U5      S	:w  dh  [        US   [        R                  5      (       aF  SUS   s=::  a  S::  a6  O  O3[        US   [        5      (       a  [        R                  US   5      b  M  UPM     nn[        U5      S:X  a.  SnU Vs/ s H  owS   [        R                  US   5      /PM!     nnU(       d  U R                  U5        U$ s  snnf s  snf s  snnf s  snf s  snf )
NFTr  r   r   g      ?r   r  )r   r>   r  r#  r  r   	enumeraterd   rJ  r  r   r!  r   )	r|   r$   r$  v_lowerdr+   xr'   r   s	            r   r   #ColorscaleValidator.validate_coerceF  si   9G3ggiG000**73!!$''GCRLD<R<R,R**73B<82>FQJ<EaLILDAsQw37+Q/LIa[[SVaZ!A$$$  !N$J$J1$MAq   {#q("G A
A@I!M37sQw/3AM $QKKq6Q;)!A$?? !QqTQ)!A$44)AA!A$G    {#q("G WXVWQR1~EEadKLVW   ""1%Q J
 N"s+   6I1I7/I7$I<B	JJ/&Jc                     Uc  g [        U[        5      (       a  U$ [        U Vs/ s H  n[        U5      PM     sn5      $ s  snf rr   )r   r>   r   )r|   r$   r'   s      r   r   ColorscaleValidator.present  s=    93HA.Aq%(A.//.s   A)r  )rk   rj   r   r   r   r~   propertyr#  r   r   r   r   r   r   s   @r   r  r    s6    "' ' '2<:x0 0r   r  c                   <   ^  \ rS rSrSrSU 4S jjrS rS rSrU =r	$ )AngleValidatori  z
"angle": {
    "description": "A number (in degree) between -180 and 180.",
    "requiredOpts": [],
    "otherOpts": [
        "dflt",
        "arrayOk"
    ]
},
c                 >   > [         [        U ]
  " SXS.UD6  X0l        g r   )r   r7  r~   r{   )r|   ry   rx   r{   r   r   s        r   r~   AngleValidator.__init__  s)    nd, 	
#	
@F	
 !r   c                 `    SR                  U R                  U R                  (       a  SOSS9nU$ )Nz    The '{plotly_name}' property is a angle (in degrees) that may be
    specified as a number between -180 and 180{array_ok}.
    Numeric values outside this range are converted to the equivalent value
    (e.g. 270 is converted to -90).
        z2, or a list, numpy array or other iterable thereofrE  )ry   r{   )ri   ry   r{   r  s     r   r   AngleValidator.description  s?    
 F(( == E  
 	 r   c                    [        U5      (       a   U$ U R                  (       a*  [        U5      (       a   [        USS9nWnUS-   S-  S-
  nU$ U R                  (       a  [        U5      (       as  U Vs/ s H&  n[        U[        R                  5      (       a  M$  UPM(     nnU(       a  U R                  US S 5        [        U5       Vs/ s H  oUS-   S-  S-
  PM     nnU$ [        U[        R                  5      (       d  U R                  U5        U$ US-   S-  S-
  nU$ ! [        [
        [        4 a    U R                  U5         GNf = fs  snf s  snf )NTr     ih  r   )rs   r{   r`   rK   rP   r  r  r   rb   r   r   r!  r   r   )r|   r$   r#  r'   r   r1  s         r   r   AngleValidator.validate_coerce  sG   &q)). - ]]3A66*6qM ASC#%A  ]]q11&'Maz!W^^/L1aKM++K,<=0A!0DE0D1c'S3&0DAE  Aw~~..""1%
  SC#%A' 	=9 *&&q)* N
 Fs#   
D" 4#EEE"&EEr   Fr   r   s   @r   r7  r7    s    	!" r   r7  c                   <   ^  \ rS rSrSrSU 4S jjrS rS rSrU =r	$ )SubplotidValidatori  aJ  
"subplotid": {
    "description": "An id string of a subplot type (given by dflt),
                    optionally followed by an integer >1. e.g. if
                    dflt='geo', we can have 'geo', 'geo2', 'geo3',
                    ...",
    "requiredOpts": [
        "dflt"
    ],
    "otherOpts": [
        "regex"
    ]
}
c                    > Uc  Uc  [        S5      e[        [        U ]  " SXS.UD6  Ub  X0l        O+[
        R                  " SU5      R                  S5      U l        U R                  S-   U l        g )Nz0One or both of regex and deflt must be specifiedr   z/\^(\w+)r   z(\d*)r)   )	rP   r   rA  r~   baser
   r   r   r   )r|   ry   rx   dfltr   r   r   s         r   r~   SubplotidValidator.__init__  st    <EMOPP $0 	
#	
@F	
 I e4::1=DIYY)
r   c                 N    SR                  U R                  U R                  S9nU$ )Nz    The '{plotly_name}' property is an identifier of a particular
    subplot, of type '{base}', that may be specified as the string '{base}'
    optionally followed by an integer >= 1
    (e.g. '{base}', '{base}1', '{base}2', '{base}3', etc.)
        )ry   rC  )ri   ry   rC  r  s     r   r   SubplotidValidator.description  s3    
 F((tyy  
 	 r   c                    Uc   U$ [        U[        5      (       d  U R                  U5        U$ [        U R                  U5      nU(       d  SnOaUR                  S5      n[        U5      S:  a  [        U5      S:X  a  SnO/[        U5      S:  a  [        U5      S:X  a  U R                  nSnOSnU(       d  U R                  U5        U$ )NFr   r   T)	r   r>   r   r   r   r   r   r5  rC  )r|   r$   r   is_valid	digit_strs        r   r   "SubplotidValidator.validate_coerce  s    9* ) As##""1%& ! djj!,E !KKN	y>A%#i.A*=$H^a'C	Na,?		A#H#H&&q)r   )rC  r   NNr   r   s   @r   rA  rA    s    *"
 r   rA  c                   D   ^  \ rS rSrSr SU 4S jjrS rS rS rSr	U =r
$ )	FlaglistValidatori  a  
"flaglist": {
    "description": "A string representing a combination of flags
                    (order does not matter here). Combine any of the
                    available `flags` with *+*.
                    (e.g. ('lines+markers')). Values in `extras`
                    cannot be combined.",
    "requiredOpts": [
        "flags"
    ],
    "otherOpts": [
        "dflt",
        "extras",
        "arrayOk"
    ]
},
c                 b   > [         [        U ]
  " SXS.UD6  X0l        Ub  UO/ U l        XPl        g r   )r   rN  r~   r   r-  r{   )r|   ry   rx   r   r-  r{   r   r   s          r   r~   FlaglistValidator.__init__%  s?     	/ 	
#	
@F	
 
 & 2f r   c           	      L   SR                  U R                  S9nUSR                  U R                  SR                  U R                  S S 5      S9-   nU R                  (       a*  USR                  U R                  U R                  S   S	9-   nU R
                  (       a  US
-   nU$ )Nz_    The '{plotly_name}' property is a flaglist and may be specified
    as a string containing:r   zY
      - Any combination of {flags} joined with '+' characters
        (e.g. '{eg_flag}')+r  )r   eg_flagr0  r   r1  z%
      - A list or array of the above)ri   ry   r   r   r-  r{   r  s     r   r   FlaglistValidator.description/  s     &T--&
.	 	  f4::sxx

2A/GfHI 	 ;;:&dkk"o&F	G  ==((  r   c                 h  ^  [        U[        5      (       a  UR                  5       nUT R                  ;   a  U$ [        U[        5      (       d  g [        R
                  " SU5       Vs/ s H  o"R                  5       PM     nn[        U 4S jU 5       5      (       a  SR                  U5      $ g s  snf )Nz[,+]c              3   @   >#    U  H  oTR                   ;   v   M     g 7frr   r   ).0r*   r|   s     r   	<genexpr>.FlaglistValidator.vc_scalar.<locals>.<genexpr>c  s     3
1DJJ
s   rR  )r   r>   stripr-  r
   splitr  r   )r|   r$   r'   
split_valss   `   r   r  FlaglistValidator.vc_scalarT  s    a	AH!S!! *,&!)<=)<Aggi)<
= 3
33388J'' >s   (B/c                    [        U5      (       a   U$ U R                  (       a  [        U5      (       a  U Vs/ s H  o R                  U5      PM     nn[	        X5       VVs/ s H  u  pEUb  M
  UPM     nnnU(       a  U R                  U5        [        U5      (       a  [        USS9nU$ [        U5      n U$ U R                  U5      nUc  U R                  U5        UnU$ s  snf s  snnf )Nr:   rD  )
rs   r{   rd   r  r   r   r`   rK   r   r   r  s          r   r   !FlaglistValidator.validate_coerceh  s    &q))0 / ]]x{{ 788a>>!,aK8 ,/q+>+>'r,+>   ++K8#A&&03G  &a(  ..+K"&&q)A) 9s   C$#	C)0C))r{   r-  r   NF)rk   rj   r   r   r   r~   r   r  r   r   r   r   s   @r   rN  rN    s)    & FK!#J( r   rN  c                   <   ^  \ rS rSrSrSU 4S jjrS rS rSrU =r	$ )AnyValidatori  z
"any": {
    "description": "Any type.",
    "requiredOpts": [],
    "otherOpts": [
        "dflt",
        "values",
        "arrayOk"
    ]
},
c                 J   > [         [        U ]
  " SXS.UD6  X0l        X@l        g r   )r   rb  r~   r   r{   )r|   ry   rx   r   r{   r   r   s         r   r~   AnyValidator.__init__  s.    lD* 	
#	
@F	
  r   c                 8    SR                  U R                  S9nU$ )NzD    The '{plotly_name}' property accepts values of any type
        r   r   r  s     r   r   AnyValidator.description  s+    F((  
 	
 r   c                     [        U5      (       a   U$ U R                  (       a  [        U5      (       a  [        USS9nU$ U R                  (       a  [	        U5      (       a  [        U5      nU$ )Nr1   rD  )rs   r{   r`   rK   rb   r   r   s     r   r   AnyValidator.validate_coerce  s`    &q))
 	 ]]3A66,QS9A  ]]q11!!$Ar   )r{   r   r`  r   r   s   @r   rb  rb    s    
! r   rb  c                   \   ^  \ rS rSrSr  S
U 4S jjrS r\S 5       rS r	S r
S rS	rU =r$ )InfoArrayValidatori  z
"info_array": {
    "description": "An {array} of plot information.",
    "requiredOpts": [
        "items"
    ],
    "otherOpts": [
        "dflt",
        "freeLength",
        "dimensions"
    ]
}
c                   > [         [        U ]
  " SXS.UD6  X0l        U(       a  UOSU l        X@l        / U l        [        U R                  [        5      (       a  U R                  OU R                  /n[        U5       HE  u  pSR                  XS9n
[        R                  XU5      nU R                  R                  U5        MG     g )Nr   r   z{name}[{i}]rg   r+   r)   )r   rj  r~   rH   
dimensionsfree_lengthitem_validatorsr   r   r.  ri   build_validatorr   )r|   ry   rx   rH   rn  rm  r   info_array_itemsr+   r   element_nameitem_validatorr   s               r   r~   InfoArrayValidator.__init__  s     	 $0 	
#	
@F	
 
(2*&  ")3DJJ)E)E4::DJJ< !12GA(//[/FL/??KN   ''7 3r   c                    SR                  U R                  S9n[        U R                  [        5      (       GaR  U R
                  S;   a  U R                  (       a  U R
                  S:X  a  SOSnUSR                  U[        U R                  5      S9-  n[        U R                  5       H5  u  p4UR                  5       R                  5       nUS	R                  X5S
9-   nM7     U R
                  S;   a  U R                  (       d   eUS-  n[        U R                  5       Hf  u  p4UR                  nSR                  U R                  US9Ul        UR                  5       R                  5       nUS	R                  X5S
9-   nXdl        Mh     U$ U R                  (       d   eU R                  S   nUR                  nU R
                  S;   aN  SR                  U R                  S9Ul        UR                  5       R                  5       nUSR                  US9-  nU R
                  S;   aN  SR                  U R                  S9Ul        UR                  5       R                  5       nUSR                  US9-  nXdl        U$ )NzK    The '{plotly_name}' property is an info array that may be specified as:r   )r   1-2r   z up torE  z4

    * a list or tuple of{upto} {N} elements where:)uptoNz
({i}) {el_desc})r+   el_descrv  r  z

    * a 2D list where:z{name}[i][{i}]rl  r   z	{name}[i]r   z1
    * a list of elements where:
      {el_desc}
)ry  z{name}[i][j]z(
    * a 2D list where:
      {el_desc}
)ri   ry   r   rH   r   rm  rn  r   ro  r.  r   rZ  )r|   r   rw  r+   rs  ry  	orig_names          r   r   InfoArrayValidator.description  s   
F((  
 	 djj$''*,#'#3#318LxRT  FT%9%9!:   *343G3G)H%A,88:@@BG6    *I *,''''   *343G3G)H%A . : :I1A1H1H!-- 2I 2N. -88:@@BG6    2;. *Ib ? ####!11!4N&22I*,-8-?-?TEUEU-?-V*(446<<>  F#   *,-;-B-B)) .C .* )446<<>  F#   *3&r   c                     U S   nUR                  5       R                  SS5      S-   n[        U5      nU  Vs0 s H  nUS;  d  M  X`U   _M     nnU" SXS.UD6$ s  snf )NvalTyper}   rE  	Validator)r~  r   rz   r   r)   )titler  eval)validator_infory   rx   datatypevalidator_classnamevalidator_classkr   s           r   rp  "InfoArrayValidator.build_validator:  s    !),&nn.66sB?+M23 $
#:: !Aa  # 	 
  
#
@F
 	

s   
A	Ac                     UR                   nU R                   nU H  nUS[        U5      -   S-   -  nM     XRl          UR                  U5      nXBl         U$ ! XBl         f = f)a-  
Helper to add indexes to a validator's name, call validate_coerce on
a value, then restore the original validator name.

This makes sure that if a validation error message is raised, the
property name the user sees includes the index(es) of the offending
element.

Parameters
----------
val:
    A value to be validated
validator
    A validator
inds
    List of one or more non-negative integers that represent the
    nested index of the value being validated
Returns
-------
val
    validated value

Raises
------
ValueError
    if val fails validation
r   r   )ry   r>   r   )r|   rV   	validatorr   r{  new_namer+   s          r   "validate_element_with_indexed_name5InfoArrayValidator.validate_element_with_indexed_nameJ  sk    8 ))	##Ac!fs**H  (	.++C0C$-!
 %.!s   A Ac                    [        U5      (       a  g [        U5      (       d  U R                  U5        Un[        U5      nU=(       a    [        US   5      nU(       Ga5  U R                  S;   Ga$  [        U R
                  5      (       a  [        U5       H  u  pE[        U5      (       a"  [        U5      [        U R
                  5      :w  a  U R                  X$   U/5        [        U R                  5       H   u  pgU R                  X   U   XtU/5      XV'   M"     M     U$ U R                  S   n[        U5       HS  u  pE[        U5      (       d  U R                  X$   U/5        [        U5       H  u  phU R                  XXF/5      XV'   M     MU      U$ U(       a(  U R                  S:X  a  U R                  US   S/5        U$ [        U R
                  5      (       d:  U R                  S   n[        U5       H  u  pHU R                  XU/5      X'   M     U$ U R                  (       d5  [        U5      [        U R                  5      :w  a  U R                  U5        U$ U R                  (       a5  [        U5      [        U R                  5      :  a  U R                  U5        U$ [        [        XR                  5      5       H  u  nu  pUR                  U5      X'   M     U$ )Nr   rz  r  )rs   rd   r   r   rm  rH   r.  r   ro  r  rn  r   r   )	r|   r$   orig_vis_v_2dr+   rowjr  r  s	            r   r   "InfoArrayValidator.validate_coercer  s   &q))!""1%  a &1t*4

## (lFA#C==CHDJJ,G..vy1#>(1$2F2F(G!%!H!HDGYA" )H +T = !003	'lFA#C==..vy1#>!*3!%!H!HA6" "0	 +: + 4??a'""6!9qc2& % $**%%,,Q/I"1>>rqcR &  !!c!fD4H4H0I&I""6*  #a&3t/C/C+D"D""6* 	 '0A7K7K0L&M"?B 004 'N r   c                    Uc  g U R                   S:X  d*  U R                   S:X  a  U(       a  [        US   5      (       an  [        R                  " U5      nU H@  n[	        [        X R                  5      5       H  u  nu  pEUR                  U5      X#'   M     MB     [        S U 5       5      $ [        R                  " U5      n[	        [        XR                  5      5       H  u  nu  pEUR                  U5      X'   M     [        U5      $ )Nr  rv  r   c              3   8   #    U  H  n[        U5      v   M     g 7frr   r   )rW  r  s     r   rX  -InfoArrayValidator.present.<locals>.<genexpr>  s     51CU3ZZ1s   )	rm  rd   rO   deepcopyr.  r   ro  r   r   )r|   r$   r  r+   r  r  s         r   r   InfoArrayValidator.present  s    9 1$??e+QqTNN MM!$C.7CAUAU8V.W*?B!*!2!22!6 /X  51555 IIaL*3C;O;O4P*Q&A$,,R0AD +R
 Qxr   )rm  rn  ro  rH   rL  )rk   rj   r   r   r   r~   r   r   rp  r  r   r   r   r   r   s   @r   rj  rj    sF    & 88aF 
 
&P=~   r   rj  c                   2   ^  \ rS rSrSrU 4S jrS rSrU =r$ )LiteralValidatori  z'
Validator for readonly literal values
c                 >   > [         [        U ]
  " SXS.UD6  X0l        g r   )r   r  r~   rV   )r|   ry   rx   rV   r   r   s        r   r~   LiteralValidator.__init__  s*    . 	
#	
@F	
 r   c                 ~    XR                   :w  a-  [        SR                  U R                  U R                  S95      eU$ )Nz>    The '{plotly_name}' property of {parent_name} is read-onlyr   )rV   rP   ri   ry   rx   r   s     r   r    LiteralValidator.validate_coerce  sH    =BBH& $ 0 0d>N>N CI C  Hr   )rV   	rk   rj   r   r   r   r~   r   r   r   r   s   @r   r  r    s    	 	r   r  c                   2   ^  \ rS rSrSrU 4S jrS rSrU =r$ )DashValidatori  aQ  
Special case validator for handling dash properties that may be specified
as lists of dash lengths.  These are not currently specified in the
schema.

"dash": {
    "valType": "string",
    "values": [
        "solid",
        "dot",
        "dash",
        "longdash",
        "dashdot",
        "longdashdot"
    ],
    "dflt": "solid",
    "role": "style",
    "editType": "style",
    "description": "Sets the dash style of lines. Set to a dash type
    string (*solid*, *dot*, *dash*, *longdash*, *dashdot*, or
    *longdashdot*) or a dash length list in px (eg *5px,10px,2px,2px*)."
},
c                 B   > SnX5/-   n[         [        U ]
  " SXUS.UD6  g )Nz4/^\d+(\.\d+)?(px|%)?((,|\s)\s*\d+(\.\d+)?(px|%)?)*$/)ry   rx   r   r)   )r   r  r~   )r|   ry   rx   r   r   dash_list_regexr   s         r   r~   DashValidator.__init__  s9     R++ 	mT+ 	
#V	
OU	
r   c           
         / n/ n[        U R                  U R                  5       H6  u  p4Ub  UR                  UR                  5        M%  UR                  U5        M8     SR                  U R                  S9nU(       aB  SR                  [        R                  " [        U5      SSSSS95      nUSR                  US	9-   nUS
-   nU$ )Nr   r   r   r   Fr&  r'  z:
      - One of the following dash styles:
{enum_vals_str}r   z
      - A string containing a dash length list in pixels or percentages
            (e.g. '5px 10px 2px 2px', '5, 10, 2, 2', '10% 20% 40%', etc.)
)r   r   r   r   r   ri   ry   r   r   r   r   )r|   r   r   r$   r   r   r   s          r   r   DashValidator.description	  s     	DKK9HA ""5==1  #	 :
IIO!! JP J
 	
  IIO#+&.%*M 6"/     	 r   r)   )	rk   rj   r   r   r   r~   r   r   r   r   s   @r   r  r    s    0

* *r   r  c                   r   ^  \ rS rSrSr \" S5      rU 4S jrS rS r	\
S 5       rSrU =r$ ! \ a     N"f = f)	ImageUriValidatori8	  NPILc                 2   > [         [        U ]
  " SXS.UD6  g r   )r   r  r~   r   s       r   r~   ImageUriValidator.__init__@	  s#    / 	
#	
@F	
r   c                 8    SR                  U R                  S9nU$ )Na      The '{plotly_name}' property is an image URI that may be specified as:
      - A remote image URI string
        (e.g. 'http://www.somewhere.com/image.png')
      - A data URI image string
        (e.g. 'data:image/png;base64,iVBORw0KGgoAAAANSU')
      - A PIL.Image.Image object which will be immediately converted
        to a data URI image string
        See http://pillow.readthedocs.io/en/latest/reference/Image.html
        r   r   r  s     r   r   ImageUriValidator.descriptionE	  s-    	 F((  
 	 r   c                    Uc   U$ [        U[        5      (       a   U$ U R                  (       aA  [        XR                  R                  R                  5      (       a  U R	                  U5      nU$ U R                  U5        U$ rr   )r   r>   _PILImagepil_image_to_urir   r   s     r   r   !ImageUriValidator.validate_coerceU	  sy    9  3   YY:a)>)>??%%a(A  ""1%r   c                     [         R                  " 5       nU R                  USS9  UR                  S5        UR	                  5       n[
        R                  " U5      nUR                  S5      nSR                  US9n U $ )NPNG)ri   r   asciiz1data:image/png;base64,{base64_encoded_result_str})base64_encoded_result_str)	ioBytesIOsaveseekreadbase64	b64encodedecoderi   )r$   in_mem_file	img_bytesbase64_encoded_result_bytesr  s        r   r  "ImageUriValidator.pil_image_to_urie	  s{    jjl	{5)$$&	&,&6&6y&A#$?$F$Fw$O!?FF&? G 
 r   r)   )rk   rj   r   r   r  r   ImportErrorr~   r   r   r   r  r   r   r   s   @r   r  r  8	  sO    DU#

   
 
S  s   - 66r  c                   ^   ^  \ rS rSrU 4S jr\S 5       r\S 5       rS r	S	S jr
S rSrU =r$ )
CompoundValidatoris	  c                    > [         [        U ]
  " SXS.UD6  X0l        S U l        X@l        [        R                  U R                  U5      U l        g r   )r   r  r~   data_class_str_data_class	data_docscompute_graph_obj_module_str
module_strr|   ry   rx   r  r  r   r   s         r   r~   CompoundValidator.__init__t	  sU    / 	
#	
@F	

 -"+HH
r   c                 
   US:X  a1  U S;   a+  UR                  S5      nSR                  S/USS  -   5      nU$ US:X  a
  U S:X  a  SnU$ SU;   a%  UR                  S	S
5      nU(       a  SU-   nU$ Sn U$ U(       a  SU-   nU$ SnU$ )Nframe)DataLayout.plotly.graph_objsr   zlayout.templater  zlayout.template.datazlayout.template.data.rE  zplotly.graph_objs.)r[  r   r  )r  rx   parent_partsr  s       r   r  .CompoundValidator.compute_graph_obj_module_str	  s    '!n8J&J
 ',,S1L#6"7,qr:J"JKJ   --.H2L,J  ${2%--.ErJK1K?
  1
  -;J  -Jr   c                     U R                   c/  [        U R                  5      n[        XR                  5      U l         U R                   $ rr   r  r   r  getattrr  r|   rf   s     r   
data_classCompoundValidator.data_class	  ;    #"4??3F&v/B/BCDr   c                 d    SR                  U R                  U R                  U R                  S9nU$ )Nz    The '{plotly_name}' property is an instance of {class_str}
    that may be specified as:
      - An instance of :class:`{module_str}.{class_str}`
      - A dict of string/value properties that will be passed
        to the {class_str} constructorry   	class_strr  ri   ry   r  r  r  s     r   r   CompoundValidator.description	  s=    * &(())  
 	 r   c                 F   Uc  U R                  5       nO{[        U[        5      (       a  U R                  XUS9nOU[        XR                   5      (       a  U R                  U5      nO)U(       a  U R                  5       nOU R                  U5        U R                  Ul        U$ )Nskip_invalid	_validate)r  r   ro   r   ry   _plotly_name)r|   r$   r  r  s       r   r   !CompoundValidator.validate_coerce	  s~    9!A4  	RA??++"AOO%&&q)))r   c                     U$ rr   r)   r   s     r   r   CompoundValidator.present	  s    r   r  r  r  r  FT)rk   rj   r   r   r~   r   r  r5  r  r   r   r   r   r   r   s   @r   r  r  s	  sD    
  2    "& r   r  c                   <   ^  \ rS rSrSrU 4S jrSU 4S jjrSrU =r$ )TitleValidatori	  z
This is a special validator to allow compound title properties
(e.g. layout.title, layout.xaxis.title, etc.) to be set as strings
or numbers.  These strings are mapped to the 'text' property of the
compound validator.
c                 .   > [         [        U ]
  " U0 UD6  g rr   )r   r  r~   )r|   argsr   r   s      r   r~   TitleValidator.__init__	  s    nd,d=f=r   c                 n   > [        U[        [        [        45      (       a  SU0n[        [
        U ]  XS9$ )Ntextr  )r   r>   r5  r  r   r  r   )r|   r$   r  r   s      r   r   TitleValidator.validate_coerce	  s5    a#sE*++A^T:1:XXr   r)   r?  r  r   s   @r   r  r  	  s    >Y Yr   r  c                   N   ^  \ rS rSrU 4S jrS r\S 5       rSS jrS r	Sr
U =r$ )	CompoundArrayValidatori	  c                    > [         [        U ]
  " SXS.UD6  X0l        S U l        X@l        [        R                  U R                  U5      U l        g r   )	r   r  r~   r  r  r  r  r  r  r  s         r   r~   CompoundArrayValidator.__init__	  sU    $d4 	
#	
@F	

 -"+HH
r   c                 d    SR                  U R                  U R                  U R                  S9nU$ )Na      The '{plotly_name}' property is a tuple of instances of
    {class_str} that may be specified as:
      - A list or tuple of instances of {module_str}.{class_str}
      - A list or tuple of dicts of string/value properties that
        will be passed to the {class_str} constructorr  r  r  s     r   r   "CompoundArrayValidator.description	  s=    9 &(())  
 	 r   c                     U R                   c/  [        U R                  5      n[        XR                  5      U l         U R                   $ rr   r  r  s     r   r  !CompoundArrayValidator.data_class	  r  r   c                 \   Uc  / nU$ [        U[        [        45      (       a  / n/ nU H  n[        XPR                  5      (       a"  UR	                  U R                  U5      5        M?  [        U[
        5      (       a   UR	                  U R                  XRS95        Mt  U(       a!  UR	                  U R                  5       5        M  UR	                  S 5        UR	                  U5        M     U(       a  U R                  U5        [        U5      nU$ U(       a  / nU$ U R                  U5        U$ )Nr  )	r   r   r   r  r   ro   r   r   r   )r|   r$   r  resr   r   s         r   r   &CompoundArrayValidator.validate_coerce
  s    9A6 3 D%=))CKdOO44JJtt45d++JJttOP#

4??#45

4(#**40  ++K8!#&A    &&q)r   c                     [        U5      $ rr   r  r   s     r   r   CompoundArrayValidator.present%
  s    Qxr   r  r?  )rk   rj   r   r   r~   r   r5  r  r   r   r   r   r   s   @r   r  r  	  s1    
"    @ r   r  c                   D   ^  \ rS rSr SU 4S jjrS rS rSS jrSrU =r	$ )	BaseDataValidatori*
  c                 X   > [         [        U ]
  " SX#S.UD6  Xl        0 U l        X@l        g r   )r   r  r~   class_strs_map
_class_mapset_uid)r|   r  ry   rx   r  r   r   s         r   r~   BaseDataValidator.__init__+
  s9     	/ 	
#	
@F	
 -r   c           	          [        [        U R                  R                  5       5      5      nSR	                  [
        R                  " USSSS95      nSR                  U R                  US9nU$ )Nr   z            One of: z                     C   )r   r   r(  a/      The '{plotly_name}' property is a tuple of trace instances
    that may be specified as:
      - A list or tuple of trace instances
        (e.g. [Scatter(...), Bar(...)])
      - A single trace instance
        (e.g. Scatter(...), Bar(...), etc.)
      - A list or tuple of dicts of string/value properties where:
        - The 'type' property specifies the trace type
{trace_types}

        - All remaining properties are passed to the constructor of
          the specified trace type

        (e.g. [{{'type': 'scatter', ...}}, {{'type': 'bar, ...}}]))ry   trace_types)	r>   r   r  keysr   r   r   ri   ry   )r|   r  trace_types_wrappedr   s       r   r   BaseDataValidator.description6
  sp    $t22779:;"iiMM5"*	
F &T--;N&
O! 	$ r   c                     XR                   ;  a2  [        S5      nU R                  U   n[        X#5      U R                   U'   U R                   U   $ )Nr  )r  r   r  r  )r|   
trace_nametrace_moduletrace_class_names       r   get_trace_class!BaseDataValidator.get_trace_classW
  sJ    __,()<=L#22:>*1,*QDOOJ'z**r   c                 
   SSK Jn  SSKJn  Uc  / nU$ [	        U[
        [        45      (       d  U/n/ n/ nU GHf  n[	        X5      (       a4  [	        X5      (       a  [        SSS0UR                  D6nOUR                  n[	        U[        5      (       a  SU;   n	UR                  SS5      n
XR                  ;  aU  U(       a+  U R                  S5      " SX#S.UD6nUR                  U5        OMUR                  S 5        UR                  U5        O*U R                  U
5      " SX#S.UD6nUR                  U5        U	(       a  XS'   GM  GM  U(       a*  U R                  S5      " 5       nUR                  U5        GMD  UR                  S 5        UR                  U5        GMi     U(       a  U R                  U5        [        U5      nU R                  (       a,  U H&  n[!        ["        R$                  " 5       5      Ul        M(     U$ )	Nr   )BaseTraceType)Histogram2dcontourrh   histogram2dcontourscatterr  r)   )plotly.basedatatypesr  plotly.graph_objsr  r   r   r   ro   _propspopr  r  r   r   r   r  r>   uuiduuid4uid)r|   r$   r  r  r  r  r  r   r   type_in_v_el
trace_typetraces               r   r   !BaseDataValidator.validate_coerce`
  s   6 	99Ar o a$//CCKd22!$;;#M)=MM#{{dD))#)T>L!%&)!<J!)<)<<'$($8$8$C %-9%RV%E  JJu-JJt,'..t4 $ 4 4Z @ !)5!NR! 

5)#'1V $ $ $ 4 4Y ? A

5)

4(#**40M P ++K8!#&A ||E #DJJL 1EI  r   )r  r  r  r?  r  )
rk   rj   r   r   r~   r   r  r   r   r   r   s   @r   r  r  *
  s"    @E	B+A Ar   r  c                   D   ^  \ rS rSrU 4S jrU 4S jrSU 4S jjrSrU =r$ )BaseTemplateValidatori
  c                 8   > [         [        U ]
  " SUUUUS.UD6  g )N)ry   rx   r  r  r)   )r   r&  r~   r  s         r   r~   BaseTemplateValidator.__init__
  s.    #T3 	
##)		

 	
r   c                 6   > [         [        U ]  5       nUS-  nU$ )Na  
      - The name of a registered template where current registered templates
        are stored in the plotly.io.templates configuration object. The names
        of all registered templates can be retrieved with:
            >>> import plotly.io as pio
            >>> list(pio.templates)  # doctest: +ELLIPSIS
            ['ggplot2', 'seaborn', 'simple_white', 'plotly', 'plotly_white', ...]

      - A string containing multiple registered template names, joined on '+'
        characters (e.g. 'template1+template2'). In this case the resulting
        template is computed by merging together the collection of registered
        templates)r   r&  r   )r|   compound_descriptionr   s     r   r   !BaseTemplateValidator.description
  s,    $%:DMO ! 	 $#r   c                 "  > SS K Jn   XR                  ;   a#  [        R                  " UR                  U   5      $ [        U[        5      (       aW  UR                  S5      n[        U Vs/ s H  oUUR                  ;   PM     sn5      (       a  UR                  R                  " U6 $ U0 :X  d.  [        XR                  5      (       a$  UR                  5       0 :X  a  U R                  0 /S9$ [        [        U ]?  XS9$ s  snf ! [         a     Nff = f)Nr   rR  )data_scatterr  )	plotly.ior  	templatesrO   r  r   r>   r[  r  merge_templatesr  r  to_plotly_jsonr   r&  r   )r|   r$   r  piotemplate_namesrg   r   s         r   r   %BaseTemplateValidator.validate_coerce
  s    	 MM!}}S]]1%566 As##!".I.$-.IJJ==88.II 7jOO449I9I9Kr9Q ???55*DA B 
 	
 J  		s(   1D /D *C<$D <D 
DDr)   r?  r  r   s   @r   r&  r&  
  s    
$"
 
r   r&  )r   r`  )4r  r   r   r  	importlibr   rO   r  r
   r+  warningsnarwhals.stable.v1stablev1r?   _plotly_utils.optional_importsr   r   r   rK   r"   r`   rb   rd   rl   rp   rs   r0   ru   r   r   r   r   r
  r)  r8  rJ  r  r  r7  rA  rN  rb  rj  r  r  r  r  r  r  r  r&  r)   r   r   <module>r;     s       #  	 	 
    5H4pfH2(9LA/IF IX$ $NK- K\} @= :~m ~B[} [|dm dNP] Pf
+ +\U0- U0p<] <~D DNp pf$= $N`  ` F	} .O' Od8 8vV VrY& Y"J] JZw wt8
- 8
r   