o
    it                  
   @   s  U d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dl
mZmZmZmZmZmZmZmZmZmZmZmZ d dlmZ d dlZd dlmZmZmZmZmZ d dl m!Z! ddl"m#Z# dd	l$m%Z% dd
l&m'Z' ddl(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 ddl4m5Z5 ddl6m7Z7 ddl8m9Z9m:Z: ddl;m<Z<m=Z= ddl>m?Z?m@Z@mAZAmBZBmCZC ddlDmEZE ddlFmGZG dZHerddlImJZJ ddlKmLZL ddlMmNZN ejOddddG dd dZPejQejR d ZSeeT eUd< deS dZVeeT eUd< d Wd!Xd"d# d$eYeZd%d& D Z[eeT eUd'< d(Z\eeT eUd)< d*jWe[e\d+Z]eeT eUd,< d-jWeVe]d.Z^eeT eUd/< e_d0Z`eeeT  eUd1< e_e^ZaeeeT  eUd2< G d3d4 d4eeTef e/ZbG d5d6 d6ebZcdS )7    N)MappingProxyType)TYPE_CHECKINGAnyDictFinalIteratorMappingMutableMappingOptionalPatternTupleUnioncast)	parse_qsl)CIMultiDictCIMultiDictProxy	MultiDictMultiDictProxyMultiMapping)URL   )hdrs)parse_cookie_header)AbstractStreamWriter)	_SENTINELDEBUGETAG_ANYLIST_QUOTED_ETAG_REChainMapProxyETagHeadersMixinparse_http_datereifysentinelset_exception)RawRequestMessage)HttpVersion)BodyPartReaderMultipartReader)EmptyStreamReaderStreamReader)DEFAULT_JSON_DECODERJSONDecoderLooseHeaders
RawHeadersStrOrURL)HTTPRequestEntityTooLarge)StreamResponse)BaseRequest	FileFieldRequest)Application)RequestHandler)UrlMappingMatchInfoT)Zauto_attribsfrozenslotsc                   @   s<   e Zd ZU eed< eed< ejed< eed< ee ed< dS )r3   namefilenamefilecontent_typeheadersN)__name__
__module____qualname__str__annotations__ioBufferedReaderr    rF   rF   M/home/kim/smarthome/.venv/lib/python3.10/site-packages/aiohttp/web_request.pyr3   L   s   
 
