a
    dA                  
   @   s  U d Z ddlZddlZddlZddlZddlZddlZddlZddlm	Z	 ddl
mZ ddlmZ ddlmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlZdd	lm Z m!Z!m"Z" dd
l#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 ddl:m;Z;m<Z<m=Z=m>Z>m?Z? ddl@mAZA ddlBmCZCmDZDmEZEmFZF ddlGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZP dZQeeRd< edef ZSeTedddZUeTedddZVddddZWG dd dZXeW  ee=eeeT eTf eeeeY  eeY f ee=ddf dddZZee=ee=ddf dd d!Z[ee<ee<ddf dd"d#Z\efee; eYeeee=d$d%d&Z]eeeeYeeA e=d'd(d)Z^d.e<eTeYeYeee= eeTe_f f d+d,d-Z`dS )/zOmegaConf module    N)defaultdict)contextmanager)Enum)dedent)IOAnyCallableDict	GeneratorIterableListOptionalSetTupleTypeUnionoverload   )
DictConfigDictKeyType
ListConfig)_DEFAULT_MARKER__ensure_container
_get_valueformat_and_raiseget_dict_key_value_typesget_list_element_typeget_omega_conf_dumperget_type_ofis_attr_classis_dataclassis_dict_annotationis_intis_list_annotationis_primitive_containeris_primitive_dictis_primitive_listis_structured_configis_tuple_annotationis_union_annotationnullcontext	split_keytype_str)Box	ContainerNodeSCMode	UnionNode)BaseContainer)MissingMandatoryValueOmegaConfBaseExceptionUnsupportedInterpolationTypeValidationError)	AnyNodeBooleanNode	BytesNodeEnumNode	FloatNodeIntegerNodePathNode
StringNode	ValueNodez???MISSING.)interpolationreturnc                 C   s   d|  d S )zk
    Equivalent to ${interpolation}
    :param interpolation:
    :return: input ${node} with type Any
    ${} rA   rE   rE   \/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/omegaconf/omegaconf.pyIIQ   s    rH   c                 C   s   | S )z
    Use this for String interpolation, for example "http://${host}:${port}"
    :param interpolation: interpolation string
    :return: input interpolation with type Any
    rE   rF   rE   rE   rG   SIZ   s    rI   rB   c                  C   sv   ddl m}  td| j td| j td| j td| j td| j td| j	j
 td	| j	j d S )
Nr   ocz	oc.createz	oc.decodezoc.deprecatedzoc.envz	oc.selectzoc.dict.keyszoc.dict.values)Zomegaconf.resolversrL   	OmegaConfregister_new_resolvercreatedecode
deprecatedenvselectdictkeysvaluesrK   rE   rE   rG   register_default_resolversc   s    rW   c                   @   s>  e Zd ZdZddddZedyeee ee	e
ef  edddZeedze
ee ee	e
ef  eeef dd	d
Zeed{eee eedf f ee ee	e
ef  eddd
Zeed|eee ee	e
ef  eddd
Zeed}eee ee	e
ef  eddd
Zeed~ee	eef  ee ee	e
ef  eddd
Zeeddfeee ee	e
ef  eeef ddd
Zeee
ejee f eeef dddZedeee
ejee f eddddZedeee
  edddZeee
 edddZeeeee	eef ee eedf ef eeef ddd Zeeeee	eef ee eedf ef eeef dd!d"Zee
edd#d$d%Z ee
edd#d&d'Z!eddd(e
eeedd)d*d+Z"e#e
ed,d-d.Z$eddd/d0Z%e#e
ed,d1d2Z&eee	e
ef d3d4d5Z'eee	e
ef dd6d7d8Z(eedd3d9d:Z)eeedd;d<d=Z*ee+ee dd>d?d@Z,ee+ee d3dAdBZ-ee.ee dd>dCdDZ/ee.ee d3dEdFZ0eeee
ee
 f edGdHdIZ1eddde2j3dJeeeee2ee	eef ee de
