o
     d4Z                     @   sp  d dl Z d dlmZ d dlmZ d dlmZmZmZmZ d dl	m
Z
 d dlmZ G dd de jZe d	Ze jd
ddZG dd dZG dd deZG dd dZG dd deZG dd de jeef ZG dd dee je jf ZG dd deeef ZG dd dZG dd deee jeef f ZG dd  d e jeef ZG d!d" d"eZ G d#d$ d$Z!dS )%    N)Sequence)shlex)SplitResult	parse_qsl	urlencodeurlsplit)run_in_threadpool)Scopec                   @   s   e Zd ZU eed< eed< dS )AddresshostportN)__name__
__module____qualname__str__annotations__int r   r   C/usr/local/lib/python3.10/dist-packages/starlette/datastructures.pyr
   
   s   
 r
   _KeyType_CovariantValueTypeT)	covariantc                	   @   s  e Zd Z		d0dedeje dejddfddZe	de
fd	d
Ze	defddZe	defddZe	defddZe	defddZe	defddZe	dejdef fddZe	dejdef fddZe	dejdef fddZe	deje fddZe	defddZdejdd fd d!Zdejdd fd"d#Zdejdd fd$d%Zd&ejeeje f dd fd'd(Zd)ejdefd*d+Zdefd,d-Zdefd.d/Z dS )1URL Nurlscope
componentsreturnc                 K   sF  |d ur|r
J d|rJ d| dd}| dd }| dd|d  }| d	d
}d }|d D ]\}	}
|	dkrA|
d} nq2|d urP| d| | }n.|d u rW|}n'|\}}ddddd| }||krr| d| | }n| d| d| | }|r|d|  7 }n|r|rJ dtdjdi |j }|| _d S )Nz"Cannot set both "url" and "scope".z+Cannot set both "scope" and "**components".schemehttpserver	root_pathr   pathquery_string    headerss   hostlatin-1z://P   i  )r   httpswswss:?z)Cannot set both "url" and "**components".r   )getdecoder   replacer   geturl_url)selfr   r   r   r   r    r"   r#   host_headerkeyvaluer   r   default_portr   r   r   __init__   s:   

zURL.__init__c                 C   s   t | dst| j| _| jS )N_components)hasattrr   r1   r8   r2   r   r   r   r   ?   s   
zURL.componentsc                 C      | j jS N)r   r   r:   r   r   r   r   E      z
URL.schemec                 C   r;   r<   )r   netlocr:   r   r   r   r>   I   r=   z
URL.netlocc                 C   r;   r<   )r   r"   r:   r   r   r   r"   M   r=   zURL.pathc                 C   r;   r<   )r   queryr:   r   r   r   r?   Q   r=   z	URL.queryc                 C   r;   r<   )r   fragmentr:   r   r   r   r@   U   r=   zURL.fragmentc                 C   r;   r<   )r   usernamer:   r   r   r   rA   Y   r=   zURL.usernamec                 C   r;   r<   )r   passwordr:   r   r   r   rB   ]   r=   zURL.passwordc                 C   r;   r<   )r   hostnamer:   r   r   r   rC   a   r=   zURL.hostnamec                 C   r;   r<   )r   r   r:   r   r   r   r   e   r=   zURL.portc                 C   s
   | j dv S )N)r(   r*   )r   r:   r   r   r   	is_securei      
zURL.is_securekwargsc           
      K   s  d|v sd|v sd|v sd|v rq| dd }| d| j}| d| j}| d| j}|d u rH| j}|d\}}}|d dkrH|dd	d
 }|}|d urU|d| 7 }|d urm|}|d urf|d| 7 }| d| }||d< | jjdi |}	| 	|	
 S )NrA   rB   rC   r   @]r+      r   r>   r   )popr   rA   rB   r>   