r3   z!#$%&'*+.^_`|~-_TCHAR[z]+_TOKENz[{}] c                 c   s    | ]}t |V  qd S N)chr).0crF   rF   rG   	<genexpr>[   s    rP   )	       !   #      _QDTEXTz
\\[\t !-~]_QUOTED_PAIRz"(?:{quoted_pair}|{qdtext})*")ZqdtextZquoted_pair_QUOTED_STRINGz0({token})=({token}|{quoted_string})(:\d{{1,4}})?)tokenZquoted_string_FORWARDED_PAIRz\\([\t !-~])_QUOTED_PAIR_REPLACE_RE_FORWARDED_PAIR_REc                   @   s\  e Zd ZU ejejejejejhZ	e
jeg dB ZdZeeeeeef   ed< dZee ed< dddddddeded	d
dedddejdedeeeef  dee dee dee ddfddZeeeeeeeddeee f dee!e f dee"e f deee f deee f deee f deee f dd fddZ#e$dddZ%e$ddd Z&e$deej' 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fd+d,Z/d-edefd.d/Z0d-ed0eddfd1d2Z1d-eddfd3d4Z2defd5d6Z3de4e fd7d8Z5e+de6fd9d:Z7e+de8e9eef d;f fd<d=Z:e+defd>d?Z;e+defd@dAZ<e+de=fdBdCZ>e+defdDdEZ?e+dee fdFdGZ@e+de-fdHdIZAe+defdJdKZBe+defdLdMZCe+defdNdOZDe+ddQdRZEe+defdSdTZFe+deGe fdUdVZHe+deIfdWdXZJe+deeKjK fdYdZZLe+deeKjK fd[d\ZMeNd]ede4eO fd^d_ZPeQd`ee dee8eOd;f  fdadbZRe+dee8eOd;f  fdcddZSe+dee8eOd;f  fdedfZTe+deeKjK fdgdhZUe+de6fdidjZVe+de9eef fdkdlZWe+deXfdmdnZYe+defdodpZZe$de6fdqdrZ[e$de6fdsdtZ\e+de6fdudvZ]ddwdxZ^defdydzZ_defd{d|Z`ead}d~ebdefddZcdedfddZedddZfddededefddZgdefddZhdeide6fddZjde6fddZkdelddfddZmdenddfddZodddZpdS )r2   )_message	_protocol_payload_writer_payload_headers_method_version_rel_url_post_read_bytes_state_cache_task_client_max_size_loop_transport_sslcontext_transport_peernameNre   rf   i   )client_max_sizestateschemehostremotemessagepayloadprotocolr6   payload_writertaskasyncio.Task[None]looprn   ro   rp   rq   rr   returnc                C   s  || _ || _|| _|| _|j| _|j| _|j| _	i | _
|j}|jrJ|	d ur*||	}|
d ur3||
}|| j
d< |j| j
d< |j| j
d< | | _n|| _|	d urV|	| j
d< |
d ur_|
| j
d< |d u rei n|| _|| _|| _|| _|j| _|j| _|d ur|| j
d< d S d S )Nurlrq   rp   rr   )r]   r^   r_   r`   r>   ra   methodrb   versionrc   rh   r{   absoluteZwith_schemeZ	with_hostrq   rp   relativerd   rg   ri   rj   rk   ssl_contextrl   Zpeernamerm   )selfrs   rt   ru   rv   rw   ry   rn   ro   rp   rq   rr   r{   rF   rF   rG   __init__   s@   




zBaseRequest.__init__r|   rel_urlr>   rp   rq   rr   rn   r|   r   r>   c                C   s  | j rtdi }|tur||d< |tur#t|}	|	|d< t|	|d< |tur>tt||d< tdd |d  D |d< | j	j
di |}
i }|turQ||d	< |turY||d
< |tura||d< |tu rh| j}| j|
| j| j| j| j| jf|| j d|S )a  Clone itself with replacement some attributes.

        Creates and returns a new instance of Request object. If no parameters
        are given, an exact copy is returned. If a parameter is not passed, it
        will reuse the one from the current request object.
        z.Cannot clone request after reading its contentr|   r{   pathr>   c                 s   s(    | ]\}}| d | d fV  qdS )utf-8N)encode)rN   kvrF   rF   rG   rP      s
    
z$BaseRequest.clone.<locals>.<genexpr>raw_headersrp   rq   rr   )rn   ro   NrF   )rf   RuntimeErrorr#   r   rB   r   r   tupleitemsr]   _replacerj   	__class__r`   r^   r_   ri   rk   rg   copy)r   r|   r   r>   rp   rq   rr   rn   dctnew_urlrs   kwargsrF   rF   rG   clone   sJ   
	zBaseRequest.clonec                 C      | j S rL   )ri   r   rF   rF   rG   rw   
     zBaseRequest.taskc                 C   r   rL   )r^   r   rF   rF   rG   ru     r   zBaseRequest.protocolc                 C   s   | j d u rd S | j jS rL   )r^   	transportr   rF   rF   rG   r     s   
zBaseRequest.transportc                 C   r   rL   )r_   r   rF   rF   rG   writer  r   zBaseRequest.writerc                 C   r   rL   )rj   r   rF   rF   rG   rn     r   zBaseRequest.client_max_sizec                 C      t jdtdd | jS )NzRequest.message is deprecated   
stacklevel)warningswarnDeprecationWarningr]   r   rF   rF   rG   rs      s   zBaseRequest.messagec                 C   r   rL   )rd   r   rF   rF   rG   r   %  r   zBaseRequest.rel_urlc                 C   r   )Nz#request.loop property is deprecated   r   )r   r   r   rk   r   rF   rF   rG   ry   )  s   zBaseRequest.loopkeyc                 C   s
   | j | S rL   rg   r   r   rF   rF   rG   __getitem__2     
