o
    &=j²  ã                   @  s`  d dl m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	m
Z
 d dlmZ ddlmZ ddlmZmZmZ ddlmZmZmZmZmZmZ dd	lmZ dd
lmZmZmZmZ ddl m!Z!m"Z"m#Z#m$Z$ ddl%m&Z& ddl'm(Z(m)Z) ddl*m+Z+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z: ddl;m<Z<m=Z= ddl>m?Z?m@Z@ ejArµd dlBZBg d¢ZCejDddd�ZEejDddd�ZFd7dd„ZGd8d d!„ZHd9d#d$„ZIG d%d&„ d&ƒZJeJƒ ZKe Ld'¡ZMd(e› �ZNd) Od*d+„ e P¡ D ƒ¡ZQG d,d-„ d-ejRƒZSG d.d/„ d/e9ƒZTG d0d1„ d1e.ƒZUejVd2ejWf ZXG d3d4„ d4ƒZYG d5d„ deYƒZZG d6d„ deYƒZ[dS ):é    )ÚannotationsN)ÚasynccontextmanagerÚcontextmanager)ÚTracebackTypeé   )Ú__version__)ÚAuthÚ	BasicAuthÚFunctionAuth)ÚDEFAULT_LIMITSÚDEFAULT_MAX_REDIRECTSÚDEFAULT_TIMEOUT_CONFIGÚLimitsÚProxyÚTimeout)ÚSUPPORTED_DECODERS)Ú
InvalidURLÚRemoteProtocolErrorÚTooManyRedirectsÚrequest_context)ÚCookiesÚHeadersÚRequestÚResponse)Úcodes)ÚAsyncBaseTransportÚBaseTransport)ÚAsyncHTTPTransportÚHTTPTransport)ÚAsyncByteStreamÚ	AuthTypesÚ	CertTypesÚCookieTypesÚHeaderTypesÚ
ProxyTypesÚQueryParamTypesÚRequestContentÚRequestDataÚRequestExtensionsÚRequestFilesÚSyncByteStreamÚTimeoutTypes)ÚURLÚQueryParams)Ú
URLPatternÚget_environment_proxies)ÚUSE_CLIENT_DEFAULTÚAsyncClientÚClientÚTr2   )ÚboundÚUr1   Úurlr,   ÚlocationÚreturnÚboolc                 C  s<   | j |j krdS | jdkot| ƒdko|jdkot|ƒdkS )zA
    Return 'True' if 'location' is a HTTPS upgrade of 'url'
    FÚhttpéP   Úhttpsé»  N)ÚhostÚschemeÚ_port_or_default)r6   r7   © rA   úWC:\Users\psant\Downloads\Anu Raj Backend\school\venv\Lib\site-packages\httpx/_client.pyÚ_is_https_redirect>   s   

ÿþ
ürC   ú
int | Nonec                 C  s"   | j d ur| j S dddœ | j¡S )Nr;   r=   )r:   r<   )ÚportÚgetr?   ©r6   rA   rA   rB   r@   M   s   
r@   Úotherc                 C  s(   | j |j ko| j|jkot| ƒt|ƒkS )z@
    Return 'True' if the given URLs share the same origin.
    N)r?   r>   r@   )r6   rH   rA   rA   rB   Ú_same_originS   s
   
ÿýrI   c                   @  s   e Zd ZdZdS )ÚUseClientDefaulta<  
    For some parameters such as `auth=...` and `timeout=...` we need to be able
    to indicate the default "unset" state, in a way that is distinctly different
    to using `None`.

    The default "unset" state indicates that whatever default is set on the
    client should be used. This is different to setting `None`, which
    explicitly disables the parameter, possibly overriding a client default.

    For example we use `timeout=USE_CLIENT_DEFAULT` in the `request()` signature.
    Omitting the `timeout` parameter will send a request using whatever default
    timeout has been configured on the client. Including `timeout=None` will
    ensure no timeout is used.

    Note that user code shouldn't need to use the `USE_CLIENT_DEFAULT` constant,
    but it is used internally when a parameter is not included.
    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rA   rA   rA   rB   rJ   ^   s    rJ   Zhttpxzpython-httpx/z, c                 C  s   g | ]}|d kr|‘qS )ÚidentityrA   )Ú.0ÚkeyrA   rA   rB   Ú
<listcomp>y   s    rR   c                   @  s   e Zd ZdZdZdZdS )ÚClientStater   é   é   N)rK   rL   rM   ÚUNOPENEDÚOPENEDÚCLOSEDrA   rA   rA   rB   rS   }   s    rS   c                   @  ó.   e Zd ZdZdd
d„Zddd„Zddd„ZdS )ÚBoundSyncStreamz“
    A byte stream that is bound to a given response instance, and that
    ensures the `response.elapsed` is set once the response is closed.
    Ústreamr*   Úresponser   ÚstartÚfloatr8   ÚNonec                 C  ó   || _ || _|| _d S ©N©Ú_streamÚ	_responseÚ_start©Úselfr[   r\   r]   rA   rA   rB   Ú__init__‘   ó   
zBoundSyncStream.__init__útyping.Iterator[bytes]c                 c  s   � | j D ]}|V  qd S ra   ©rc   ©rg   ÚchunkrA   rA   rB   Ú__iter__˜   s   €
ÿzBoundSyncStream.__iter__c                 C  s,   t  ¡ | j }tj|d�| j_| j ¡  d S ©N)Úseconds)	ÚtimeÚperf_counterre   ÚdatetimeÚ	timedeltard   Úelapsedrc   Úclose©rg   ru   rA   rA   rB   rv   œ   s   zBoundSyncStream.closeN)r[   r*   r\   r   r]   r^   r8   r_   )r8   rj   ©r8   r_   )rK   rL   rM   rN   rh   rn   rv   rA   rA   rA   rB   rZ   ‹   ó
    

rZ   c                   @  rY   )ÚBoundAsyncStreamzš
    An async byte stream that is bound to a given response instance, and that
    ensures the `response.elapsed` is set once the response is closed.
    r[   r   r\   r   r]   r^   r8   r_   c                 C  r`   ra   rb   rf   rA   rA   rB   rh   ¨   ri   zBoundAsyncStream.__init__útyping.AsyncIterator[bytes]c                 C s"   �| j 2 z	3 d H W }|V  q6 d S ra   rk   rl   rA   rA   rB   Ú	__aiter__¯   s   €ÿzBoundAsyncStream.__aiter__c                 Ã  s4   �t  ¡ | j }tj|d�| j_| j ¡ I d H  d S ro   )	rq   rr   re   rs   rt   rd   ru   rc   Úacloserw   rA   rA   rB   r}   ³   s   €zBoundAsyncStream.acloseN)r[   r   r\   r   r]   r^   r8   r_   )r8   r{   rx   )rK   rL   rM   rN   rh   r|   r}   rA   rA   rA   rB   rz   ¢   ry   rz   .c                   @  sÖ  e Zd Zddddeded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-„Z