rpartitionrsplitr   _replace	__class__r0   )
r2   rF   rC   r   rA   rB   r>   _userpassr   r   r   r   r/   m   s8   zURL.replacec                 K   sB   t t| jdd}|dd | D  t| }| j|dS )NTkeep_blank_valuesc                 S      i | ]\}}t |t |qS r   r   .0r4   r5   r   r   r   
<dictcomp>       z,URL.include_query_params.<locals>.<dictcomp>r?   )	MultiDictr   r?   updateitemsr   multi_itemsr/   )r2   rF   paramsr?   r   r   r   include_query_params   s   zURL.include_query_paramsc                 K   s"   t dd | D }| j|dS )Nc                 S       g | ]\}}t |t |fqS r   rU   rV   r   r   r   
<listcomp>        z,URL.replace_query_params.<locals>.<listcomp>rZ   )r   r]   r/   )r2   rF   r?   r   r   r   replace_query_params      zURL.replace_query_paramskeysc                 C   sP   t |tr|g}tt| jdd}|D ]}||d  qt| }| j|dS )NTrR   rZ   )	
isinstancer   r[   r   r?   rK   r   r^   r/   )r2   rf   r_   r4   r?   r   r   r   remove_query_params   s   
zURL.remove_query_paramsotherc                 C   s   t | t |kS r<   rU   r2   ri   r   r   r   __eq__      z
URL.__eq__c                 C      | j S r<   )r1   r:   r   r   r   __str__      zURL.__str__c                 C   s6   t | }| jrt | jdd}| jj dt| dS )Nz********)rB   ())r   rB   r/   rO   r   repr)r2   r   r   r   r   __repr__   s   zURL.__repr__)r   N)!r   r   r   r   typingOptionalr	   Anyr7   propertyr   r   r   r>   r"   r?   r@   UnionrA   rB   rC   r   r   boolrD   r/   r`   rd   r   rh   rk   rn   rs   r   r   r   r   r      sZ    
(!
r   c                	   @   sd   e Zd ZdZddedededd fddZddedededd	fd
dZdejee	f defddZ
d	S )URLPathz
    A URL path string that may also hold an associated protocol and/or host.
    Used by the routing to return `url_path_for` matches.
    r   r"   protocolr   r   c                 C   s   |dv sJ t | |S )N)r   	websocketr   )r   __new__)clsr"   r{   r   r   r   r   r}      s   zURLPath.__new__Nc                 C   s   || _ || _d S r<   )r{   r   )r2   r"   r{   r   r   r   r   r7      s   
zURLPath.__init__base_urlc                 C   st   t |tr	t|}| jrddddddd| j |j }n|j}| jp&|j}|j	dt|  }tt|||dS )	Nr(   r   )TFr*   r)   )r   r|   /)r   r>   r"   )
rg   r   r   r{   rD   r   r   r>   r"   rstrip)r2   r   r   r>   r"   r   r   r   make_absolute_url   s   
zURLPath.make_absolute_url)r   r   )r   r   r   __doc__r   r}   r7   rt   rx   r   r   r   r   r   r   rz      s
     rz   c                   @   sH   e Zd ZdZdefddZdefddZdefdd	Zdefd
dZ	dS )Secretz
    Holds a string value that should not be revealed in tracebacks etc.
    You should cast the value to `str` at the point it is required.
    r5   c                 C   s
   || _ d S r<   _valuer2   r5   r   r   r   r7         
zSecret.__init__r   c                 C   s   | j j}| dS )Nz('**********')rO   r   )r2   
class_namer   r   r   rs      s   
zSecret.__repr__c                 C   rm   r<   r   r:   r   r   r   rn      ro   zSecret.__str__c                 C   
   t | jS r<   )ry   r   r:   r   r   r   __bool__   r   zSecret.__bool__N)
r   r   r   r   r   r7   rs   rn   ry   r   r   r   r   r   r      s    r   c                   @   s   e Zd Zdejeeje f fddZdefddZ	dejee
f dejfdd	Zdeje fd
dZdefddZdefddZdS )CommaSeparatedStringsr5   c                 C   sD   t |trt|dd}d|_d|_dd |D | _d S t|| _d S )NT)posix,c                 S   s   g | ]}|  qS r   )striprW   itemr   r   r   rb          z2CommaSeparatedStrings.__init__.<locals>.<listcomp>)rg   r   r   
whitespacewhitespace_split_itemslist)r2   r5   splitterr   r   r   r7      s   
zCommaSeparatedStrings.__init__r   c                 C   r   r<   )lenr   r:   r   r   r   __len__   r   zCommaSeparatedStrings.__len__indexc                 C   
   | j | S r<   )r   )r2   r   r   r   r   __getitem__   r   z!CommaSeparatedStrings.__getitem__c                 C   r   r<   )iterr   r:   r   r   r   __iter__   r   zCommaSeparatedStrings.__iter__c                 C   s&   | j j}dd | D }| d|dS )Nc                 S   s   g | ]}|qS r   r   r   r   r   r   rb      s    z2CommaSeparatedStrings.__repr__.<locals>.<listcomp>rp   rq   r   r2   r   r]   r   r   r   rs      s   zCommaSeparatedStrings.__repr__c                 C   s   d dd | D S )N, c                 s   s    | ]}t |V  qd S r<   )rr   r   r   r   r   	<genexpr>   s    z0CommaSeparatedStrings.__str__.<locals>.<genexpr>)joinr:   r   r   r   rn         zCommaSeparatedStrings.__str__N)r   r   r   rt   rx   r   r   r7   r   r   slicerv   r   Iteratorr   rs   rn   r   r   r   r   r      s    	r   c                   @   s@  e Zd ZU ejeef ed< dejdej	eef ej