zBaseRequest.__getitem__valuec                 C   s   || j |< d S rL   r   )r   r   r   rF   rF   rG   __setitem__5  s   zBaseRequest.__setitem__c                 C   s   | j |= d S rL   r   r   rF   rF   rG   __delitem__8  s   zBaseRequest.__delitem__c                 C   
   t | jS rL   )lenrg   r   rF   rF   rG   __len__;  r   zBaseRequest.__len__c                 C   r   rL   )iterrg   r   rF   rF   rG   __iter__>  r   zBaseRequest.__iter__c                 C   s
   | j dkS )z5A bool indicating if the request is handled with SSL.https)rp   r   rF   rF   rG   secureC     
zBaseRequest.secure.c                 C   sd  g }| j jtjdD ]}t|}d}d}i }|t| d|  kr)|k rn qt	
||}|durm|r>|d|}nd| \}}	}
|	d dkrUtd|	dd	 }	|
r[|	|
7 }	|	|| < |t|d7 }d
}n5|| dkrd}i }|t| |d7 }n|| dkrd}|d7 }n|| dv r|d7 }n|d|}d|  kr|k s+q qt|S )a  A tuple containing all parsed Forwarded header(s).

        Makes an effort to parse Forwarded headers as specified by RFC 7239:

        - It adds one (immutable) dictionary per Forwarded 'field-value', ie
          per proxy. The element corresponds to the data in the Forwarded
          field-value added by the first proxy encountered by the client. Each
          subsequent item corresponds to those added by later proxies.
        - It checks that every value has valid syntax in general as specified
          in section 4: either a 'token' or a 'quoted-string'.
        - It un-escapes found escape sequences.
        - It does NOT validate 'by' and 'for' contents as specified in section
          6.
        - It does NOT validate 'host' contents (Host ABNF).
        - It does NOT validate 'proto' contents for valid URI scheme names.

        Returns a tuple containing one or more immutable dicts
        rF   r   FN,"z\1r   T;z 	)r]   r>   Zgetallr   Z	FORWARDEDr   appendtypesr   r\   matchfindgroupsr[   sublowergroupr   )r   ZelemsZfield_valuelengthposZneed_separatorelemr   r:   r   portrF   rF   rG   	forwardedH  sD   


 zBaseRequest.forwardedc                 C   s   | j rdS dS )a  A string representing the scheme of the request.

        Hostname is resolved in this order:

        - overridden value by .clone(scheme=new_scheme) call.
        - type of connection to peer: HTTPS if socket is SSL, HTTP otherwise.

        'http' or 'https'.
        r   http)rl   r   rF   rF   rG   rp     s   zBaseRequest.schemec                 C   r   )zyRead only property for getting HTTP method.

        The value is upper-cased str like 'GET', 'POST', 'PUT' etc.
        )rb   r   rF   rF   rG   r|        zBaseRequest.methodc                 C   r   )zxRead only property for getting HTTP version of request.

        Returns aiohttp.protocol.HttpVersion instance.
        )rc   r   rF   rF   rG   r}     r   zBaseRequest.versionc                 C   s$   | j jtj}|dur|S t S )a@  Hostname of the request.

        Hostname is resolved in this order:

        - overridden value by .clone(host=new_host) call.
        - HOST HTTP header
        - socket.getfqdn() value

        For example, 'example.com' or 'localhost:8080'.

        For historical reasons, the port number may be included.
        N)r]   r>   getr   ZHOSTsocketgetfqdn)r   rq   rF   rF   rG   rq     s   zBaseRequest.hostc                 C   s6   | j du rdS t| j ttfrt| j d S t| j S )zRemote IP of client initiated HTTP request.

        The IP is resolved in this order:

        - overridden value by .clone(remote=new_remote) call.
        - peername of opened socket
        Nr   )rm   
isinstancelistr   rB   r   rF   rF   rG   rr     s
   
	
zBaseRequest.remotec                 C   s   t j| j| jd| jS )zThe full URL of the request.)rp   	authority)r   buildrp   rq   joinrd   r   rF   rF   rG   r{     s   zBaseRequest.urlc                 C      | j jS )z_The URL including *PATH INFO* without the host or scheme.

        E.g., ``/app/blog``
        )rd   r   r   rF   rF   rG   r        zBaseRequest.pathc                 C   r   )zXThe URL including PATH_INFO and the query string.

        E.g, /app/blog?id=10
        )rB   rd   r   rF   rF   rG   path_qs  s   