ed€d/d0„ƒZejd�d1d0„ƒZed‚d3d4„ƒZejdƒd5d4„ƒZed„d7d8„ƒZejd…d:d8„ƒZed†d;d<„ƒZejd‡d=d<„ƒZedˆd?d@„ƒZejd‰dBd@„ƒZedŠdDdE„ƒZejd‹dGdE„ƒZedŒdIdJ„ƒZejd�dLdJ„ƒZdddddddeddMœ	dŽd\d]„Zd�d^d_„Zd�d‘d`da„Zd�d’dbdc„Z	d�d“ddde„Zd”dfdg„Zefd•dkdl„Zd–dodp„Zd—dqdr„Zd˜dsdt„Zd™dudv„Zdšdxdy„Zd›dzd{„Z dS )œÚ
BaseClientNFÚ Túutf-8©ÚauthÚparamsÚheadersÚcookiesÚtimeoutÚfollow_redirectsÚmax_redirectsÚevent_hooksÚbase_urlÚ	trust_envÚdefault_encodingr‚   úAuthTypes | Nonerƒ   úQueryParamTypes | Noner„   úHeaderTypes | Noner…   úCookieTypes | Noner†   r+   r‡   r9   rˆ   Úintr‰   ú+None | typing.Mapping[str, list[EventHook]]rŠ   ú	URL | strr‹   rŒ   ú#str | typing.Callable[[bytes], str]r8   r_   c                C  sœ   |d u ri n|}|   t|	ƒ¡| _|  |¡| _t|ƒ| _t|ƒ| _t	|ƒ| _
t|ƒ| _|| _|| _t| dg ¡ƒt| dg ¡ƒdœ| _|
| _|| _tj| _d S ©NÚrequestr\   )r–   r\   )Ú_enforce_trailing_slashr,   Ú	_base_urlÚ_build_authÚ_authr-   Ú_paramsr   r„   r   Ú_cookiesr   Ú_timeoutr‡   rˆ   ÚlistrF   Ú_event_hooksÚ
_trust_envÚ_default_encodingrS   rV   Ú_state)rg   r‚   rƒ   r„   r…   r†   r‡   rˆ   r‰   rŠ   r‹   rŒ   rA   rA   rB   rh   ½   s   



þzBaseClient.__init__c                 C  s   | j tjkS )z2
        Check if the client being closed
        N)r¢   rS   rX   ©rg   rA   rA   rB   Ú	is_closedß   s   zBaseClient.is_closedc                 C  ó   | j S ra   )r    r£   rA   rA   rB   r‹   æ   ó   zBaseClient.trust_envr6   r,   c                 C  s"   |j  d¡r|S |j|j d d�S )Nó   /©Úraw_path)r©   ÚendswithÚ	copy_with©rg   r6   rA   rA   rB   r—   ê   s   z"BaseClient._enforce_trailing_slashÚproxyúProxyTypes | NoneÚallow_env_proxiesúdict[str, Proxy | None]c                 C  sH   |d u r|rdd„ t ƒ  ¡ D ƒS i S t|ttfƒrt|d�n|}d|iS )Nc                 S  s(   i | ]\}}||d u rd nt |d�“qS )NrG   )r   )rP   rQ   r6   rA   rA   rB   Ú
<dictcomp>ô   s    ÿÿz-BaseClient._get_proxy_map.<locals>.<dictcomp>rG   zall://)r/   ÚitemsÚ
isinstanceÚstrr,   r   )rg   r­   r¯   rA   rA   rB   Ú_get_proxy_mapï   s   þzBaseClient._get_proxy_mapr   c                 C  r¥   ra   )r�   r£   rA   rA   rB   r†   ý   r¦   zBaseClient.timeoutc                 C  ó   t |ƒ| _d S ra   )r   r�   )rg   r†   rA   rA   rB   r†     ó   údict[str, list[EventHook]]c                 C  r¥   ra   )rŸ   r£   rA   rA   rB   r‰     r¦   zBaseClient.event_hooksc                 C  s(   t | dg ¡ƒt | dg ¡ƒdœ| _d S r•   )rž   rF   rŸ   )rg   r‰   rA   rA   rB   r‰   	  s   þúAuth | Nonec                 C  r¥   )z¦
        Authentication class used when none is passed at the request-level.

        See also [Authentication][0].

        [0]: /quickstart/#authentication
        N)rš   r£   rA   rA   rB   r‚     s   	zBaseClient.authr    c                 C  s   |   |¡| _d S ra   )r™   rš   ©rg   r‚   rA   rA   rB   r‚     s   c                 C  r¥   )zK
        Base URL to use when sending requests with relative URLs.
        N)r˜   r£   rA   rA   rB   rŠ     ó   zBaseClient.base_urlc                 C  s   |   t|ƒ¡| _d S ra   )r—   r,   r˜   r¬   rA   rA   rB   rŠ   &  s   r   c                 C  r¥   )z@
        HTTP headers to include when sending requests.
        N)Ú_headersr£   rA   rA   rB   r„   *  r»   zBaseClient.headersr#   c                 C  s2   t dt d¡dt d¡dœƒ}| |¡ || _d S )Ns   */*Úasciis
   keep-alive)s   Accepts   Accept-Encodings
   Connections
   User-Agent)r   ÚACCEPT_ENCODINGÚencodeÚ
USER_AGENTÚupdater¼   )rg   r„   Zclient_headersrA   rA   rB   r„   1  s   üÿ

r   c                 C  r¥   )zA
        Cookie values to include when sending requests.
        N)rœ   r£   rA   rA   rB   r…   >  r»   zBaseClient.cookiesr"   c                 C  r¶   ra   )r   rœ   )rg   r…   rA   rA   rB   r…   E  r·   r-   c                 C  r¥   )zO
        Query parameters to include in the URL when sending requests.
        N)r›   r£   rA   rA   rB   rƒ   I  r»   zBaseClient.paramsr%   c                 C  r¶   ra   )r-   r›   )rg   rƒ   rA   rA   rB   rƒ   P  r·   )	ÚcontentÚdataÚfilesÚjsonrƒ   r„   r…   r†   Ú
extensionsÚmethodr´   rÂ   úRequestContent | NonerÃ   úRequestData | NonerÄ   úRequestFiles | NonerÅ   útyping.Any | NoneúTimeoutTypes | UseClientDefaultrÆ   úRequestExtensions | Noner   c       	         C  sŽ   |   |¡}|  |¡}|  |	¡}	|  |¡}|du ri n|}d|vr9t|
tƒr(| jnt|
ƒ}
tdi |¤d|
 	¡ i¤Ž}t
|||||||||	|d�
S )aR  
        Build and return a request instance.

        * The `params`, `headers` and `cookies` arguments
        are merged with any values set on the client.
        * The `url` argument is merged with any `base_url` set on the client.

        See also: [Request instances][0]

        [0]: /advanced/clients/#request-instances
        Nr†   )rÂ   rÃ   rÄ   rÅ   rƒ   r„   r…   rÆ   rA   )Ú
_merge_urlÚ_merge_headersÚ_merge_cookiesÚ_merge_queryparamsr³   rJ   r†   r   ÚdictÚas_dictr   )rg   rÇ   r6   rÂ   rÃ   rÄ   rÅ   rƒ   r„   r…   r†   rÆ   rA   rA   rB   Úbuild_requestT  s.   



ÿýözBaseClient.build_requestc                 C  s4   t |ƒ}|jr| jj|j d¡ }| jj|d�S |S )z‹
        Merge a URL argument together with any 'base_url' on the client,
        to create the URL used for the outgoing request.
        r§   r¨   N)r,   Úis_relative_urlrŠ   r©   Úlstripr«   )rg   r6   Z	merge_urlZmerge_raw_pathrA   rA   rB   rÎ   ‡  s
   zBaseClient._merge_urlc                 C  s&   |s| j rt| j ƒ}| |¡ |S |S )z�
        Merge a cookies argument together with any cookies on the client,
        to create the cookies used for the outgoing request.
        N)r…   r   rÁ   )rg   r…   Úmerged_cookiesrA   rA   rB   rÐ   �  s
   


zBaseClient._merge_cookiesc                 C  s   t | jƒ}| |¡ |S )z�
        Merge a headers argument together with any headers on the client,
        to create the headers used for the outgoing request.
        N)r   r„   rÁ   )rg   r„   Zmerged_headersrA   rA   rB   rÏ   ¨  s   

zBaseClient._merge_headersc                 C  s"   |s| j rt| j ƒ}| |¡S |S )zœ
        Merge a queryparams argument together with any queryparams on the client,
        to create the queryparams used for the outgoing request.
        N)rƒ   r-   Úmerge)rg   rƒ   Zmerged_queryparamsrA   rA   rB   rÑ   ±  s   


zBaseClient._merge_queryparamsc                 C  sX   |d u rd S t |tƒrt|d |d d�S t |tƒr|S t|ƒr%t|d�S td|›�ƒ‚)Nr   r   ©ÚusernameÚpassword)ÚfunczInvalid "auth" argument: )r³   Útupler	   r   Úcallabler
   Ú	TypeErrorrº   rA   rA   rB   r™   ½  s   


zBaseClient._build_authr–   ú#AuthTypes | UseClientDefault | Noner   c                 C  sR   t |tƒr| jn|  |¡}|d ur|S |jj|jj}}|s |r&t||d�S tƒ S )NrÙ   )	r³   rJ   rš   r™   r6   rÚ   rÛ   r	   r   )rg   r–   r‚   rÚ   rÛ   rA   rA   rB   Ú_build_request_authÉ  s   ÿzBaseClient._build_request_authr\   r   c                 C  sR   |   ||¡}|  ||¡}|  |||¡}|  ||¡}t| jƒ}t||||||jd�S )zƒ
        Given a request and a redirect response, return a new request that
        should be used to effect the redirect.
        )rÇ   r6   r„   r…   r[   rÆ   N)Ú_redirect_methodÚ_redirect_urlÚ_redirect_headersÚ_redirect_streamr   r…   r   rÆ   )rg   r–   r\   rÇ   r6   r„   r[   r…   rA   rA   rB   Ú_build_redirect_requestÛ  s   
úz"BaseClient._build_redirect_requestc                 C  sR   |j }|jtjkr|dkrd}|jtjkr|dkrd}|jtjkr'|dkr'd}|S )z‹
        When being redirected we may want to change the method of the request
        based on certain specs or browser behavior.
        ÚHEADÚGETÚPOSTN)rÇ   Ústatus_coder   Ú	SEE_OTHERÚFOUNDÚMOVED_PERMANENTLY)rg   r–   r\   rÇ   rA   rA   rB   râ   î  s   zBaseClient._redirect_methodc              
   C  s–   |j d }zt|ƒ}W n ty" } ztd|› d�|d�d‚d}~ww |jr1|js1|j|jjd�}|jr:|j 	|¡}|jj
rI|j
sI|j|jj
d�}|S )z<
        Return the URL for the redirect to follow.
        ZLocationz Invalid URL in location header: Ú.©r–   N)r>   )Úfragment)r„   r,   r   r   r?   r>   r«   r6   rÕ   Újoinrð   )rg   r–   r\   r7   r6   ÚexcrA   rA   rB   rã     s$   
ÿþ€ÿzBaseClient._redirect_urlc                 C  sx   t |jƒ}t||jƒst|j|ƒs| dd¡ |j d¡|d< ||jkr4|dkr4| dd¡ | dd¡ | dd¡ |S )	zR
        Return the headers that should be used for the redirect request.
        ÚAuthorizationNr½   ÚHostrè   zContent-LengthzTransfer-EncodingÚCookie)	r   r„   rI   r6   rC   ÚpopÚnetlocÚdecoderÇ   )rg   r–   r6   rÇ   r„   rA   rA   rB   rä   "  s   
zBaseClient._redirect_headersú'SyncByteStream | AsyncByteStream | Nonec                 C  s   ||j kr|dkrdS |jS )zO
        Return the body that should be used for the redirect request.
        rè   N)rÇ   r[   )rg   r–   rÇ   rA   rA   rB   rå   =  s   zBaseClient._redirect_streamc                 C  sL   d|j vr$t| jtƒr| jnt| jƒ}tdi |j ¤d| ¡ i¤Ž|_ d S d S )Nr†   rA   )rÆ   r³   r†   rJ   r   rÒ   rÓ   )rg   r–   r†   rA   rA   rB   Ú_set_timeoutH  s   

ÿý"úzBaseClient._set_timeout)r‚   r�   rƒ   rŽ   r„   r�   r…   r�   r†   r+   r‡   r9   rˆ   r‘   r‰   r’   rŠ   r“   r‹   r9   rŒ   r”   r8   r_   )r8   r9   )r6   r,   r8   r,   )r­   r®   r¯   r9   r8   r°   )r8   r   )r†   r+   r8   r_   )r8   r¸   )r‰   r¸   r8   r_   )r8   r¹   )r‚   r    r8   r_   )r8   r,   )r6   r“   r8   r_   )r8   r   )r„   r#   r8   r_   )r8   r   )r…   r"   r8   r_   )r8   r-   )rƒ   r%   r8   r_   )rÇ   r´   r6   r“   rÂ   rÈ   rÃ   rÉ   rÄ   rÊ   rÅ   rË   rƒ   rŽ   r„   r�   r…   r�   r†   rÌ   rÆ   rÍ   r8   r   )r6   r“   r8   r,   ra   )r…   r�   r8   r�   )r„   r�   r8   r�   )rƒ   rŽ   r8   rŽ   )r‚   r�   r8   r¹   )r–   r   r‚   rà   r8   r   )r–   r   r\   r   r8   r   )r–   r   r\   r   r8   r´   )r–   r   r\   r   r8   r,   )r–   r   r6   r,   rÇ   r´   r8   r   )r–   r   rÇ   r´   r8   rù   )r–   r   r8   r_   )!rK   rL   rM   r   r   rh   Úpropertyr¤   r‹   r—   rµ   r†   Úsetterr‰   r‚   rŠ   r„   r…   rƒ   r0   rÔ   rÎ   rÐ   rÏ   rÑ   r™   rá   ræ   râ   rã   rä   rå   rú   rA   rA   rA   rB   r~   ¼   sŽ    ó"


ó
3
ÿ
ý




r~   c                      s  e Zd ZdZdddddddddddedeedddddœd|‡ fd-d.„Zdddddedfd}d0d1„Zdddddefd~d3d4„Z	dd7d8„Z
dddddddeeedd9œd€dJdK„Zedddddddeeedd9œd�dMdN„ƒZdeedOœd‚dSdT„ZdƒdXdY„Zd„dZd[„Zd…d\d]„Zdddeeedd^œd†d_d`„Zdddeeedd^œd‡dbdc„Zdddeeedd^œd‡ddde„Zdddddddeeedd9œdˆdfdg„Zdddddddeeedd9œdˆdhdi„Zdddddddeeedd9œdˆdjdk„Zdddeeedd^œd‡dldm„Zd‰dndo„ZdŠdrds„Z			d‹dŒdzd{„Z‡  ZS )�r2   av  
    An HTTP client, with connection pooling, HTTP/2, redirects, cookie persistence, etc.

    It can be shared between threads.

    Usage:

    ```python
    >>> client = httpx.Client()
    >>> response = client.get('https://example.org')
    ```

    **Parameters:**

    * **auth** - *(optional)* An authentication class to use when sending
    requests.
    * **params** - *(optional)* Query parameters to include in request URLs, as
    a string, dictionary, or sequence of two-tuples.
    * **headers** - *(optional)* Dictionary of HTTP headers to include when
    sending requests.
    * **cookies** - *(optional)* Dictionary of Cookie items to include when
    sending requests.
    * **verify** - *(optional)* Either `True` to use an SSL context with the
    default CA bundle, `False` to disable verification, or an instance of
    `ssl.SSLContext` to use a custom context.
    * **http2** - *(optional)* A boolean indicating if HTTP/2 support should be
    enabled. Defaults to `False`.
    * **proxy** - *(optional)* A proxy URL where all the traffic should be routed.
    * **timeout** - *(optional)* The timeout configuration to use when sending
    requests.
    * **limits** - *(optional)* The limits configuration to use.
    * **max_redirects** - *(optional)* The maximum number of redirect responses
    that should be followed.
    * **base_url** - *(optional)* A URL to use as the base when building
    request URLs.
    * **transport** - *(optional)* A transport class to use for sending requests
    over the network.
    * **trust_env** - *(optional)* Enables or disables usage of environment
    variables for configuration.
    * **default_encoding** - *(optional)* The default encoding to use for decoding
    response text, if no charset information is included in a response Content-Type
    header. Set to a callable for automatic character set detection. Default: "utf-8".
    NTFr   r€   )r‚   rƒ   r„   r…   ÚverifyÚcertr‹   Úhttp1Úhttp2r­   Úmountsr†   r‡   Úlimitsrˆ   r‰   rŠ   Ú	transportrŒ   r‚   r�   rƒ   rŽ   r„   r�   r…   r�   rý   ússl.SSLContext | str | boolrþ   úCertTypes | Noner‹   r9   rÿ   r   r­   r®   r  ú0None | typing.Mapping[str, BaseTransport | None]r†   r+   r‡   r  r   rˆ   r‘   r‰   r’   rŠ   r“   r  úBaseTransport | NonerŒ   r”   r8   r_   c                  sÜ   t ƒ j|||||||||ˆ|d� ˆr&zdd l}W n ty%   tdƒd ‚w ˆo+|d u }ˆ |
