o
    Þ­j„X  ã                   @  sv  d dl mZ d dl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j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 )%é    )ÚannotationsN)Úshlex)ÚSplitResultÚ	parse_qslÚ	urlencodeÚurlsplit)Úrun_in_threadpool)ÚScopec                   @  s   e Zd ZU ded< ded< dS )ÚAddressÚstrÚhostÚintÚportN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© r   r   úU/var/www/html/CropPilot/venv/lib/python3.10/site-packages/starlette/datastructures.pyr
      s   
 r
   Ú_KeyTypeÚ_CovariantValueTypeT)Ú	covariantc                   @  sü   e Zd Z		d9d:dd„Zed;dd„ƒZed<dd„ƒZed<dd„ƒZed<dd„ƒZed<dd„ƒZ	ed<dd„ƒZ
ed=dd„ƒZed=dd„ƒZed=dd „ƒZed>d"d#„ƒZed?d%d&„ƒZd@d(d)„Zd@d*d+„Zd@d,d-„ZdAd0d1„ZdBd3d4„Zd<d5d6„Zd<d7d8„ZdS )CÚURLÚ NÚurlr   ÚscopeúScope | NoneÚ
componentsú
typing.AnyÚreturnÚNonec                 K  s:  |d urƒ|r
J dƒ‚|rJ dƒ‚|  dd¡}|  dd ¡}|d }|  dd¡}d }|d	 D ]\}	}
|	d
kr;|
 d¡} nq,|d urJ|› d|› |› �}n.|d u rQ|}n'|\}}dddddœ| }||krl|› d|› |› �}n|› d|› d|› |› �}|r‚|d| ¡  7 }n|r˜|r‹J 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ÚpathÚquery_stringó    Úheaderss   hostúlatin-1z://éP   i»  )r"   ÚhttpsÚwsÚwssú:ú?z)Cannot set both "url" and "**components".r   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__r   c                 C  s   t | dƒst| jƒ| _| jS )NÚ_components)Úhasattrr   r3   r:   ©r4   r   r   r   r   @   s   