zBaseRequest.path_qsc                 C   r   )zThe URL including raw *PATH INFO* without the host or scheme.

        Warning, the path is unquoted and may contains non valid URL characters

        E.g., ``/my%2Fpath%7Cwith%21some%25strange%24characters``
        )r]   r   r   rF   rF   rG   raw_path  s   zBaseRequest.raw_pathMultiMapping[str]c                 C   r   )z7A multidict with all the variables in the query string.)rd   queryr   rF   rF   rG   r        zBaseRequest.queryc                 C   r   )z:The query string in the URL.

        E.g., id=10
        )rd   query_stringr   rF   rF   rG   r     r   zBaseRequest.query_stringc                 C   r   )z4A case-insensitive multidict proxy with all headers.)ra   r   rF   rF   rG   r>        zBaseRequest.headersc                 C   r   )z$A sequence of pairs for all headers.)r]   r   r   rF   rF   rG   r     r   zBaseRequest.raw_headersc                 C      t | jtjS )zyThe value of If-Modified-Since HTTP header, or None.

        This header is represented as a `datetime` object.
        )r!   r>   r   r   ZIF_MODIFIED_SINCEr   rF   rF   rG   if_modified_since     zBaseRequest.if_modified_sincec                 C   r   )z{The value of If-Unmodified-Since HTTP header, or None.

        This header is represented as a `datetime` object.
        )r!   r>   r   r   ZIF_UNMODIFIED_SINCEr   rF   rF   rG   if_unmodified_since  r   zBaseRequest.if_unmodified_sinceetag_headerc                 c   s`    | t krtdt dV  dS t| D ]}|ddd\}}}|r$ dS tt||dV  qdS )z'Extract `ETag` objects from raw header.F)is_weakr   r   r      N)r   r   r   finditerr   bool)r   r   r   r   garbagerF   rF   rG   _etag_values  s   
zBaseRequest._etag_valuesheader_valuec                 C   s   |sd S t | |S rL   )r   r   )clsr   rF   rF   rG   _if_match_or_none_impl$  s   z"BaseRequest._if_match_or_none_implc                 C      |  | jtjS )zxThe value of If-Match HTTP header, or None.

        This header is represented as a `tuple` of `ETag` objects.
        )r   r>   r   r   ZIF_MATCHr   rF   rF   rG   if_match-     zBaseRequest.if_matchc                 C   r   )z}The value of If-None-Match HTTP header, or None.

        This header is represented as a `tuple` of `ETag` objects.
        )r   r>   r   r   ZIF_NONE_MATCHr   rF   rF   rG   if_none_match5  r   zBaseRequest.if_none_matchc                 C   r   )zpThe value of If-Range HTTP header, or None.

        This header is represented as a `datetime` object.
        )r!   r>   r   r   ZIF_RANGEr   rF   rF   rG   if_range=  r   zBaseRequest.if_rangec                 C   s
   | j j S )zIs keepalive enabled by client?)r]   Zshould_closer   rF   rF   rG   
keep_aliveE  r   zBaseRequest.keep_alivec                 C   s&   t | jtjd}tdd |D S )zMReturn request cookies.

        A read-only dictionary-like object.
        rK   c                 S   s   i | ]\}}||j qS rF   )r   )rN   r:   morselrF   rF   rG   
<dictcomp>T  s    z'BaseRequest.cookies.<locals>.<dictcomp>)r   r>   r   r   ZCOOKIEr   )r   parsedrF   rF   rG   cookiesJ  s   zBaseRequest.cookiesc                 C   s   | j tj}d\}}|durjzd}t||tjd \}}W n ty*   tdw |r1t	|nd}|r9t	|nd}|du rH|durH| }d}|dur\|dur\|d7 }||kr\td||  u ridu rjtd t
||dS )	zMThe content of Range HTTP header.

        Return a slice instance.

        )NNNz^bytes=(\d*)-(\d*)$r   zrange not in acceptable formatr   zstart cannot be after endz"No start or end of range specified)ra   r   r   RANGErefindallASCII
IndexError
ValueErrorintslice)r   rngstartendpatternrF   rF   rG   
http_rangeV  s,   zBaseRequest.http_rangec                 C   r   )zReturn raw payload stream.)r`   r   rF   rF   rG   contentz  r   zBaseRequest.contentc                 C   s   t jdtdd | j  S )@Return True if request's HTTP BODY can be read, False otherwise.z$Deprecated, use .can_read_body #2005r   r   )r   r   r   r`   at_eofr   rF   rF   rG   has_body  s   zBaseRequest.has_bodyc                 C   s   | j   S )r   )r`   r   r   rF   rF   rG   can_read_body  s   zBaseRequest.can_read_bodyc                 C   s   t | jtuS )z6Return True if request has HTTP BODY, False otherwise.)typer`   r)   r   rF   rF   rG   body_exists  s   zBaseRequest.body_existsc                    s.   | j  s| j  I dH  | j  rdS dS )zKRelease request.

        Eat unread part of HTTP BODY if present.
        N)r`   r   readanyr   rF   rF   rG   release  s   
zBaseRequest.releasec                    sl   | j du r3t }	 | j I dH }|| | jr*t|}|| jkr*t| j|d|s-nq
t|| _ | j S )z_Read request body if present.

        Returns bytes object with full request content.
        NTmax_sizeZactual_size)	rf   	bytearrayr`   r  extendrj   r   r0   bytes)r   bodychunkZ	body_sizerF   rF   rG   read  s"   