|¡}ˆjˆˆ ˆˆˆˆ|d�ˆ_‡ ‡‡‡‡‡‡fdd„| ¡ D ƒˆ_|d urbˆj 	dd„ | ¡ D ƒ¡ t
tˆj ¡ ƒƒˆ_d S )Nr�   r   úuUsing http2=True, but the 'h2' package is not installed. Make sure to install httpx using `pip install httpx[http2]`.©rý   rþ   r‹   rÿ   r   r  r  c                   ó:   i | ]\}}t |ƒ|d u rd nˆj|ˆˆ ˆˆˆˆd�“qS ©N)rý   rþ   r‹   rÿ   r   r  ©r.   Ú_init_proxy_transport©rP   rQ   r­   ©rþ   rÿ   r   r  rg   r‹   rý   rA   rB   r±   ¹  ó    õÿùýz#Client.__init__.<locals>.<dictcomp>c                 S  ó   i | ]	\}}t |ƒ|“qS rA   ©r.   ©rP   rQ   r  rA   rA   rB   r±   É  ó    ©Úsuperrh   Úh2ÚImportErrorrµ   Ú_init_transportÚ
_transportr²   Ú_mountsrÁ   rÒ   Úsorted)rg   r‚   rƒ   r„   r…   rý   rþ   r‹   rÿ   r   r­   r  r†   r‡   r  rˆ   r‰   rŠ   r  rŒ   r  r¯   Ú	proxy_map©Ú	__class__r  rB   rh     sT   õÿýÿù	ôÿzClient.__init__r   c                 C  ó    |d ur|S t ||||||d�S r  ©r   ©rg   rý   rþ   r‹   rÿ   r   r  r  rA   rA   rB   r  Î  ó   
úzClient._init_transportr   c              	   C  ó   t |||||||d�S ©N)rý   rþ   r‹   rÿ   r   r  r­   r!  ©rg   r­   rý   rþ   r‹   rÿ   r   r  rA   rA   rB   r  ä  ó   
ùzClient._init_proxy_transportr6   r,   c                 C  ó>   | j  ¡ D ]\}}| |¡r|du r| j  S |  S q| jS ©z›
        Returns the transport instance that should be used for a given URL.
        This will either be the standard connection pool, or a proxy.
        N©r  r²   Úmatchesr  ©rg   r6   Úpatternr  rA   rA   rB   Ú_transport_for_urlø  ó
   