ef dKdLdMZ4eeee	eef ee de
ef dNdOdPZ5eeeedQdRdSZ6edeeee7e
f  edTdUdVZ8eeedWdXdYZ9eeedWdZd[Z:eeedWd\d]Z;edeee
 ee<e  d^d_d`Z=eedaddbe.e
eeeedcdddeZ>eddaddfe.e
eeeddgdhdiZ?edddjeeee
dkdldmZ@ee.ddNdndoZAeeeBe
 dNdpdqZCeeddfeee ee	e
ef  eeef ddrdsZDeeee<e  dtdudvZEee
eeFe.e.e+eedf ee
df gef  d,dwdxZGdS )rM   zOmegaConf primary classNrJ   c                 C   s   t dd S )Nz,Use one of the static construction functions)NotImplementedError)selfrE   rE   rG   __init__r   s    zOmegaConf.__init__)objparentflagsrB   c                 C   s   t | ||S N)rM   rO   r[   r\   r]   rE   rE   rG   
structuredu   s    zOmegaConf.structuredc                 C   s   d S r^   rE   r_   rE   rE   rG   rO   }   s    zOmegaConf.create.c                 C   s   d S r^   rE   r_   rE   rE   rG   rO      s    c                 C   s   d S r^   rE   r_   rE   rE   rG   rO      s    c                 C   s   d S r^   rE   r_   rE   rE   rG   rO      s    c                 C   s   d S r^   rE   r_   rE   rE   rG   rO      s    c                 C   s   t j| ||dS )Nr_   )rM   _create_implr_   rE   rE   rG   rO      s
    )file_rB   c                 C   s   ddl m} t| ttjfrftjtj	
| ddd }tj|| d}W d    q1 sZ0    Y  n&t| dd rtj| | d}ntd|d urt|tttfstd	t|j |d u rt }n
t|}|S )
Nr   get_yaml_loaderrutf-8encodingLoaderreadUnexpected file typezInvalid loaded object type: )_utilsrd   
isinstancestrpathlibPathioopenospathabspathyamlloadgetattr	TypeErrorlistrT   IOErrortype__name__rM   rO   )rb   rd   fr[   retrE   rE   rG   rx      s    0

zOmegaConf.loadF)configr   resolverB   c                 C   s   t | st| rt| } tj| |d}t|ttjfr|t	j
tj|ddd}|| W d   q1 sp0    Y  n&t|dr|| |  ntddS )z
        Save as configuration object to a file
        :param config: omegaconf.Config object (DictConfig or ListConfig).
        :param f: filename or file object
        :param resolve: True to save a resolved config (defaults to False)
        )r   wrf   rg   Nwriterl   )r    r   rM   rO   to_yamlrn   ro   rp   rq   rr   rs   rt   ru   rv   r   hasattrflushrz   )r   r   r   datafilerE   rE   rG   save   s    

*


zOmegaConf.save)	args_listrB   c                 C   s    | d u rt jdd  } t| S )Nr   )sysargvrM   from_dotlist)r   rE   rE   rG   from_cli   s    zOmegaConf.from_cli)dotlistrB   c                 C   s   t  }||  |S )z
        Creates config from the content sys.argv or from the specified args list of not None
        :param dotlist:
        :return:
        )rM   rO   Zmerge_with_dotlist)r   confrE   rE   rG   r      s    
zOmegaConf.from_dotlist)configsrB   c                  G   s   t | dksJ t| d }t|}t|ttfs8J t|dd0 |j| dd   |	ddu }W d   n1 sz0    Y  |rt
|d |S )z
        Merge a list of previously created configs into a single one
        :param configs: Input configs
        :return: the merged config object.
        r   readonlyFr   NT)lencopydeepcopyr   rn   r   r   flag_override
merge_with	_get_flagrM   set_readonlyr   targetZturned_readonlyrE   rE   rG   merge   s    ,zOmegaConf.mergec                  G   s   t | dksJ | d }t|}t|ttfs2J t|ddgddg0 |j| dd   |ddu }W d   n1 s|0    Y  |rt	|d |S )a]  
        Merge a list of previously created configs into a single one
        This is much faster than OmegaConf.merge() as the input configs are not copied.
        However, the input configs must not be used after this operation as will become inconsistent.
        :param configs: Input configs
        :return: the merged config object.
        r   r   Zno_deepcopy_set_nodesFTr   N)
r   r   rn   r   r   r   r   r   rM   r   r   rE   rE   rG   unsafe_merge  s    ,zOmegaConf.unsafe_merge)nameresolverrB   c                 C   s   t jtddd t| |S )Nz            register_resolver() is deprecated.
            See https://github.com/omry/omegaconf/issues/426 for migration instructions.
               )
stacklevel)warningswarnr   rM   legacy_register_resolverr   r   rE   rE   rG   register_resolver6  s    	zOmegaConf.register_resolverc                    sf   t sJ d tjvs*J d  dtttttdf ttdf td fdd}|tj < d S )Nresolver must be callable
resolver '' is already registered.r   r\   nodeargsargs_strrB   c           
         s   t |   }dd |D }ztdd |D }W n tyD   Y n0 td  d| d|}||v rp|| n| }	|	||< |	S )Nc                 S   s    g | ]}| d d ddqS )z\  z\,,)replace).0xrE   rE   rG   
<listcomp>U      zPOmegaConf.legacy_register_resolver.<locals>.resolver_wrapper.<locals>.<listcomp>c                 s   s   | ]}d |v r|V  qdS )rC   NrE   )r   irE   rE   rG   	<genexpr>[  r   zOOmegaConf.legacy_register_resolver.<locals>.resolver_wrapper.<locals>.<genexpr>z
Resolver 'z' was called with argument 'a  ' that appears to be an interpolation. Nested interpolations are not supported for resolvers registered with `[legacy_]register_resolver()`, please use `register_new_resolver()` instead (see https://github.com/omry/omegaconf/issues/426 for migration instructions).)rM   	get_cachenextStopIteration
ValueError)
r   r\   r   r   r   cacheZ
args_unescZbad_argkeyvalr   rE   rG   resolver_wrapperL  s    z<OmegaConf.legacy_register_resolver.<locals>.resolver_wrapper)callabler2   
_resolversr/   r   r   ro   )r   r   r   rE   r   rG   r   D  s    


 z"OmegaConf.legacy_register_resolver)r   	use_cache)r   r   r   r   rB   c                   s   t std std|s:t r:td  dztW n ty^   dY n0 ttdfdd}|d	|d
|dt	t
tttdf ttdf td fdd}|t	j < dS )a  
        Register a resolver.

        :param name: Name of the resolver.
        :param resolver: Callable whose arguments are provided in the interpolation,
            e.g., with ${foo:x,0,${y.z}} these arguments are respectively "x" (str),
            0 (int) and the value of `y.z`.
        :param replace: If set to `False` (default), then a `ValueError` is raised if
            an existing resolver has already been registered with the same name.
            If set to `True`, then the new resolver replaces the previous one.
            NOTE: The cache on existing config objects is not affected, use
            `OmegaConf.clear_cache(cfg)` to clear it.
        :param use_cache: Whether the resolver's outputs should be cached. The cache is
            based only on the string literals representing the resolver arguments, e.g.,
            ${foo:${bar}} will always return the same value regardless of the value of
            `bar` if the cache is enabled for `foo`.
        r   z!cannot use an empty resolver namer   r   N)specialrB   c                    s,    d uo|  j v }|r(r(td|  |S )Nz?use_cache=True is incompatible with functions that receive the )
parametersr   )r   r   )sigr   rE   rG   _should_pass  s    z5OmegaConf.register_new_resolver.<locals>._should_pass_parent__node__root_.r   c                    sv   r0t |   }z
|| W S  ty.   Y n0 i }r@||d< rL||d< rX| |d< |i |}rr|||< |S )Nr   r   r   )rM   r   KeyError)r   r\   r   r   r   r   kwargsr   )r   	pass_nodepass_parent	pass_rootr   r   rE   rG   r     s"    
z9OmegaConf.register_new_resolver.<locals>.resolver_wrapper)r   rz   r   rM   has_resolverinspect	signaturero   boolr2   r.   r/   r   r   r   )r   r   r   r   r   r   rE   )r   r   r   r   r   r   r   rG   rN   n  s,    


zOmegaConf.register_new_resolver)r   rB   c                 C   s   |  |d uS r^   )_get_resolverclsr   rE   rE   rG   r     s    zOmegaConf.has_resolverc                   C   s   i t _t  d S r^   )r2   r   rW   rE   rE   rE   rG   clear_resolvers  s    zOmegaConf.clear_resolversc                 C   s"   |  |rtj| dS dS dS )ap  
        Clear(remove) any resolver only if it exists.

        Returns a bool: True if resolver is removed and False if not removed.

        .. warning:
            This method can remove deafult resolvers as well.

        :param name: Name of the resolver.
        :return: A bool (``True`` if resolver is removed, ``False`` if not found before removing).
        TFN)r   r2   r   popr   rE   rE   rG   clear_resolver  s    
zOmegaConf.clear_resolver)r   rB   c                 C   s   | j jS r^   )	_metadataresolver_cacher   rE   rE   rG   r     s    zOmegaConf.get_cache)r   r   rB   c                 C   s   t || j_d S r^   )r   r   r   r   )r   r   rE   rE   rG   	set_cache  s    zOmegaConf.set_cachec                 C   s   t | tti  d S r^   )rM   r   r   rT   r   rE   rE   rG   clear_cache  s    zOmegaConf.clear_cache)from_config	to_configrB   c                 C   s   t |t |  d S r^   )rM   r   r   )r   r   rE   rE   rG   
copy_cache  s    zOmegaConf.copy_cache)r   valuerB   c                 C   s   |  d| d S Nr   	_set_flagr   r   rE   rE   rG   r     s    zOmegaConf.set_readonlyc                 C   s
   |  dS r   r   r   rE   rE   rG   is_readonly  s    zOmegaConf.is_readonlyc                 C   s   |  d| d S Nstructr   r   rE   rE   rG   
set_struct  s    zOmegaConf.set_structc                 C   s
   |  dS r   r   r   rE   rE   rG   	is_struct  s    zOmegaConf.is_struct)r   rU   rB   c                 C   sP   ddl m} t| |stdt|tr.|g}dd | jd|dD }||dS )	z
        Create a masked copy of of this config that contains a subset of the keys
        :param conf: DictConfig object
        :param keys: keys to preserve in the copy
        :return:
        r   r   z,masked_copy is only supported for DictConfigc                 S   s   i | ]\}}||qS rE   rE   )r   r   r   rE   rE   rG   
<dictcomp>  r   z)OmegaConf.masked_copy.<locals>.<dictcomp>F)r   rU   )content)
dictconfigr   rn   r   ro   Zitems_ex)r   rU   r   r   rE   rE   rG   masked_copy  s    

zOmegaConf.masked_copyr   throw_on_missingenum_to_strstructured_config_mode)cfgr   r   r   r   rB   c                C   s6   t | s"tdtt|  dtj| ||||dS )a  
        Resursively converts an OmegaConf config to a primitive container (dict or list).
        :param cfg: the config to convert
        :param resolve: True to resolve all values
        :param throw_on_missing: When True, raise MissingMandatoryValue if any missing values are present.
            When False (the default), replace missing values with the string "???" in the output container.
        :param enum_to_str: True to convert Enum keys and values to strings
        :param structured_config_mode: Specify how Structured Configs (DictConfigs backed by a dataclass) are handled.
            By default (`structured_config_mode=SCMode.DICT`) structured configs are converted to plain dicts.
            If `structured_config_mode=SCMode.DICT_CONFIG`, structured config nodes will remain as DictConfig.
            If `structured_config_mode=SCMode.INSTANTIATE`, this function will instantiate structured configs
               (DictConfigs backed by a dataclass), by creating an instance of the underlying dataclass.
               See also OmegaConf.to_object.
        :return: A dict or a list representing this config as a primitive container.
        z-Input cfg is not an OmegaConf config object ()r   )rM   	is_configr   r,   r}   r2   Z_to_contentr   r   r   r   r   rE   rE   rG   to_container  s    
zOmegaConf.to_container)r   rB   c                 C   s   t j| dddtjdS )a  
        Resursively converts an OmegaConf config to a primitive container (dict or list).
        Any DictConfig objects backed by dataclasses or attrs classes are instantiated
        as instances of those backing classes.

        This is an alias for OmegaConf.to_container(..., resolve=True, throw_on_missing=True,
                                                    structured_config_mode=SCMode.INSTANTIATE)

        :param cfg: the config to convert
        :return: A dict or a list or dataclass representing this config.
        TFr   )rM   r   r0   ZINSTANTIATEr   rE   rE   rG   	to_object9  s    zOmegaConf.to_object)r   r   rB   c              
   C   s^   t | tsJ z0| |}|d u r(W dS t |ts6J | W S  tttfyX   Y dS 0 d S NF)rn   r.   
_get_childr/   _is_missingr5   r   AttributeError)r   r   r   rE   rE   rG   
is_missingN  s    

zOmegaConf.is_missing)r   r   rB   c                 C   sH   |d ur"t | tsJ | |}n| }|d urDt |ts<J | S dS r   )rn   r.   r   r/   Z_is_interpolation)r   r   r   rE   rE   rG   is_interpolationZ  s    zOmegaConf.is_interpolation)r[   rB   c                 C   s   ddl m} t| |S )Nr   r   ) r   rn   )r[   r   rE   rE   rG   is_listf  s    zOmegaConf.is_listc                 C   s   ddl m} t| |S )Nr   r   )r  r   rn   )r[   r   rE   rE   rG   is_dictl  s    zOmegaConf.is_dictc                 C   s   ddl m} t| |S )Nr   )r.   )r  r.   rn   )r[   r.   rE   rE   rG   r   r  s    zOmegaConf.is_config)r[   r   rB   c                 C   s"   |d ur|  |}n| }t|S r^   )r   rM   _get_obj_type)r[   r   crE   rE   rG   get_typex  s    zOmegaConf.get_typeT)defaultthrow_on_resolution_failurer   )r   r   r	  r
  r   rB   c             
   C   s`   ddl m} z|| ||||dW S  tyZ } z"t| |d|t|d W Y d}~n