zBaseRequest.readc                    s$   |   I dH }| jpd}||S )z1Return BODY as text using encoding from .charset.Nr   )r  charsetdecode)r   Z
bytes_bodyencodingrF   rF   rG   text  s   

zBaseRequest.text)loadsr  c                   s   |   I dH }||S )zReturn BODY as JSON.N)r  )r   r  r	  rF   rF   rG   json  s   zBaseRequest.jsonc                    s   t | j| jS )z3Return async iterator to process BODY as multipart.)r(   ra   r`   r   rF   rF   rG   	multipart  s   zBaseRequest.multipart,MultiDictProxy[Union[str, bytes, FileField]]c                    s  | j dur	| j S | j| jvrtt | _ | j S | j}|dvr(tt | _ | j S t }|dkr8|  I dH }| j}d}| I dH  }dur7|j	
tj}t|tr(|jdu r^td|jr| jdtjI dH }|jddI dH }	|	r||	I dH }	| jd|j|	I dH  |t|	7 }d|  k r|k rn n| jd|jI dH  t||d|jddI dH }	|	sw| jd|jdI dH  |du rd	}t|j|jttj |||j	}
|!|j|
 nJ|j"d
dI dH }|du s|#dr|j$dd}|!|j|| n|!|j| |t|7 }d|  k r|k r'n nt||dntd| I dH  }dusHn| " I dH }|rW| j%pGd}|&t'|( |d
|d t|| _ | j S )zReturn POST parameters.N)rK   z!application/x-www-form-urlencodedmultipart/form-datar  r   zMultipart field missing name.i   )sizer  zapplication/octet-streamT)r  ztext/r   )defaultz8To decode nested multipart you need to use custom reader)keep_blank_valuesr  ))re   rb   POST_METHODSr   r   r=   r  rj   nextr>   r   r   ZCONTENT_TYPEr   r'   r:   r   r;   rk   Zrun_in_executortempfileTemporaryFileZ
read_chunkr  writer   closer0   seekr3   r   rD   rE   addr  
startswithget_charsetr  r  r   rstrip)r   r=   outr  r  r  fieldZfield_cttmpr
  ffr   r  datarF   rF   rG   post  s   





:
zBaseRequest.postr:   r  c                 C   s0   | j }|du r	|S |j}|du r|S |||S )z"Extra info from protocol transportN)r^   r   get_extra_info)r   r:   r  ru   r   rF   rF   rG   r)    s   zBaseRequest.get_extra_infoc                 C   s(   | j ddd}d| jj| j|S )Nasciibackslashreplacez<{} {} {} >)r   r   r  formatr   r?   rb   )r   Zascii_encodable_pathrF   rF   rG   __repr__)  s   zBaseRequest.__repr__otherc                 C   s   t | t |kS rL   )id)r   r.  rF   rF   rG   __eq__1     zBaseRequest.__eq__c                 C   s   dS )NTrF   r   rF   rF   rG   __bool__4  s   zBaseRequest.__bool__responsec                    s   d S rL   rF   )r   r3  rF   rF   rG   _prepare_hook7  s   zBaseRequest._prepare_hookexcc                 C   s   t | j| d S rL   )r$   r`   )r   r5  rF   rF   rG   _cancel:  r1  zBaseRequest._cancelc                 C   sD   | j d u s
| jdkrd S | j  D ]\}}t|tr|j  qd S )Nr  )re   r=   r   r   r3   r<   r  )r   	file_nameZfile_field_objectrF   rF   rG   _finish=  s   