ÿzClient._transport_for_url©rÂ   rÃ   rÄ   rÅ   rƒ   r„   r…   r‚   r‡   r†   rÆ   rÇ   r´   rÂ   rÈ   rÃ   rÉ   rÄ   rÊ   rÅ   rË   rà   úbool | UseClientDefaultrÌ   rÆ   rÍ   r   c                C  sL   |	durd}t j|tdd� | j|||||||||	||d�}| j||
|d�S )a©  
        Build and send a request.

        Equivalent to:

        ```python
        request = client.build_request(...)
        response = client.send(request, ...)
        ```

        See `Client.build_request()`, `Client.send()` and
        [Merging of configuration][0] for how the various parameters
        are merged with client-level configuration.

        [0]: /advanced/clients/#merging-of-configuration
        Nú®Setting per-request cookies=<...> is being deprecated, because the expected behaviour on cookie persistence is ambiguous. Set cookies directly on the client instance instead.rT   ©Ú
stacklevel©rÇ   r6   rÂ   rÃ   rÄ   rÅ   rƒ   r„   r…   r†   rÆ   ©r‚   r‡   ©ÚwarningsÚwarnÚDeprecationWarningrÔ   Úsend©rg   rÇ   r6   rÂ   rÃ   rÄ   rÅ   rƒ   r„   r…   r‚   r‡   r†   rÆ   Úmessager–   rA   rA   rB   r–     s$   !ÿõzClient.requestútyping.Iterator[Response]c                c  sT   � | j |||||||||	||d�}| j||
|dd�}z
|V  W | ¡  dS | ¡  w ©a  
        Alternative to `httpx.request()` that streams the response body
        instead of loading it into memory at once.

        **Parameters**: See `httpx.request`.

        See also: [Streaming Responses][0]

        [0]: /quickstart#streaming-responses
        r5  T)r–   r‚   r‡   r[   N)rÔ   r;  rv   ©rg   rÇ   r6   rÂ   rÃ   rÄ   rÅ   rƒ   r„   r…   r‚   r‡   r†   rÆ   r–   r\   rA   rA   rB   r[   ;  s.   €õüzClient.stream©r[   r‚   r‡   r–   r   r[   c             
   C  s�   | j tjkr
tdƒ‚tj| _ t|tƒr| jn|}|  |¡ |  	||¡}| j
|||g d�}z	|s3| ¡  |W S  tyG } z| ¡  |‚d}~ww )a‹  
        Send a request.

        The request is sent as-is, unmodified.

        Typically you'll want to build one with `Client.build_request()`
        so that any client-level configuration is merged into the request,
        but passing an explicit `httpx.Request()` is supported as well.

        See also: [Request instances][0]

        [0]: /advanced/clients/#request-instances
        ú5Cannot send a request, as the client has been closed.©r‚   r‡   ÚhistoryN)r¢   rS   rX   ÚRuntimeErrorrW   r³   rJ   r‡   rú   rá   Ú_send_handling_authÚreadÚBaseExceptionrv   ©rg   r–   r[   r‚   r‡   r\   rò   rA   rA   rB   r;  o  s0   ÿý
ü€þzClient.sendr   rD  úlist[Response]c           	   
   C  s®   |  |¡}zLt|ƒ}	 | j|||d�}z+z| |¡}W n ty,   | Y W W | ¡  S w t|ƒ|_| ¡  |}| 	|¡ W n t