d}~0 0 dS )a  
        :param cfg: Config node to select from
        :param key: Key to select
        :param default: Default value to return if key is not found
        :param throw_on_resolution_failure: Raise an exception if an interpolation
               resolution error occurs, otherwise return None
        :param throw_on_missing: Raise an exception if an attempt to select a missing key (with the value '???')
               is made, otherwise return None
        :return: selected value or None if not found.
        r   )select_value)r   r   r	  r
  r   N)r   r   r   causemsg)_implr  	Exceptionr   ro   )r   r   r	  r
  r   r  erE   rE   rG   rS     s    zOmegaConf.select)r   	force_add)r   r   r   r   r  rB   c             	   C   s  t |}| }tt|d D ]r}|| }t||dd\}	}
t|	ts|r~t|dd i ||
< W d   q1 sr0    Y  ni ||
< ||
 }q|d }t|tsJ dt|j |}t|t	rt
|}|rt|ddnt }| |rTt|st|rTt|tsJ ||}t|rTt|ts:J || W d   dS t|r~t|tspJ ||| n4t|rt|t
sJ ||| n
dsJ W d   n1 s0    Y  dS )a5  
        Updates a dot separated key sequence to a value

        :param cfg: input config to update
        :param key: key to update (can be a dot separated path)
        :param value: value to set, if value if a list or a dict it will be merged or set
            depending on merge_config_values
        :param merge: If value is a dict or a list, True (default) to merge
                      into the destination, False to replace the destination.
        :param force_add: insert the entire path regardless of Struct flag or Structured Config nodes.
        r   F)r   r   NzUnexpected type for root: )r+   ranger   _select_onern   r.   r   r}   r~   r   intr*   rM   r   r$   r2   r   r   r  ro   __setattr__r  __setitem__)r   r   r   r   r  splitrootr   kZ	next_rootkey_lastZlast_keyctxr   rE   rE   rG   update  sH    