zBaseRequest._finish)rz   rx   )rz   r6   )rz   r   )rz   N)rz   r  rL   )qr?   r@   rA   r   Z
METH_PATCHZ	METH_POSTZMETH_PUTZ
METH_TRACEZMETH_DELETEr  r    ATTRS	frozensetre   r
   r   r   rB   r  r3   rC   rf   r%   r*   r   asyncioZAbstractEventLoopr   r   r   r   r#   r   r/   r-   r   propertyrw   ru   	Transportr   r   rn   r"   rs   r   r   ry   r   r   r   r   r   r   r   r   r   r   r   rp   r|   r&   r}   rq   rr   r{   r   r   r   r   r   r   r>   r.   r   datetimer   r   staticmethodr   r   classmethodr   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r+   r,   r  r(   r  r(  r)  r-  objectr0  r2  r1   r4  BaseExceptionr6  r8  rF   rF   rF   rG   r2   v   sD  
 	

:






	

; <	#

`r2   c                       s  e Zd ZU ejedgB ZdZed ed< e	r$de
deddf fddZeeeeeeed	d
ee
ef deeef deeef dee
ef dee
ef dee
ef deeef dd f fddZedddZedddZedefddZdeddfddZ  ZS )r4   _match_infoNr7   r:   valrz   c                    s8   || j vrtjd| jj|tdd t || d S )Nz-Setting custom {}.{} attribute is discouragedr   r   )	r9  r   r   r,  r   r?   r   super__setattr__)r   r:   rD  r   rF   rG   rF  R  s   
zRequest.__setattr__r   r|   r   r>   rp   rq   rr   rn   c          
   	      s0   t  j|||||||d}tt|}	| j|	_|	S )Nr   )rE  r   r   r4   rC  )
r   r|   r   r>   rp   rq   rr   rn   retZnew_retrG  rF   rG   r   \  s   
	zRequest.clonec                 C   s   | j }|dus	J |S )zResult of route resolving.N)rC  r   
match_inforF   rF   rG   rJ  t  s   zRequest.match_infor5   c                 C   s   | j }|dus	J |jS )zApplication instance.N)rC  Zcurrent_apprI  rF   rF   rG   app{  s   zRequest.appc                 C   sH   | j }|d us	J |j}| j}||}tt|d |d  }t|S )Nr   )rC  ZappsrK  indexr   reversedr   )r   rJ  lstrK  idxZsublistrF   rF   rG   config_dict  s   
zRequest.config_dictr3  c                    s@   | j }|d u r
d S |jD ]}|j }r|| |I d H  qd S rL   )rC  Z_appson_response_preparesend)r   r3  rJ  rK  rQ  rF   rF   rG   r4    s   

zRequest._prepare_hook)rz   r7   )rz   r5   )r?   r@   rA   r2   r9  r:  rC  r
   rC   r   rB   r   rF  r#   r   r   r/   r-   r   r   r"   rJ  r<  rK  r   rP  r1   r4  __classcell__rF   rF   rG  rG   r4   J  sH   
 






	
	r4   )dr;  r>  rD   r   r   stringr  r   r   r   typingr   r   r   r   r   r   r	   r
   r   r   r   r   urllib.parser   attrZ	multidictr   r   r   r   r   Zyarlr   rK   r   Z_cookie_helpersr   abcr   Zhelpersr   r   r   r   r   r   r    r!   r"   r#   r$   Zhttp_parserr%   Zhttp_writerr&   r  r'   r(   streamsr)   r*   Ztypedefsr+   r,   r-   r.   r/   Zweb_exceptionsr0   Zweb_responser1   __all__Zweb_appr5   Zweb_protocolr6   Zweb_urldispatcherr7   sr3   digitsascii_lettersrH   rB   rC   rJ   r,  r   r   rangerV   rW   rX   rZ   compiler[   r\   r2   r4   rF   rF   rF   rG   <module>   sn   
 84      Y