ejeef  f dejddfddZd	ejdeje fd
dZdeje fddZdeje fddZdejeef fddZdejejeef  fddZd	edefddZd	ejdefddZdeje fddZdefddZdejdefddZdefdd Z dS )!ImmutableMultiDict_dictargsz1ImmutableMultiDict[_KeyType, _CovariantValueType]rF   r   Nc                 O   s   t |dk s
J d|r|d ng }|r t| t|  }|s%g }nAt|dr;ttttf |}t| }n+t|drRttj	ttf |}t|
 }nttjtjtjtjf  |}t|}dd |D | _|| _d S )N   Too many arguments.r   r^   r]   c                 S   s   i | ]\}}||qS r   r   rW   kvr   r   r   rX   #  s    z/ImmutableMultiDict.__init__.<locals>.<dictcomp>)r   r   r^   r9   rt   castr   r   r   Mappingr]   ListTuplerv   r   _list)r2   r   rF   r5   r   r   r   r   r7     s.   	




zImmutableMultiDict.__init__r4   c                    s    fdd| j D S )Nc                       g | ]
\}}| kr|qS r   r   rW   item_key
item_valuer4   r   r   rb   '      z.ImmutableMultiDict.getlist.<locals>.<listcomp>r   r2   r4   r   r   r   getlist&  r   zImmutableMultiDict.getlistc                 C   
   | j  S r<   )r   rf   r:   r   r   r   rf   )  r   zImmutableMultiDict.keysc                 C   r   r<   )r   valuesr:   r   r   r   r   ,  r   zImmutableMultiDict.valuesc                 C   r   r<   )r   r]   r:   r   r   r   r]   /  r   zImmutableMultiDict.itemsc                 C   r   r<   r   r   r:   r   r   r   r^   2  r   zImmutableMultiDict.multi_itemsc                 C   r   r<   r   r   r   r   r   r   5  r   zImmutableMultiDict.__getitem__c                 C   s
   || j v S r<   r   r   r   r   r   __contains__8  r   zImmutableMultiDict.__contains__c                 C      t |  S r<   r   rf   r:   r   r   r   r   ;     zImmutableMultiDict.__iter__c                 C   r   r<   )r   r   r:   r   r   r   r   >  r   zImmutableMultiDict.__len__ri   c                 C   s$   t || jsdS t| jt|jkS NF)rg   rO   sortedr   rj   r   r   r   rk   A  s   zImmutableMultiDict.__eq__c                 C   s    | j j}|  }| d|dS Nrp   rq   )rO   r   r^   r   r   r   r   rs   F     zImmutableMultiDict.__repr__)!r   r   r   rt   Dictr   r   r   rx   r   Iterabler   rv   r7   r   r   KeysViewrf   
ValuesViewr   	ItemsViewr]   r^   r   ry   r   r   r   r   r   rk   r   rs   r   r   r   r   r      s2   
 