zURL.componentsc                 C  ó   | j jS ©N)r   r!   r<   r   r   r   r!   F   ó   z
URL.schemec                 C  r=   r>   )r   Únetlocr<   r   r   r   r@   J   r?   z
URL.netlocc                 C  r=   r>   )r   r$   r<   r   r   r   r$   N   r?   zURL.pathc                 C  r=   r>   )r   Úqueryr<   r   r   r   rA   R   r?   z	URL.queryc                 C  r=   r>   )r   Úfragmentr<   r   r   r   rB   V   r?   zURL.fragmentú
None | strc                 C  r=   r>   )r   Úusernamer<   r   r   r   rD   Z   r?   zURL.usernamec                 C  r=   r>   )r   Úpasswordr<   r   r   r   rE   ^   r?   zURL.passwordc                 C  r=   r>   )r   Úhostnamer<   r   r   r   rF   b   r?   zURL.hostnameú
int | Nonec                 C  r=   r>   )r   r   r<   r   r   r   r   f   r?   zURL.portÚboolc                 C  s
   | j dv S )N)r*   r,   )r!   r<   r   r   r   Ú	is_securej   ó   
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 )NrD   rE   rF   r   ú@éÿÿÿÿú]r-   é   r   r@   r   )Úpopr   rD   rE   r@   Ú
rpartitionÚrsplitr   Ú_replaceÚ	__class__r2   )
r4   rK   rF   r   rD   rE   r@   Ú_Úuserpassr   r   r   r   r1   n   s0   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   ©Ú.0r6   r7   r   r   r   Ú
<dictcomp>‘   ó    z,URL.include_query_params.<locals>.<dictcomp>©rA   )Ú	MultiDictr   rA   ÚupdateÚitemsr   Úmulti_itemsr1   )r4   rK   ÚparamsrA   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   rZ   r[   r   r   r   Ú
<listcomp>–   ó     z,URL.replace_query_params.<locals>.<listcomp>r_   )r   rb   r1   )r4   rK   rA   r   r   r   Úreplace_query_params•   ó   zURL.replace_query_paramsÚkeysústr | typing.Sequence[str]c                 C  sP   t |tƒr|g}tt| jdd�ƒ}|D ]}| |d ¡ qt| ¡ ƒ}| j|d�S )NTrW   r_   )	Ú
isinstancer   r`   r   rA   rP   r   rc   r1   )r4   rk   rd   r6   rA   r   r   r   Úremove_query_params™   s   
zURL.remove_query_paramsÚotherc                 C  s   t | ƒt |ƒkS r>   rZ   ©r4   ro   r   r   r   Ú__eq__¢   ó   z
URL.__eq__c                 C  ó   | j S r>   )r3   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********)rE   ú(ú))r   rE   r1   rT   r   Úrepr)r4   r   r   r   r   Ú__repr__¨   s   zURL.__repr__)r   N)r   r   r   r   r   r   r   r    )r   r   ©r   r   )r   rC   )r   rG   ©r   rH   )rK   r   r   r   )rk   rl   r   r   ©ro   r   r   rH   )r   r   r   r9   Úpropertyr   r!   r@   r$   rA   rB   rD   rE   rF   r   rI   r1   re   ri   rn   rq   rt   ry   r   r   r   r   r      sB    ý(

!


	
r   c                   @  s2   e Zd ZdZdddd	„Zdddd„Zd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$   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__r    c                 C  s   || _ || _d S r>   )r   r   )r4   r$   r   r   r   r   r   r9   ¹   s   
zURLPath.__init__Úbase_urlú	str | URLr   c                 C  sp   t |tƒr	t|ƒ}| jrdddœdddœdœ| j |j }n|j}| jp&|j}|j 	d¡t| ƒ }t|||d�S )	Nr*   r"   )TFr,   r+   )r"   r€   ú/)r!   r@   r$   )
rm   r   r   r   rI   r!   r   r@   r$   Úrstrip)r4   rƒ   r!   r@   r$   r   r   r   Úmake_absolute_url½   s   
þýýzURLPath.make_absolute_urlN)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   Ú__doc__r�   r9   r‡   r   r   r   r   r~   ¯   s
    r~   c                   @  s8   e Zd ZdZddd„Zddd„Zdd	d
„Zd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.
    r7   r   c                 C  s
   || _ d S r>   ©Ú_value©r4   r7   r   r   r   r9   Ó   ó   
zSecret.__init__r   c                 C  s   | j j}|› d�S )Nz('**********')©rT   r   )r4   Ú
class_namer   r   r   ry   Ö   s   
zSecret.__repr__c                 C  rs   r>   rŠ   r<   r   r   r   rt   Ú   ru   zSecret.__str__rH   c                 C  ó
   t | jƒS r>   )rH   r‹   r<   r   r   r   Ú__bool__Ý   r�   zSecret.__bool__N)r7   r   rz   r{   )r   r   r   rˆ   r9   ry   rt   r‘   r   r   r   r   r‰   Í   s    


r‰   c                   @  sH   e Zd Zddd„Zddd„Zddd„Zddd„Zddd„Zddd„ZdS )ÚCommaSeparatedStringsr7   rl   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©r\   Úitemr   r   r   rg   ç   ó    z2CommaSeparatedStrings.__init__.<locals>.<listcomp>)rm   r   r   Ú
whitespaceÚwhitespace_splitÚ_itemsÚlist)r4   r7   Úsplitterr   r   r   r9   â   s   
zCommaSeparatedStrings.__init__r   r   c                 C  r�   r>   )Úlenr›   r<   r   r   r   Ú__len__ë   r�   zCommaSeparatedStrings.__len__Úindexúint | slicer   c                 C  ó
   | j | S r>   )r›   )r4   r    r   r   r   Ú__getitem__î   r�   z!CommaSeparatedStrings.__getitem__útyping.Iterator[str]c                 C  r�   r>   )Úiterr›   r<   r   r   r   Ú__iter__ñ   r�   zCommaSeparatedStrings.__iter__r   c                 C  s&   | j j}dd„ | D ƒ}|› d|›d�S )Nc                 S  s   g | ]}|‘qS r   r   r–   r   r   r   rg   ö   s    z2CommaSeparatedStrings.__repr__.<locals>.<listcomp>rv   rw   rŽ   ©r4   r�   rb   r   r   r   ry   ô   s   zCommaSeparatedStrings.__repr__c                 C  s   d  dd„ | D ƒ¡S )Nú, c                 s  s   � | ]}t |ƒV  qd S r>   )rx   r–   r   r   r   Ú	<genexpr>ú   s   € z0CommaSeparatedStrings.__str__.<locals>.<genexpr>)Újoinr<   r   r   r   rt   ù   ó   zCommaSeparatedStrings.__str__N)r7   rl   ©r   r   )r    r¡   r   r   )r   r¤   rz   )	r   r   r   r9   rŸ   r£   r¦   ry   rt   r   r   r   r   r’   á   s    

	


r’   c                   @  sŽ   e Zd ZU ded< d/d	d
„Zd0dd„Zd1dd„Zd2dd„Zd3dd„Zd4dd„Z	d5dd„Z
d6d d!„Zd7d#d$„Zd8d&d'„Zd9d)d*„Zd:d,d-„Zd.S );ÚImmutableMultiDictz#dict[_KeyType, _CovariantValueType]Ú_dictÚargsú™ImmutableMultiDict[_KeyType, _CovariantValueType] | typing.Mapping[_KeyType, _CovariantValueType] | typing.Iterable[tuple[_KeyType, _CovariantValueType]]rK   r   r   r    c                 O  sÒ   t |ƒdk s
J dƒ‚|r|d ng }|r t|ƒ ¡ t|ƒ ¡  }|s%g }n7t|dƒr;t tttf |¡}t| ¡ ƒ}n!t|dƒrRt tj	ttf |¡}t| 
¡ ƒ}n
t d|¡}t|ƒ}dd„ |D ƒ| _|| _d S )	Né   úToo many arguments.r   rc   rb   z#list[tuple[typing.Any, typing.Any]]c                 S  s   i | ]\}}||“qS r   r   ©r\   ÚkÚvr   r   r   r]     s    z/ImmutableMultiDict.__init__.<locals>.<dictcomp>)rž   r­   rc   r;   ÚtypingÚcastr   r   rœ   ÚMappingrb   r®   Ú_list)r4   r¯   rK   r7   r›   r   r   r   r9      s*   

ÿÿ
ÿ

zImmutableMultiDict.__init__r6   úlist[_CovariantValueType]c                   s   ‡ fdd„| j D ƒS )Nc                   ó   g | ]
\}}|ˆ kr|‘qS r   r   ©r\   Úitem_keyÚ
item_value©r6   r   r   rg   "  ó    z.ImmutableMultiDict.getlist.<locals>.<listcomp>©r¹   ©r4   r6   r   r¿   r   Úgetlist!  r«   zImmutableMultiDict.getlistútyping.KeysView[_KeyType]c                 C  ó
   | j  ¡ S r>   )r®   rk   r<   r   r   r   rk   $  r�   zImmutableMultiDict.keysú&typing.ValuesView[_CovariantValueType]c                 C  rÅ   r>   )r®   Úvaluesr<   r   r   r   rÇ   '  r�   zImmutableMultiDict.valuesú/typing.ItemsView[_KeyType, _CovariantValueType]c                 C  rÅ   r>   )r®   rb   r<   r   r   r   rb   *  r�   zImmutableMultiDict.itemsú*list[tuple[_KeyType, _CovariantValueType]]c                 C  r�   r>   ©rœ   r¹   r<   r   r   r   rc   -  r�   zImmutableMultiDict.multi_itemsr   r   c                 C  r¢   r>   ©r®   rÂ   r   r   r   r£   0  r�   zImmutableMultiDict.__getitem__rH   c                 C  s
   || j v S r>   rË   rÂ   r   r   r   Ú__contains__3  r�   zImmutableMultiDict.__contains__útyping.Iterator[_KeyType]c                 C  ó   t |  ¡ ƒS r>   ©r¥   rk   r<   r   r   r   r¦   6  ó   zImmutableMultiDict.__iter__r   c                 C  r�   r>   )rž   r®   r<   r   r   r   rŸ   9  r�   zImmutableMultiDict.__len__ro   c                 C  s$   t || jƒsdS t| jƒt|jƒkS ©NF)rm   rT   Úsortedr¹   rp   r   r   r   rq   <  s   zImmutableMultiDict.__eq__r   c                 C  s    | j j}|  ¡ }|› d|›d�S ©Nrv   rw   )rT   r   rc   r§   r   r   r   ry   A  ó   zImmutableMultiDict.__repr__N)r¯   r°   rK   r   r   r    )r6   r   r   rº   )r   rÄ   )r   rÆ   )r   rÈ   )r   rÉ   )r6   r   r   r   ©r6   r   r   rH   )r   rÍ   r¬   r|   rz   )r   r   r   r   r9   rÃ   rk   rÇ   rb   rc   r£   rÌ   r¦   rŸ   rq   ry   r   r   r   r   r­   ý   s   
 

!








r­   c                   @  st   e Zd Zd"dd„Zd#dd	„Zd$d%dd„Zd&dd„Zd'dd„Zd(dd„Zd$d%dd„Z	d)dd„Z
d"dd„Zd*d d!„Zd
S )+r`   r6   r   r7   r   r    c                 C  s   |   ||g¡ d S r>   )Úsetlist©r4   r6   r7   r   r   r   Ú__setitem__H  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   rg   L  rh   z)MultiDict.__delitem__.<locals>.<listcomp>)r¹   r®   rÂ   r   r¿   r   Ú__delitem__K  rj   zMultiDict.__delitem__NÚdefaultc                   s$   ‡ fdd„| j D ƒ| _ | j ˆ |¡S )Nc                   rÙ   r   r   r³   r¿   r   r   rg   P  rh   z!MultiDict.pop.<locals>.<listcomp>)r¹   r®   rP   ©r4   r6   rÛ   r   r¿   r   rP   O  s   zMultiDict.popútuple[typing.Any, typing.Any]c                   s,   | j  ¡ \‰ }‡ fdd„| jD ƒ| _ˆ |fS )Nc                   rÙ   r   r   r³   r¿   r   r   rg   U  rh   z%MultiDict.popitem.<locals>.<listcomp>)r®   Úpopitemr¹   rŒ   r   r¿   r   rÞ   S  s   zMultiDict.popitemúlist[typing.Any]c                   s"   ‡ fdd„| j D ƒ}|  ˆ ¡ |S )Nc                   r»   r   r   r³   r¿   r   r   rg   Y  rÀ   z%MultiDict.poplist.<locals>.<listcomp>)r¹   rP   )r4   r6   rÇ   r   r¿   r   ÚpoplistX  s   
zMultiDict.poplistc                 C  s   | j  ¡  | j ¡  d S r>   )r®   Úclearr¹   r<   r   r   r   rá   ]  s   
zMultiDict.clearc                 C  s*   || vr|| j |< | j ||f¡ | | S r>   )r®   r¹   ÚappendrÜ   r   r   r   Ú
setdefaulta  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   rg   l  rh   z%MultiDict.setlist.<locals>.<listcomp>c                   s   g | ]}ˆ |f‘qS r   r   )r\   r7   r¿   r   r   rg   m  r˜   rM   )rP   r¹   r®   )r4   r6   rÇ   Úexisting_itemsr   r¿   r   rÖ   h  s
   zMultiDict.setlistc                 C  s   | j  ||f¡ || j|< d S r>   )r¹   râ   r®   r×   r   r   r   râ   p  s   zMultiDict.appendr¯   úXMultiDict | typing.Mapping[typing.Any, typing.Any] | list[tuple[typing.Any, typing.Any]]rK   c                   s@   t |i |¤Ž‰ ‡ fdd„| jD ƒ}|ˆ  ¡  | _| j ˆ ¡ d S )Nc                   s$   g | ]\}}|ˆ   ¡ vr||f‘qS r   )rk   r³   ©r7   r   r   rg   |  s   $ z$MultiDict.update.<locals>.<listcomp>)r`   r¹   rc   r®   ra   )r4   r¯   rK   rä   r   ræ   r   ra   t  s   zMultiDict.update©r6   r   r7   r   r   r    ©r6   r   r   r    r>   )r6   r   rÛ   r   r   r   )r   rÝ   )r6   r   r   rß   ©r   r    )r6   r   rÇ   rß   r   r    )r¯   rå   rK   r   r   r    )r   r   r   rØ   rÚ   rP   rÞ   rà   rá   rã   rÖ   râ   ra   r   r   r   r   r`   G  s    