(



zOmegaConf.update)r   	sort_keys)r   r   r  rB   c                C   s.   t | } tj| |dd}tj|dd|t dS )a  
        returns a yaml dump of this config object.
        :param cfg: Config object, Structured Config type or instance
        :param resolve: if True, will return a string with the interpolations resolved, otherwise
        interpolations are preserved
        :param sort_keys: If True, will print dict keys in sorted order. default False.
        :return: A string containing the yaml representation.
        T)r   r   F)Zdefault_flow_styleZallow_unicoder  ZDumper)r   rM   r   rw   dumpr   )r   r   r  	containerrE   rE   rG   r     s    
zOmegaConf.to_yamlc                 C   s8   ddl }t| s(tdt| j d|j|  dS )z
        Resolves all interpolations in the given config object in-place.
        :param cfg: An OmegaConf container (DictConfig, ListConfig)
                    Raises a ValueError if the input object is not an OmegaConf container.
        r   NzInvalid config type (z"), expected an OmegaConf Container)Zomegaconf._implrM   r   r   r}   r~   r  _resolve)r   Z	omegaconfrE   rE   rG   r     s    
zOmegaConf.resolvec                    s0   t | } t tdd fdd  |  S )a<  
        Returns a set of missing keys in a dotlist style.
        :param cfg: An `OmegaConf.Container`,
                    or a convertible object via `OmegaConf.create` (dict, list, ...).
        :return: set of strings of the missing keys.
        :raises ValueError: On input not representing a config.
        N)_cfgrB   c                    sb   t | trtt| }n| }|D ]<}t| |rB| | q t| | r  | |  q d S r^   )	rn   r   r  r   rM   r   add_get_full_keyr   )r#  itrr   gatherZmissingsrE   rG   r(    s    