%r   c                   @   s  e Zd ZdejdejddfddZdejddfddZddejd	ejdejfd
dZdejfddZ	dejdej
fddZdddZddejd	ejdejfddZdejdej
ddfddZdejdejddfddZdejd ejej
ejejejf  f dejddfddZdS )r[   r4   r5   r   Nc                 C   s   |  ||g d S r<   )setlistr2   r4   r5   r   r   r   __setitem__M  s   zMultiDict.__setitem__c                    s"    fdd| j D | _ | j = d S )Nc                        g | ]\}}| kr||fqS r   r   r   r   r   r   rb   Q  rc   z)MultiDict.__delitem__.<locals>.<listcomp>)r   r   r   r   r   r   __delitem__P  re   zMultiDict.__delitem__defaultc                    s$    fdd| j D | _ | j |S )Nc                    r   r   r   r   r   r   r   rb   U  rc   z!MultiDict.pop.<locals>.<listcomp>)r   r   rK   r2   r4   r   r   r   r   rK   T  s   zMultiDict.popc                    s,   | j  \ } fdd| jD | _ |fS )Nc                    r   r   r   r   r   r   r   rb   Z  rc   z%MultiDict.popitem.<locals>.<listcomp>)r   popitemr   r   r   r   r   r   X  s   zMultiDict.popitemc                    s"    fdd| j D }|   |S )Nc                    r   r   r   r   r   r   r   rb   ^  r   z%MultiDict.poplist.<locals>.<listcomp>)r   rK   )r2   r4   r   r   r   r   poplist]  s   
zMultiDict.poplistc                 C   s   | j   | j  d S r<   )r   clearr   r:   r   r   r   r   b  s   
zMultiDict.clearc                 C   s*   || vr|| j |< | j||f | | S r<   )r   r   appendr   r   r   r   
setdefaultf  s   
zMultiDict.setdefaultr   c                    sR   |s
|   d  d S  fdd| jD }| fdd|D  | _|d | j < d S )Nc                    r   r   r   r   r   r   r   rb   q  rc   z%MultiDict.setlist.<locals>.<listcomp>c                    s   g | ]} |fqS r   r   )rW   r5   r   r   r   rb   r  r   rH   )rK   r   r   )r2   r4   r   existing_itemsr   r   r   r   m  s
   zMultiDict.setlistc                 C   s   | j ||f || j|< d S r<   )r   r   r   r   r   r   r   r   u  s   zMultiDict.appendr   rF   c                    s@   t |i |  fdd| jD }|   | _| j  d S )Nc                    s$   g | ]\}}|   vr||fqS r   )rf   r   r5   r   r   rb     s   $ z$MultiDict.update.<locals>.<listcomp>)r[   r   r^   r   r\   )r2   r   rF   r   r   r   r   r\   y  s   	zMultiDict.updater<   r   N)r   r   r   rt   rv   r   r   rK   r   r   r   r   r   r   r   r   rx   r   r\   r   r   r   r   r[   L  s,    
r[   c                       sr   e Zd ZdZdejdejejejej	ej	f  e
ef dej	ddf fddZde
fd	d
Zde
fddZ  ZS )QueryParamsz!
    An immutable multidict.
    r   r   rF   r   Nc                    s   t |dk s
J d|r|d ng }t|tr&t jt|ddfi | n t|tr=t jt|dddfi | n	t j|i | dd | jD | _d	d
 | j	
 D | _	d S )Nr   r   r   TrR   r&   c                 S   ra   r   rU   r   r   r   r   rb     rc   z(QueryParams.__init__.<locals>.<listcomp>c                 S   rT   r   rU   r   r   r   r   rX     rY   z(QueryParams.__init__.<locals>.<dictcomp>)r   rg   r   superr7   r   bytesr.   r   r   r]   )r2   r   rF   r5   rO   r   r   r7     s   

zQueryParams.__init__c                 C   r   r<   )r   r   r:   r   r   r   rn     r   zQueryParams.__str__c                 C   s    | j j}t| }| d|dS r   )rO   r   r   )r2   r   r#   r   r   r   rs     r   zQueryParams.__repr__)r   r   r   r   rt   rx   r   r   r   rv   r   r   r7   rn   rs   __classcell__r   r   r   r   r     s$    	
r   c                   @   s   e Zd ZdZdddddejdeje deje ddd	df
d
dZ	e
d	eje fddZe
d	efddZded	dfddZdded	efddZded	dfddZdddZdS )
UploadFilez@
    An uploaded file included as part of the request data.
    N)sizefilenamer%   filer   r   r%   ztyping.Optional[Headers]r   c                C   s"   || _ || _|| _|pt | _d S r<   )r   r   r   Headersr%   )r2   r   r   r   r%   r   r   r   r7     s   zUploadFile.__init__c                 C   s   | j dd S )Nzcontent-type)r%   r-   r:   r   r   r   content_type  s   zUploadFile.content_typec                 C   s   t | jdd}| S )N_rolledT)getattrr   )r2   rolled_to_diskr   r   r   