yP } z| ¡  |‚d }~ww q| ¡  w ©NT)r‡   rD  )Zsync_auth_flowÚnextÚ_send_handling_redirectsr;  ÚStopIterationrv   rž   rD  rG  ÚappendrH  ©	rg   r–   r‚   r‡   rD  Z	auth_flowr\   Únext_requestrò   rA   rA   rB   rF  ¢  s6   
ý

ô
€þï
zClient._send_handling_authc              
   C  sÈ   	 t |ƒ| jkrtd|d�‚| jd D ]}||ƒ q|  |¡}z1| jd D ]}||ƒ q%t|ƒ|_|js7|W S |  ||¡}||g }|rI| 	¡  n||_
|W S W n tyb } z| ¡  |‚d }~ww q©NTz#Exceeded maximum allowed redirects.rï   r–   r\   )Úlenrˆ   r   rŸ   Ú_send_single_requestrž   rD  Úhas_redirect_locationræ   rG  rQ  rH  rv   ©rg   r–   r‡   rD  Úhookr\   rò   rA   rA   rB   rM  Ä  s6   ÿ





ý€þåzClient._send_handling_redirectsc                 C  sº   |   |j¡}t ¡ }t|jtƒstdƒ‚t|d�� | 	|¡}W d  ƒ n1 s)w   Y  t|jtƒs6J ‚||_
t|j||d�|_| j |¡ | j|_t d|j|j|j|j|j¡ |S )úL
        Sends a single request, without handling any redirections.
        z?Attempted to send an async request with a sync Client instance.rï   N©r\   r]   úHTTP Request: %s %s "%s %d %s")r.  r6   rq   rr   r³   r[   r*   rE  r   Úhandle_requestr–   rZ   r…   Úextract_cookiesr¡   rŒ   ÚloggerÚinforÇ   Úhttp_versionrê   Úreason_phrase©rg   r–   r  r]   r\   rA   rA   rB   rT  é  s2   ÿÿÿú	zClient._send_single_request©rƒ   r„   r…   r‚   r‡   r†   rÆ   c          	      C  ó   | j d||||||||d�	S ©zU
        Send a `GET` request.

        **Parameters**: See `httpx.request`.
        rè   rb  Nrï   ©	rg   r6   rƒ   r„   r…   r‚   r‡   r†   rÆ   rA   rA   rB   rF     ó   ÷z