z&OmegaConf.missing_keys.<locals>.gather)r   setr.   r   rE   r'  rG   missing_keys  s
    	zOmegaConf.missing_keysc           
   
   C   s&  zddl m} ddlm} ddlm} | tu r4i } t| trt	j
| | d} | d u rhtji ||dW S t| trtj| d i||dW S t| ttfsJ tj| ||dW S n(t| st| st| s| d u r4t| |r|| || jj| jj| jj| jj|dW S t| }t|\}}|| ||||dW S nt| sJt| rt| |rx|| || jj| jj| jj|d	W S t| }t|}|| ||td
|d	W S n6t| trtd| j dntdt| j dW nF t y  }	 z,t!d d d t|	|	d dsJ W Y d }	~	n
d }	~	0 0 d S )Nr   rc   r   r  ri   )r\   r]   )r   r\   ref_typeis_optionalkey_typeelement_typer]   )r   r\   r-  r.  r]   )r   r\   r.  r+  r,  r]   TzInput class 'zK' is not a structured config. did you forget to decorate it as a dataclass?zObject of unsupported type: '')r   r   r   r  r  F)"rm   rd   r   r   
listconfigr   r   rn   ro   rw   rx   rM   rO   r{   rT   r%   r  r'   r   r+  optionalr-  r.  r  r   r&   r  r   r   r}   r6   r~   r4   r   )
r[   r\   r]   rd   r   r   Zobj_typer-  r.  r  rE   rE   rG   ra   #  s    




	

	zOmegaConf._create_impl)r  rB   c                 C   s   t | rt| S | d u rd S t| trX|  r2d S |  r>d S t | jjrR| jjS tS nbt| t	rft