r`   c                      s6   e Zd ZdZd‡ fdd	„Zddd„Zddd„Z‡  ZS )ÚQueryParamsz!
    An immutable multidict.
    r¯   ú‡ImmutableMultiDict[typing.Any, typing.Any] | typing.Mapping[typing.Any, typing.Any] | list[tuple[typing.Any, typing.Any]] | str | bytesrK   r   r   r    c                   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   TrW   r(   c                 S  rf   r   rZ   r³   r   r   r   rg   ›  rh   z(QueryParams.__init__.<locals>.<listcomp>c                 S  rY   r   rZ   r³   r   r   r   r]   œ  r^   z(QueryParams.__init__.<locals>.<dictcomp>)rž   rm   r   Úsuperr9   r   Úbytesr0   r¹   r®   rb   )r4   r¯   rK   r7   ©rT   r   r   r9   †  s   	

ÿÿzQueryParams.__init__r   c                 C  r�   r>   )r   r¹   r<   r   r   r   rt   ž  r�   zQueryParams.__str__c                 C  s    | j j}t| ƒ}|› d|›d�S rÓ   )rT   r   r   )r4   r�   r%   r   r   r   ry   ¡  rÔ   zQueryParams.__repr__)r¯   rë   rK   r   r   r    rz   )r   r   r   rˆ   r9   rt   ry   Ú__classcell__r   r   rî   r   rê   �  s
    
rê   c                   @  st   e Zd ZdZddddœd%dd„Zed&dd„ƒZed'dd„ƒZd(dd„Zd)d*dd„Z	d+dd„Z
d,d d!„Zd-d#d$„ZdS ).Ú
UploadFilez@
    An uploaded file included as part of the request data.
    N)ÚsizeÚfilenamer'   Úfileútyping.BinaryIOrñ   rG   rò   ú
str | Noner'   úHeaders | Noner   r    c                C  s"   || _ || _|| _|ptƒ | _d S r>   )rò   ró   rñ   ÚHeadersr'   )r4   ró   rñ   rò   r'   r   r   r   r9   ¬  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_typerH   c                 C  s   t | jddƒ}| S )NÚ_rolledT)Úgetattrró   )r4   Úrolled_to_diskr   r   r   Ú
_in_memory½  s   zUploadFile._in_memoryÚdatarí   c                 Ã  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   )r4   rý   r   r   r   rþ   Ã  s   €
zUploadFile.writerM   r   c                 Ã  s(   �| j r
| j |¡S t| jj|ƒI d H S r>   )rü   ró   Úreadr   )r4   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   )r4   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.closer   c                 C  s&   | j j› d| j›d| j›d| j›d�S )Nz
(filename=z, size=z
, headers=rw   )rT   r   rò   rñ   r'   r<   r   r   r   ry   Ý  s   
ÿþýÿzUploadFile.__repr__)
ró   rô   rñ   rG   rò   rõ   r'   rö   r   r    )r   rõ   r{   )rý   rí   r   r    )rM   )rñ   r   r   rí   )r   r   r   r    ré   rz   )r   r   r   rˆ   r9   r}   rø   rü   rþ   rÿ   r  r  ry   r   r   r   r   rð   §  s    ú
	

rð   c                      s,   e Zd ZdZd‡ fdd	„Zdd
d„Z‡  ZS )ÚFormDatazN
    An immutable multidict, containing both file uploads and text input.
    r¯   úUFormData | typing.Mapping[str, str | UploadFile] | list[tuple[str, str | UploadFile]]rK   ústr | UploadFiler   r    c                   s   t ƒ j|i |¤Ž d S r>   )rì   r9   )r4   r¯   rK   rî   r   r   r9   ë  s   zFormData.__init__c                 Ã  s0   �|   ¡ D ]\}}t|tƒr| ¡ I d H  qd S r>   )rc   rm   rð   r  r×   r   r   r   r  ô  s   €
€þzFormData.close)r¯   r  rK   r  r   r    ré   )r   r   r   rˆ   r9   r  rï   r   r   rî   r   r  æ  s    	r  c                   @  sž   e Zd ZdZ			d0d1dd„Zed2dd„ƒZd3dd„Zd3dd„Zd4dd„Z	d5dd„Z
d6dd„Zd7dd „Zd8d#d$„Zd9d&d'„Zd:d)d*„Zd;d,d-„Zd<d.d/„ZdS )=r÷   z3
    An immutable, case-insensitive multidict.
    Nr'   útyping.Mapping[str, str] | NoneÚrawú list[tuple[bytes, bytes]] | Noner   ú-typing.MutableMapping[str, typing.Any] | Noner   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Úencoder[   r   r   r   rg   	  s    ÿÿz$Headers.__init__.<locals>.<listcomp>z"Cannot set both "raw" and "scope".r'   )r¹   rb   rœ   )r4   r'   r  r   r   r   r   r9   ÿ  s   þ
ýzHeaders.__init__úlist[tuple[bytes, bytes]]c                 C  r�   r>   rÊ   r<   r   r   r   r    rJ   zHeaders.rawú	list[str]c                 C  ó   dd„ | j D ƒS )Nc                 S  s   g | ]	\}}|  d ¡‘qS r
  ©r0   r[   r   r   r   rg     ó    z Headers.keys.<locals>.<listcomp>rÁ   r<   r   r   r   rk     rr   zHeaders.keysc                 C  r  )Nc                 S  s   g | ]	\}}|  d ¡‘qS r
  r  r[   r   r   r   rg     r  z"Headers.values.<locals>.<listcomp>rÁ   r<   r   r   r   rÇ     rr   zHeaders.valuesúlist[tuple[str, str]]c                 C  r  )Nc                 S  s$   g | ]\}}|  d ¡|  d ¡f‘qS r
  r  r[   r   r   r   rg      s    ÿÿz!Headers.items.<locals>.<listcomp>rÁ   r<   r   r   r   rb     s   þzHeaders.itemsr6   r   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   rg   '  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   Úmutablecopy-  r«   zHeaders.mutablecopyc                 C  s<   |  ¡  d¡}| jD ]\}}||kr| d¡  S q
t|ƒ‚)Nr(   )r  r  r¹   r0   ÚKeyError©r4   r6   r  Ú
header_keyÚheader_valuer   r   r   r£   0  s   ÿzHeaders.__getitem__r   rH   c                 C  s0   |  ¡  d¡}| jD ]\}}||kr dS q
dS )Nr(   TFr  r  r   r   r   rÌ   7  s   ÿzHeaders.__contains__útyping.Iterator[typing.Any]c                 C  rÎ   r>   rÏ   r<   r   r   r   r¦   >  rÐ   zHeaders.__iter__r   c                 C  r�   r>   )rž   r¹   r<   r   r   r   rŸ   A  r�   zHeaders.__len__ro   c                 C  s"   t |tƒsdS t| jƒt|jƒkS rÑ   )rm   r÷   rÒ   r¹   rp   r   r   r   rq   D  s   
zHeaders.__eq__c                 C  sF   | j j}t|  ¡ ƒ}t|ƒt| ƒkr|› d|›d�S |› d| j›d�S )Nrv   rw   z(raw=)rT   r   Údictrb   rž   r  )r4   r�   Úas_dictr   r   r   ry   I  s
   zHeaders.__repr__)NNN)r'   r  r  r  r   r	  r   r    ©r   r  )r   r  )r   r  )r6   r   r   r  )r   r  )r6   r   r   r   rÕ   )r   r  r¬   r|   rz   )r   r   r   rˆ   r9   r}   r  rk   rÇ   rb   rÃ   r  r£   rÌ   r¦   rŸ   rq   ry   r   r   r   r   r÷   ú  s&    ü









r÷   c                   @  sj   e Zd Zddd„Zddd	„Zddd„Zddd„Zed dd„ƒZd!dd„Z	d"dd„Z
ddd„Zd#dd„ZdS )$r  r6   r   r7   r   r    c           	      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(   rO   Nr   ©r  r  Ú	enumerater¹   râ   Úreversed)	r4   r6   r7   Úset_keyÚ	set_valueÚfound_indexesÚidxr½   r¾   r   r   r   rØ   R  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   )r4   r6   Údel_keyÚpop_indexesr&  r½   r¾   r   r   r   rÚ   h  s   
€
ÿzMutableHeaders.__delitem__ro   útyping.Mapping[str, str]c                 C  s,   t |tjƒstd|jj› �ƒ‚|  |¡ | S ©NzExpected a mapping but got )rm   r¶   r¸   Ú	TypeErrorrT   r   ra   rp   r   r   r   Ú__ior__v  s   
zMutableHeaders.__ior__c                 C  s4   t |tjƒstd|jj› �ƒ‚|  ¡ }| |¡ |S r*  )rm   r¶   r¸   r+  rT   r   r  ra   )r4   ro   Únewr   r   r   Ú__or__|  s
   
zMutableHeaders.__or__r  c                 C  rs   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¹   r0   râ   )r4   r6   r7   r#  r$  r&  r½   r¾   r   r   r   rã   ‡  s   
ÿzMutableHeaders.setdefaultc                 C  s   |  ¡ D ]\}}|| |< qd S r>   )rb   )r4   ro   r6   Úvalr   r   r   ra   •  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â   )r4   r6   r7   Ú
append_keyÚappend_valuer   r   r   râ   ™  s   
zMutableHeaders.appendÚvaryc                 C  s,   |   d¡}|d urd ||g¡}|| d< d S )Nr2  r¨   )r/   rª   )r4   r2  Úexistingr   r   r   Úadd_vary_header¡  s   
zMutableHeaders.add_vary_headerN)r6   r   r7   r   r   r    )r6   r   r   r    )ro   r)  r   r  r  )r6   r   r7   r   r   r   )ro   r)  r   r    )r2  r   r   r    )r   r   r   rØ   rÚ   r,  r.  r}   r  rã   ra   râ   r4  r   r   r   r   r  Q  s    






r  c                      sL   e Zd ZU dZded< dd‡ fdd„Zddd„Zddd„Zddd„Z‡  Z	S )ÚStatezm
    An object that can be used to store arbitrary state.

    Used for `request.state` and `app.state`.
    zdict[str, typing.Any]Ú_stateNÚstateúdict[str, typing.Any] | Nonec                   s   |d u ri }t ƒ  d|¡ d S )Nr6  )rì   Ú__setattr__)r4   r7  rî   r   r   r9   ±  s   zState.__init__r6   r   r7   r   r    c                 C  s   || j |< d S r>   ©r6  r×   r   r   r   r9  ¶  s   zState.__setattr__c                 C  s4   z| j | W S  ty   d}t| | jj|¡ƒ‚w )Nz!'{}' object has no attribute '{}')r6  r  ÚAttributeErrorÚformatrT   r   )r4   r6   Ú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>   )r7  r8  rç   )r6   r   r   r   rè   )
r   r   r   rˆ   r   r9   r9  r>  r?  rï   r   r   rî   r   r5  ¨  s   
 

r5  )#Ú
__future__r   r¶   r   Úurllib.parser   r   r   r   Ústarlette.concurrencyr   Ústarlette.typesr	   Ú
NamedTupler
   ÚTypeVarr   r   r   r   r~   r‰   ÚSequencer’   r¸   r­   ÚAnyr`   rê   rð   ÚUnionr  r÷   r  r5  r   r   r   r   Ú<module>   s,    
 J:&"?WW