Client.getúAuthTypes | UseClientDefaultc          	      C  rc  ©zZ
        Send an `OPTIONS` request.

        **Parameters**: See `httpx.request`.
        ÚOPTIONSrb  Nrï   re  rA   rA   rB   Úoptions)  rf  zClient.optionsc          	      C  rc  ©zV
        Send a `HEAD` request.

        **Parameters**: See `httpx.request`.
        rç   rb  Nrï   re  rA   rA   rB   ÚheadF  rf  zClient.headc                C  ó$   | j d|||||||||	|
||d�S ©zV
        Send a `POST` request.

        **Parameters**: See `httpx.request`.
        ré   r0  Nrï   ©rg   r6   rÂ   rÃ   rÄ   rÅ   rƒ   r„   r…   r‚   r‡   r†   rÆ   rA   rA   rB   Úpostc  ó   ózClient.postc                C  rm  ©zU
        Send a `PUT` request.

        **Parameters**: See `httpx.request`.
        ÚPUTr0  Nrï   ro  rA   rA   rB   Úputˆ  rq  z
Client.putc                C  rm  ©zW
        Send a `PATCH` request.

        **Parameters**: See `httpx.request`.
        ÚPATCHr0  Nrï   ro  rA   rA   rB   Úpatch­  rq  zClient.patchc          	      C  rc  ©zX
        Send a `DELETE` request.

        **Parameters**: See `httpx.request`.
        ÚDELETErb  Nrï   re  rA   rA   rB   ÚdeleteÒ  rf  zClient.deletec                 C  sF   | j tjkrtj| _ | j ¡  | j ¡ D ]}|dur| ¡  qdS dS ©z.
        Close transport and proxies.
        N)r¢   rS   rX   r  rv   r  Úvalues)rg   r  rA   rA   rB   rv   ï  s   
€úzClient.closerg   r3   c                 C  s`   | j tjkrtjdtjdi| j  }t|ƒ‚tj| _ | j ¡  | j 	¡ D ]
}|d ur-| ¡  q#| S ©Nz-Cannot open a client instance more than once.z9Cannot reopen a client instance, once it has been closed.)
r¢   rS   rV   rW   rX   rE  r  Ú	__enter__r  r|  )rg   Úmsgr  rA   rA   rB   r~  û  s   ýû
€zClient.__enter__Úexc_typeútype[BaseException] | NoneÚ	exc_valueúBaseException | NoneÚ	tracebackúTracebackType | Nonec                 C  sB   t j| _| j |||¡ | j ¡ D ]}|d ur| |||¡ qd S ra   )rS   rX   r¢   r  Ú__exit__r  r|  )rg   r€  r‚  r„  r  rA   rA   rB   r†    s   €þzClient.__exit__)(r‚   r�   rƒ   rŽ   r„   r�   r…   r�   rý   r  rþ   r  r‹   r9   rÿ   r9   r   r9   r­   r®   r  r  r†   r+   r‡   r9   r  r   rˆ   r‘   r‰   r’   rŠ   r“   r  r  rŒ   r”   r8   r_   )rý   r  rþ   r  r‹   r9   rÿ   r9   r   r9   r  r   r  r  r8   r   )r­   r   rý   r  rþ   r  r‹   r9   rÿ   r9   r   r9   r  r   r8   r   )r6   r,   r8   r   ©rÇ   r´   r6   r“   rÂ   rÈ   rÃ   rÉ   rÄ   rÊ   rÅ   rË   rƒ   rŽ   r„   r�   r…   r�   r‚   rà   r‡   r1  r†   rÌ   rÆ   rÍ   r8   r   )rÇ   r´   r6   r“   rÂ   rÈ   rÃ   rÉ   rÄ   rÊ   rÅ   rË   rƒ   rŽ   r„   r�   r…   r�   r‚   rà   r‡   r1  r†   rÌ   rÆ   rÍ   r8   r>  ©
r–   r   r[   r9   r‚   rà   r‡   r1  r8   r   ©
r–   r   r‚   r   r‡   r9   rD  rJ  r8   r   ©r–   r   r‡   r9   rD  rJ  r8   r   ©r–   r   r8   r   ©r6   r“   rƒ   rŽ   r„   r�   r…   r�   r‚   rà   r‡   r1  r†   rÌ   rÆ   rÍ   r8   r   ©r6   r“   rƒ   rŽ   r„   r�   r…   r�   r‚   rg  r‡   r1  r†   rÌ   rÆ   rÍ   r8   r   ©r6   r“   rÂ   rÈ   rÃ   rÉ   rÄ   rÊ   rÅ   rË   rƒ   rŽ   r„   r�   r…   r�   r‚   rg  r‡   r1  r†   rÌ   rÆ   rÍ   r8   r   rx   )rg   r3   r8   r3   ©NNN©r€  r�  r‚  rƒ  r„  r…  r8   r_   )rK   rL   rM   rN   r   r   r   rh   r  r  r.  r0   r–   r   r[   r;  rF  rM  rT  rF   rj  rl  rp  rt  rw  rz  rv   r~  r†  Ú__classcell__rA   rA   r  rB   r2   R  s    /ëQøø
ñ8ñ7ú
3
"
%'ö!ö!ö!ò)ò)ò)ö

üc                      s  e Zd ZdZddddddddddedeeddddddœd|‡ fd-d.„Zdddddedfd}d0d1„Zdddddefd~d3d4„Z	dd7d8„Z
dddddddeeedd9œd€dJdK„Zedddddddeeedd9œd�dMdN„ƒZdeedOœd‚dSdT„ZdƒdXdY„Zd„dZd[„Zd…d\d]„Zdddeeedd^œd†d_d`„Zdddeeedd^œd‡dbdc„Zdddeeedd^œd‡ddde„Zdddddddeeedd9œdˆdfdg„Zdddddddeeedd9œdˆdhdi„Zdddddddeeedd9œdˆdjdk„Zdddeeedd^œd‡dldm„Zd‰dndo„ZdŠdrds„Z			d‹dŒdzd{„Z‡  ZS )�r1   a¡  
    An asynchronous HTTP client, with connection pooling, HTTP/2, redirects,
    cookie persistence, etc.

    It can be shared between tasks.

    Usage:

    ```python
    >>> async with httpx.AsyncClient() as client:
    >>>     response = await client.get('https://example.org')
    ```

    **Parameters:**

    * **auth** - *(optional)* An authentication class to use when sending
    requests.
    * **params** - *(optional)* Query parameters to include in request URLs, as
    a string, dictionary, or sequence of two-tuples.
    * **headers** - *(optional)* Dictionary of HTTP headers to include when
    sending requests.
    * **cookies** - *(optional)* Dictionary of Cookie items to include when
    sending requests.
    * **verify** - *(optional)* Either `True` to use an SSL context with the
    default CA bundle, `False` to disable verification, or an instance of
    `ssl.SSLContext` to use a custom context.
    * **http2** - *(optional)* A boolean indicating if HTTP/2 support should be
    enabled. Defaults to `False`.
    * **proxy** - *(optional)* A proxy URL where all the traffic should be routed.
    * **timeout** - *(optional)* The timeout configuration to use when sending
    requests.
    * **limits** - *(optional)* The limits configuration to use.
    * **max_redirects** - *(optional)* The maximum number of redirect responses
    that should be followed.
    * **base_url** - *(optional)* A URL to use as the base when building
    request URLs.
    * **transport** - *(optional)* A transport class to use for sending requests
    over the network.
    * **trust_env** - *(optional)* Enables or disables usage of environment
    variables for configuration.
    * **default_encoding** - *(optional)* The default encoding to use for decoding
    response text, if no charset information is included in a response Content-Type
    header. Set to a callable for automatic character set detection. Default: "utf-8".
    NTFr   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�   rý   r  rþ   r  rÿ   r9   r   r­   r®   r  ú5None | typing.Mapping[str, AsyncBaseTransport | None]r†   r+   r‡   r  r   rˆ   r‘   r‰   r’   rŠ   r“   r  úAsyncBaseTransport | Noner‹   rŒ   r”   r8   r_   c                  sÜ   t ƒ j|||||||||ˆ|d� ˆr&zdd l}W n ty%   tdƒd ‚w ˆo+|d u }ˆ |	|¡}ˆjˆˆ ˆˆˆˆ|d�ˆ_‡ ‡‡‡‡‡‡fdd„| ¡ D ƒˆ_|