_in_memory  s   zUploadFile._in_memorydatac                    sL   | j d ur|  j t|7  _ | jr| j| d S t| jj|I d H  d S r<   )r   r   r   r   writer   )r2   r   r   r   r   r     s   
zUploadFile.writerH   c                    s(   | j r
| j|S t| jj|I d H S r<   )r   r   readr   )r2   r   r   r   r   r     s   zUploadFile.readoffsetc                    s0   | j r| j| d S t| jj|I d H  d S r<   )r   r   seekr   )r2   r   r   r   r   r     s   zUploadFile.seekc                    s,   | j r| j  d S t| jjI d H  d S r<   )r   r   closer   r:   r   r   r   r     s   zUploadFile.close)rH   r   )r   r   r   r   rt   BinaryIOru   r   r   r7   rw   r   ry   r   r   r   r   r   r   r   r   r   r   r     s0    
	r   c                
       s|   e Zd ZdZdejd ejeejeef f ej	ej
eejeef f  f dejeef ddf fddZd
dd	Z  ZS )FormDatazN
    An immutable multidict, containing both file uploads and text input.
    r   rF   r   Nc                    s   t  j|i | d S r<   )r   r7   )r2   r   rF   r   r   r   r7     s   	zFormData.__init__c                    s0   |   D ]\}}t|tr| I d H  qd S r<   )r^   rg   r   r   r   r   r   r   r     s   