S t| tr|t|  S t| trtt| S t| trtS t| t
tfrt
S t| S d S r^   )r'   r   rn   r   _is_noner   r   Zobject_typerT   r   r{   r?   r}   _valuer1   r   tuple)r  rE   rE   rG   r  x  s.    




zOmegaConf._get_obj_typec                 C   s   | t jv rt j|  S d S r^   )r2   r   )r   rE   rE   rG   r     s    zOmegaConf._get_resolver)NN)NN)NN)NN)NN)NNN)F)N)N)N)N)Hr~   
__module____qualname____doc__rZ   staticmethodr   r   r2   r	   ro   r   r`   r   r   r   r   rO   r   r   r   rp   rq   r   rx   r   r   r   r   r   r   Resolverr   r   rN   classmethodr   r   r   r   r   r   r   r/   r   r   r.   r   r   r   r0   DICTr   r   r   r  r  r  r  r   r   r  rS   r  r   r   r   r*  ra   r  r   r   rE   rE   rE   rG   rM   o   s      
         
* 






!)Q $,"" ?
TrM   )r   namesrV   rB   c              
   #   sp   t |tr|g}|d u s"t |tr(|g} fdd|D }z" ||  V  W  || n || 0 d S )Nc                    s   g | ]}  |qS rE   )_get_node_flag)r   r   r   rE   rG   r     r   z!flag_override.<locals>.<listcomp>)rn   ro   r   r   )r   r<  rV   Zprev_statesrE   r>  rG   r     s    
r   )r   rB   c              
   c   s@   |  d}z"t| d | V  W t| | nt| | 0 d S )Nr   F)r=  rM   r   r   Z
prev_staterE   rE   rG   
read_write  s
    
r@  c              
   c   s@   |  d}z"t| d | V  W t| | nt| | 0 d S )Nr   F)r=  rM   r   r?  rE   rE   rG   	open_dict  s
    
rA  )r\   r,  r   r   r+  rB   c              	   C   sZ  t |st|r>|tu r>t|\}}t||| ||||d}nt|sft|sft|tt	fv r|tu rt
|}t||| |||d}nt|st|rt|\}}t||||| ||d}nt|rt||||| d}n||tks|d u rt||| d}nZt|tr*t|tr*t|||| |d}n,|tkrHt||| |d}n|tkrdt||| |d}n|tkrt||| |d}n|tkrt||| |d}n|tkrt||| |d}n|tjkrt ||| |d}n| d urD| !dd	u rDt|tt	fv rt||| ||d
}n,t|r4t||| ||d
}nt||| d}nt"dt#| |S )N)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   r\   )Z	enum_typer   r   r\   r,  )r   r   r\   r,  Zallow_objectsT)r   r   r\   r+  r,  zUnexpected type annotation: )$r!   r%   r   r   r   r#   r(   r}   r{   r4  r   r   r'   r)   r1   r7   rn   
issubclassr   r:   r  r<   floatr;   r   r8   ro   r>   bytesr9   rp   rq   r=   r   r6   r,   )r\   r,  r   r   r+  r-  r.  r   rE   rE   rG   
_node_wrap  s    
	

	







rE  )r+  r   r   r,  r\   rB   c                 C   s8   t |tr"|| || |S t| ||||dS d S )N)r+  r\   r,  r   r   )rn   r/   Z_set_keyZ_set_parentrE  )r+  r   r   r,  r\   rE   rE   rG   _maybe_wrap4  s    	


rF  T)r  r   r   throw_on_type_errorrB   c                 C   sX  ddl m} ddlm} |}t| ts4J d|  |  rDd |fS t| |rlt|ts\J | j|dd}nt| |rt|tsJ t	|s|rt
d| dt|j d	qd }qt|}|d
k s|d t| krd }q| |}ndsJ |d ur6t|tsJ | r6|r.td| | n||fS |d u sPt|tsPJ ||fS )Nr   r   r  zUnexpected type: F)Zvalidate_accesszIndex 'z' (z) is not an intr   zMissing mandatory value: )r   r   r0  r   rn   r.   r2  ro   r   r"   rz   r}   r~   r  r   r/   r   r3   r%  )r  r   r   rG  r   r   Zret_keyr   rE   rE   rG   r  K  s@    



r  )T)ar7  r   r   rr   rt   rp   r   r   collectionsr   
contextlibr   enumr   textwrapr   typingr   r   r   r	   r
   r   r   r   r   r   r   r   r   rw   r  r   r   r   rm   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   baser-   r.   r/   r0   r1   Zbasecontainerr2   errorsr3   r4   r5   r6   nodesr7   r8   r9   r:   r;   r<   r=   r>   r?   r@   __annotations__r9  ro   rH   rI   rW   rM   r   r   r@  rA  rE  rF  r  r  rE   rE   rE   rG   <module>   s~   <`,		      <	b 