d urbˆj 	dd„ |
 ¡ D ƒ¡ t
tˆj ¡ ƒƒˆ_d S )Nr�   r   r  r	  c                   r
  r  r  r  r  rA   rB   r±   „  r  z(AsyncClient.__init__.<locals>.<dictcomp>c                 S  r  rA   r  r  rA   rA   rB   r±   ”  r  r  )rg   r‚   rƒ   r„   r…   rý   rþ   rÿ   r   r­   r  r†   r‡   r  rˆ   r‰   rŠ   r  r‹   rŒ   r  r¯   r  r  r  rB   rh   I  sT   õÿýÿù
ôÿzAsyncClient.__init__r   c                 C  r   r  ©r   r"  rA   rA   rB   r  ˜  r#  zAsyncClient._init_transportr   c              	   C  r$  r%  r”  r&  rA   rA   rB   r  ®  r'  z!AsyncClient._init_proxy_transportr6   r,   c                 C  r(  r)  r*  r,  rA   rA   rB   r.  Â  r/  zAsyncClient._transport_for_urlr0  rÇ   r´   rÂ   rÈ   rÃ   rÉ   rÄ   rÊ   rÅ   rË   rà   r1  rÌ   rÆ   rÍ   r   c                Ã  sT   �|	durd}t j|tdd� | j|||||||||	||d�}| j||
|d�I dH S )a¹  
        Build and send a request.

        Equivalent to:

        ```python
        request = client.build_request(...)
        response = await client.send(request, ...)
        ```

        See `AsyncClient.build_request()`, `AsyncClient.send()`
        and [Merging of configuration][0] for how the various parameters
        are merged with client-level configuration.

        [0]: /advanced/clients/#merging-of-configuration
        Nr2  rT   r3  r5  r6  r7  r<  rA   rA   rB   r–   Í  s&   €"ÿõzAsyncClient.requestútyping.AsyncIterator[Response]c                C sf   �| j |||||||||	||d�}| j||
|dd�I dH }z|V  W | ¡ I dH  dS | ¡ I dH  w r?  )rÔ   r;  r}   r@  rA   rA   rB   r[     s.   €õü"zAsyncClient.streamrA  r–   r   r[   c             
   Ã  s¤   �| j tjkrtdƒ‚tj| _ t|tƒr| jn|}|  |¡ |  	||¡}| j
|||g d�I dH }z|s:| ¡ I dH  |W S  tyQ } z	| ¡ I dH  |‚d}~ww )a�  
        Send a request.

        The request is sent as-is, unmodified.

        Typically you'll want to build one with `AsyncClient.build_request()`
        so that any client-level configuration is merged into the request,
        but passing an explicit `httpx.Request()` is supported as well.

        See also: [Request instances][0]

        [0]: /advanced/clients/#request-instances
        rB  rC  N)r¢   rS   rX   rE  rW   r³   rJ   r‡   rú   rá   rF  ÚareadrH  r}   rI  rA   rA   rB   r;  :  s2   €ÿý