zFormData.closer   )r   r   r   r   rt   rx   r   r   r   r   r   r7   r   r   r   r   r   r   r     s    r   c                
   @   s`  e Zd ZdZ			d$dejejeef  dejejej	e
e
f   dejejeejf  ddfddZedejej	e
e
f  fd	d
Zdeje fddZdeje fddZdejej	eef  fddZdedeje fddZd%ddZdedefddZdejdefddZdejej fddZdefddZdejdefd d!Zdefd"d#ZdS )&r   z3
    An immutable, case-insensitive multidict.
    Nr%   rawr   r   c                 C   s   g | _ |d ur#|d u sJ d|d u sJ ddd | D | _ d S |d ur4|d u s/J d|| _ d S |d urEt|d  | _ |d< d S d S )Nz$Cannot set both "headers" and "raw".z&Cannot set both "headers" and "scope".c                 S   s(   g | ]\}}|  d |d fqS r&   )lowerencoderV   r   r   r   rb     s    z$Headers.__init__.<locals>.<listcomp>z"Cannot set both "raw" and "scope".r%   )r   r]   r   )r2   r%   r   r   r   r   r   r7     s   
zHeaders.__init__c                 C   r   r<   r   r:   r   r   r   r     rE   zHeaders.rawc                 C      dd | j D S )Nc                 S   s   g | ]	\}}| d qS r   r.   rV   r   r   r   rb         z Headers.keys.<locals>.<listcomp>r   r:   r   r   r   rf     rl   zHeaders.keysc                 C   r   )Nc                 S   s   g | ]	\}}| d qS r   r   rV   r   r   r   rb      r   z"Headers.values.<locals>.<listcomp>r   r:   r   r   r   r     rl   zHeaders.valuesc                 C   r   )Nc                 S   s$   g | ]\}}| d | d fqS r   r   rV   r   r   r   rb   #  s    z!Headers.items.<locals>.<listcomp>r   r:   r   r   r   r]   "  s   zHeaders.itemsr4   c                    s"   |  d  fdd| jD S )Nr&   c                    s"   g | ]\}}| kr| d qS r   r   r   get_header_keyr   r   rb   *  s    z#Headers.getlist.<locals>.<listcomp>r   r   r   r   r   r   r   r   (  s   
zHeaders.getlistMutableHeadersc                 C   s   t | jd d  dS )N)r   )r   r   r:   r   r   r   mutablecopy0  r   zHeaders.mutablecopyc                 C   s<   |  d}| jD ]\}}||kr|d  S q
t|)Nr&   )r   r   r   r.   KeyErrorr2   r4   r   
header_keyheader_valuer   r   r   r   3  s   zHeaders.__getitem__c                 C   s0   |  d}| jD ]\}}||kr dS q
dS )Nr&   TFr   r  r   r   r   r   :  s   zHeaders.__contains__c                 C   r   r<   r   r:   r   r   r   r   A  r   zHeaders.__iter__c                 C   r   r<   )r   r   r:   r   r   r   r   D  r   zHeaders.__len__ri   c                 C   s"   t |tsdS t| jt|jkS r   )rg   r   r   r   rj   r   r   r   rk   G  s   
zHeaders.__eq__c                 C   sF   | j j}t|  }t|t| kr| d|dS | d| jdS )Nrp   rq   z(raw=)rO   r   dictr]   r   r   )r2   r   as_dictr   r   r   rs   L  s
   zHeaders.__repr__)NNN)r   r   )r   r   r   r   rt   ru   r   r   r   r   r   MutableMappingrv   r7   rw   r   rf   r   r]   r   r   r   ry   r   r   r   r   r   rk   rs   r   r   r   r   r     s6    
 
r   c                   @   s   e Zd ZdededdfddZdeddfddZd	ejeef dd fd
dZd	ejeef dd fddZ	e
dejejeef  fddZdededefddZd	ejeef ddfddZdededdfddZdeddfddZdS )r   r4   r5   r   Nc           	      C   s   |  d}|d}g }t| jD ]\}\}}||kr"|| qt|dd D ]}| j|= q+|rA|d }||f| j|< dS | j||f dS )zs
        Set the header `key` to `value`, removing any duplicate entries.
        Retains insertion order.
        r&   rJ   Nr   r   r   	enumerater   r   reversed)	r2   r4   r5   set_key	set_valuefound_indexesidxr   r   r   r   r   r   U  s   


zMutableHeaders.__setitem__c                 C   sV   |  d}g }t| jD ]\}\}}||kr|| qt|D ]}| j|= q"dS )z*
        Remove the header `key`.
        r&   Nr  )r2   r4   del_keypop_indexesr  r   r   r   r   r   r   k  s   

zMutableHeaders.__delitem__ri   c                 C   s,   t |tjstd|jj | | | S NzExpected a mapping but got )rg   rt   r   	TypeErrorrO   r   r\   rj   r   r   r   __ior__y  s   
zMutableHeaders.__ior__c                 C   s4   t |tjstd|jj |  }|| |S r  )rg   rt   r   r  rO   r   r   r\   )r2   ri   newr   r   r   __or__  s
   
zMutableHeaders.__or__c                 C   rm   r<   r   r:   r   r   r   r     s   zMutableHeaders.rawc                 C   sZ   |  d}|d}t| jD ]\}\}}||kr"|d  S q| j||f |S )zo
        If the header `key` does not exist, then set it to `value`.
        Returns the header value.
        r&   )r   r   r  r   r.   r   )r2   r4   r5   r
  r  r  r   r   r   r   r   r     s   
zMutableHeaders.setdefaultc                 C   s   |  D ]\}}|| |< qd S r<   )r]   )r2   ri   r4   valr   r   r   r\     s   
zMutableHeaders.updatec                 C   s,   |  d}|d}| j||f dS )zD
        Append a header, preserving any duplicate entries.
        r&   N)r   r   r   r   )r2   r4   r5   
append_keyappend_valuer   r   r   r     s   
zMutableHeaders.appendvaryc                 C   s,   |  d}|d urd||g}|| d< d S )Nr  r   )r-   r   )r2   r  existingr   r   r   add_vary_header  s   
zMutableHeaders.add_vary_header)r   r   r   r   r   r   rt   r   r  r  rw   r   r   r   r   r   r\   r   r  r   r   r   r   r   T  s     r   c                       s   e Zd ZU dZejeejf ed< ddej	ejeejf  f fddZ
dejdejd	dfd
dZdejd	ejfddZdejd	dfddZ  ZS )Statezm
    An object that can be used to store arbitrary state.

    Used for `request.state` and `app.state`.
    _stateNstatec                    s   |d u ri }t  d| d S )Nr  )r   __setattr__)r2   r  r   r   r   r7     s   zState.__init__r4   r5   r   c                 C   s   || j |< d S r<   r  r   r   r   r   r    s   zState.__setattr__c                 C   s4   z| j | W S  ty   d}t|| jj|w )Nz!'{}' object has no attribute '{}')r  r   AttributeErrorformatrO   r   )r2   r4   messager   r   r   __getattr__  s   zState.__getattr__c                 C   s   | j |= d S r<   r  r   r   r   r   __delattr__  r   zState.__delattr__r<   )r   r   r   r   rt   r   r   rv   r   ru   r7   r  r#  r$  r   r   r   r   r   r    s   
 &r  )"rt   collections.abcr   r   urllib.parser   r   r   r   starlette.concurrencyr   starlette.typesr	   
NamedTupler
   TypeVarr   r   r   r   rz   r   r   r   r   rv   r[   r   r   rx   r   r   r   r  r   r   r   r   <module>   s,    
 N<("7WW