ü€þzAsyncClient.sendr   rD  rJ  c           	   
   Ã  sÚ   �|  |¡}z^| ¡ I d H }	 | j|||d�I d H }z4z
| |¡I d H }W n ty9   | Y W W | ¡ I d H  S w t|ƒ|_| ¡ I d H  |}| 	|¡ W n t
yc } z	| ¡ I d H  |‚d }~ww q| ¡ I d H  w rK  )Zasync_auth_flowÚ	__anext__rM  ÚasendÚStopAsyncIterationr}   rž   rD  r–  rO  rH  rP  rA   rA   rB   rF  m  s8   €
ý
ô
€þïzAsyncClient._send_handling_authc              
   Ã  sè   �	 t |ƒ| jkrtd|d�‚| jd D ]	}||ƒI d H  q|  |¡I d H }z7| jd D ]	}||ƒI d H  q,t|ƒ|_|jsA|W S |  ||¡}||g }|rV| 	¡ I d H  n||_
|W S W n tyr } z	| ¡ I d H  |‚d }~ww qrR  )rS  rˆ   r   rŸ   rT  rž   rD  rU  ræ   r–  rQ  rH  r}   rV  rA   rA   rB   rM  �  s8   €ÿ

ý€þäz$AsyncClient._send_handling_redirectsc                 Ã  sÂ   �|   |j¡}t ¡ }t|jtƒstdƒ‚t|d�� | 	|¡I dH }W d  ƒ n1 s-w   Y  t|jtƒs:J ‚||_
t|j||d�|_| j |¡ | j|_t d|j|j|j|j|j¡ |S )rX  z?Attempted to send an sync request with an AsyncClient instance.rï   NrY  rZ  )r.  r6   rq   rr   r³   r[   r   rE  r   Zhandle_async_requestr–   rz   r…   r\  r¡   rŒ   r]  r^  rÇ   r_  rê   r`  ra  rA   rA   rB   rT  µ  s4   €ÿÿÿú	z AsyncClient._send_single_requestrb  c          	      Ã  ó$   �| j d||||||||d�	I dH S rd  rï   re  rA   rA   rB   rF   ×  ó   €÷zAsyncClient.getrg  c          	      Ã  rš  rh  rï   re  rA   rA   rB   rj  ô  r›  zAsyncClient.optionsc          	      Ã  rš  rk  rï   re  rA   rA   rB   rl    r›  zAsyncClient.headc                Ã  ó,   �| j d|||||||||	|
||d�I dH S rn  rï   ro  rA   rA   rB   rp  .  ó    €ózAsyncClient.postc                Ã  rœ  rr  rï   ro  rA   rA   rB   rt  S  r�  zAsyncClient.putc                Ã  rœ  ru  rï   ro  rA   rA   rB   rw  x  r�  zAsyncClient.patchc          	      Ã  rš  rx  rï   re  rA   rA   rB   rz  �  r›  zAsyncClient.deletec                 Ã  sT   �| j tjkr&tj| _ | j ¡ I dH  | j ¡ D ]}|dur%| ¡ I dH  qdS dS r{  )r¢   rS   rX   r  r}   r  r|  )rg   r­   rA   rA   rB   r}   º  s   €€úzAsyncClient.acloserg   r5   c                 Ã  sn   �| j tjkrtjdtjdi| j  }t|ƒ‚tj| _ | j ¡ I d H  | j 	¡ D ]}|d ur4| ¡ I d H  q'| S r}  )
r¢   rS   rV   rW   rX   rE  r  Ú
__aenter__r  r|  )rg   r  r­   rA   rA   rB   rž  Æ  s    €ýû€zAsyncClient.__aenter__r€  r�  r‚  rƒ  r„  r…  c                 Ã  sP   �t j| _| j |||¡I d H  | j ¡ D ]}|d ur%| |||¡I d H  qd S ra   )rS   rX   r¢   r  Ú	__aexit__r  r|  )rg   r€  r‚  r„  r­   rA   rA   rB   rŸ  Ø  s   €€þzAsyncClient.__aexit__)(r‚   r�   rƒ   rŽ   r„   r�   r…   r�   rý   r  rþ   r  rÿ   r9   r   r9   r­   r®   r  r’  r†   r+   r‡   r9   r  r   rˆ   r‘   r‰   r’   rŠ   r“   r  r“  r‹   r9   rŒ   r”   r8   r_   )rý   r  rþ   r  r‹   r9   rÿ   r9   r   r9   r  r   r  r“  r8   r   )r­   r   rý   r  rþ   r  r‹   r9   rÿ   r9   r   r9   r  r   r8   r   )r6   r,   r8   r   r‡  )rÇ   r´   r6   r“   rÂ   rÈ   rÃ   rÉ   rÄ   rÊ   rÅ   rË   rƒ   rŽ   r„   r�   r…   r�   r‚   rà   r‡   r1  r†   rÌ   rÆ   rÍ   r8   r•  rˆ  r‰  rŠ  r‹  rŒ  r�  rŽ  rx   )rg   r5   r8   r5   r�  r�  )rK   rL   rM   rN   r   r   r   rh   r  r  r.  r0   r–   r   r[   r;  rF  rM  rT  rF   rj  rl  rp  rt  rw  rz  r}   rž  rŸ  r‘  rA   rA   r  rB   r1     s    0ëQøø
ñ9ñ7ú
3
"
&&ö!ö!ö!ò)ò)ò)ö

ü)r6   r,   r7   r,   r8   r9   )r6   r,   r8   rD   )r6   r,   rH   r,   r8   r9   )\Ú
__future__r   rs   ÚenumÚloggingrq   Útypingr8  Ú
contextlibr   r   Útypesr   r   rš   r   r	   r
   Ú_configr   r   r   r   r   r   Ú	_decodersr   Ú_exceptionsr   r   r   r   Z_modelsr   r   r   r   Z_status_codesr   Z_transports.baser   r   Z_transports.defaultr   r   Ú_typesr   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   Z_urlsr,   r-   Ú_utilsr.   r/   ÚTYPE_CHECKINGÚsslÚ__all__ÚTypeVarr3   r5   rC   r@   rI   rJ   r0   Ú	getLoggerr]  rÀ   rñ   Úkeysr¾   ÚEnumrS   rZ   rz   ÚCallableÚAnyZ	EventHookr~   r2   r1   rA   rA   rA   rB   Ú<module>   sf     <




ÿ        N