
    pi                     d   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	Z	d dl
Z
d dlZd dlZd dlmZ d dlmZ d dlmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( d dl)m*Z*m+Z, ddl-m.Z. dd	l m/Z/m0Z0m1Z1 dd
l2m3Z3 ddl4m5Z5 ddl6m7Z7m8Z8 ddl9m:Z:m;Z;m<Z<m=Z=m>Z> ddl?m@Z@ ddlAmBZB ddlCmDZDmEZE ddlFmGZG dZHerddlImJZJ eeKeKf   ZLneMZLej                  dk  rej                  j                  d      rePfnej                  dk  reQfndZR eS eTeU e,j                  d      dd             ZWee$eUdf      eXd<    e
j                  d      ZZee!eK      eXd<    e
j                  d      Z[ee!eK      eXd<    e
j                  d       Z]eeK   eXd!<    e	j                         d"k(  Z_ee`   eXd#<   eeBgee eE      f   Zae$e d$   e"eK   f   Zb ej                  ej                  d%&      Zd G d' d(e&d)*      Ze G d+ d,e#ed-         Zf G d. d-e j                        Zh G d/ d$eLe/      Zi G d0 d1ei      Zjd2eBd3dfd4Zk G d5 d6ef      Zl G d7 d8el      Zm G d9 d:el      Zn G d; d<ef      Zo G d= d>eo      Zp G d? d@eo      Zq G dA dBe j                        Zr G dC dDer      Zs G dE dFes      Zt G dG dHeq      Zu G dI dJeh      Zv G dK dLeh      Zw G dM dNe1      Zx G dO dPe#eef   eef         Zy G dQ dRe#eeh   eeh         Zz G dS dTe0eeKeff         Z{dUeKd3eKfdVZ|dUeKd3eKfdWZ}dUeKd3eKfdXZ~y)Y    N)wraps)Path)MappingProxyType)TYPE_CHECKINGAny	AwaitableCallable	ContainerDictFinal	GeneratorIterableIteratorListMappingNoReturnOptionalPatternSetSizedTupleType	TypedDictUnioncast)URL__version__   )hdrs)AbstractMatchInfoAbstractRouterAbstractView)DEBUG)HttpVersion11)HandlerPathLike)HTTPExceptionHTTPExpectationFailedHTTPForbiddenHTTPMethodNotAllowedHTTPNotFound)FileResponse)Request)ResponseStreamResponse)AbstractRouteDef)
UrlDispatcherUrlMappingMatchInfoAbstractResourceResourcePlainResourceDynamicResourceAbstractRouteResourceRouteStaticResourceView)Application)   
   win32)r<       .   .YARL_VERSIONz$^[0-9A-Za-z!#\$%&'\*\+\-\.\^_`\|~]+$HTTP_METHOD_REz*(\{[_a-zA-Z][^{}]*(?:\{[^{}]*\}[^{}]*)*\})ROUTE_RE/PATH_SEPWindows
IS_WINDOWSr2   T)quotec                       e Zd ZU eed<   eed<   ee   ed<   eed<   eed<   eedf   ed<   ded	<   eed
<   ded<   eed<   y)	_InfoDictpath	formatterpattern	directoryprefixr7   routesr;   appdomainAbstractRuleMatchingrulehttp_exceptionN)	__name__
__module____qualname__str__annotations__r   r   r   r'   r@       [/opt/services/ai/voice_agent/venv/lib/python3.12/site-packages/aiohttp/web_urldispatcher.pyrL   rL   j   sG    
INS\OKC())	K
  !!r]   rL   F)totalc                   b   e Zd Zdddee   ddfdZedee   fd       Zeej                  defd              Z
ej                  dedefd	       Zej                  d
edefd       Zej                  deddfd       Zej                  defd       ZddZej                  dedefd       Zy)r3   Nnamerb   returnc                    || _         y N_nameselfrb   s     r^   __init__zAbstractResource.__init__~   s	    
r]   c                     | j                   S re   rf   ri   s    r^   rb   zAbstractResource.name       zzr]   c                      y)zWExposes the resource's canonical path.

        For example '/foo/bar/{name}'

        Nr@   rl   s    r^   	canonicalzAbstractResource.canonical       r]   kwargsc                      y)z2Construct url for resource with additional params.Nr@   )ri   rq   s     r^   url_forzAbstractResource.url_for   rp   r]   requestc                    K   yw)zWResolve resource.

        Return (UrlMappingMatchInfo, allowed_methods) pair.
        Nr@   ri   rt   s     r^   resolvezAbstractResource.resolve           rQ   c                      y)zWAdd a prefix to processed URLs.

        Required for subapplications support.
        Nr@   ri   rQ   s     r^   
add_prefixzAbstractResource.add_prefix   rp   r]   c                      yz;Return a dict with additional info useful for introspectionNr@   rl   s    r^   get_infozAbstractResource.get_info   rp   r]   c                      y re   r@   rl   s    r^   freezezAbstractResource.freeze   s    r]   rM   c                      y)z Perform a raw match against pathNr@   ri   rM   s     r^   	raw_matchzAbstractResource.raw_match   rp   r]   rc   N)rX   rY   rZ   r   r[   rj   propertyrb   abcabstractmethodro   r   rs   r-   _Resolverw   r|   rL   r   r   boolr   r@   r]   r^   r3   r3   }   s1   04    hsm   3    	A A A A 	W    	    	J) J J 	/c /d / /r]   r3   r7   c                   @   e Zd Zddddedeeee   f   dee	   dee
   ddf
dZedefd	       Zedefd
       Zeej                   dee   fd              Zedee
   fd       Zej                   defd       Zej                   dededefd       Zdedee   fdZy)r7   Nexpect_handlerresourcemethodhandlerr   r   rc   c                   |t         }t        j                  |      s2t        j                  dk  rt        j                  |      s
J d|       |j                         }t        j                  |      st        | d      t        |      sJ |       t        j                  |      s(t        j                  dk  rt        j                  |      rnt        j                  |      r#t        rJ t        j                  dt               n_t!        |t"              rt%        |t&              rn>t        j                  dt               t)        |      dt*        dt,        ffd       }||}|| _        || _        || _        || _        y )	N)r<      zCoroutine is expected, got z is not allowed HTTP methodz6Bare generators are deprecated, use @coroutine wrapperz-Bare functions are deprecated, use async onesrt   rc   c                    K    |       }t        j                  |      r
| d {   }t        |t              sJ |S 7 wre   )asyncioiscoroutine
isinstancer/   )rt   resultold_handlers     r^   handler_wrapperz/AbstractRoute.__init__.<locals>.handler_wrapper   s@     $W-&&v.#)\F!&.999 *s   #A?A)_default_expect_handlerinspectiscoroutinefunctionsysversion_infor   upperrD   match
ValueErrorcallableisgeneratorfunctionr   warningswarnDeprecationWarningr   type
issubclassr"   r   r-   r/   _method_handler_expect_handler	_resource)ri   r   r   r   r   r   r   s         @r^   rj   zAbstractRoute.__init__   sa    !4N**>:w&7+F+F~+V	<((:;	< 
 ##F+x'BCDD )') &&w/w&7+F+Fw+O((1uMMH" &:g|+LMM?AS 7^w >   "K%G-!r]   c                     | j                   S re   )r   rl   s    r^   r   zAbstractRoute.method       ||r]   c                     | j                   S re   )r   rl   s    r^   r   zAbstractRoute.handler   s    }}r]   c                      y)z8Optional route's name, always equals to resource's name.Nr@   rl   s    r^   rb   zAbstractRoute.name   rp   r]   c                     | j                   S re   )r   rl   s    r^   r   zAbstractRoute.resource   s    ~~r]   c                      yr~   r@   rl   s    r^   r   zAbstractRoute.get_info   rp   r]   argsrq   c                      y)/Construct url for route with additional params.Nr@   ri   r   rq   s      r^   rs   zAbstractRoute.url_for   rp   r]   rt   c                 @   K   | j                  |       d {   S 7 wre   )r   rv   s     r^   handle_expect_headerz"AbstractRoute.handle_expect_header   s     ))'2222s   )rX   rY   rZ   r[   r   r%   r   r"   r   _ExpectHandlerr3   rj   r   r   r   r   r   rb   r   rL   r   r   rs   r-   r/   r   r@   r]   r^   r7   r7      sL    48/35"5" w\ 2235"
 !05" +,5" 
5"n       Ghsm G  G (#34   	J) J J 	>S >C >C > >3' 3h~>V 3r]   c                       e Zd ZdZdeeef   deddf fdZede	fd       Z
edefd       Zedefd	       Zedee   fd
       ZdefdZeded   fd       ZddZedd       Zej.                  dd       ZddZdef fdZ xZS )r2   )_route_apps_current_app_frozen
match_dictrouterc   Nc                 \    t         |   |       || _        g | _        d | _        d| _        y NF)superrj   r   r   r   r   )ri   r   r   	__class__s      r^   rj   zUrlMappingMatchInfo.__init__  s-    $(*
37r]   c                 .    | j                   j                  S re   )r   r   rl   s    r^   r   zUrlMappingMatchInfo.handler  s    {{"""r]   c                     | j                   S re   )r   rl   s    r^   r   zUrlMappingMatchInfo.route  s    {{r]   c                 .    | j                   j                  S re   )r   r   rl   s    r^   r   z"UrlMappingMatchInfo.expect_handler  s    {{///r]   c                      y re   r@   rl   s    r^   rW   z"UrlMappingMatchInfo.http_exception      r]   c                 6    | j                   j                         S re   )r   r   rl   s    r^   r   zUrlMappingMatchInfo.get_info  s    {{##%%r]   )r;   .c                 ,    t        | j                        S re   )tupler   rl   s    r^   appszUrlMappingMatchInfo.apps  s    TZZ  r]   c                     | j                   rt        d      | j                  || _        | j                  j	                  d|       y )Nz-Cannot change apps stack after .freeze() callr   )r   RuntimeErrorr   r   insertri   rS   s     r^   add_appzUrlMappingMatchInfo.add_app#  s=    <<NOO$ #D

!S!r]   c                 &    | j                   }|J |S re   )r   r   s     r^   current_appzUrlMappingMatchInfo.current_app*  s    
r]   c                     t         r3|| j                  vr%t        dj                  | j                  |            || _        y )Nz1Expected one of the following apps {!r}, got {!r})r#   r   r   formatr   r   s     r^   r   zUrlMappingMatchInfo.current_app0  s?    $**$"GNN

C 
  r]   c                     d| _         y )NT)r   rl   s    r^   r   zUrlMappingMatchInfo.freeze;  s	    r]   c                 B    dt         |           d| j                   dS )Nz<MatchInfo z: >)r   __repr__r   ri   r   s    r^   r   zUrlMappingMatchInfo.__repr__>  s%    UW-/04;;-qAAr]   )rS   r;   rc   N)rc   r;   r   )rX   rY   rZ   	__slots__r   r[   r7   rj   r   r%   r   r   r   r   r   r'   rW   rL   r   r   r   r   r   setterr   r   __classcell__r   s   @r^   r2   r2     s   >I4S> - D  # # # }   0 0 0  7  &) & !e./ ! !"  
    B# B Br]   c                   N     e Zd ZdZdeddf fdZedefd       ZdefdZ	 xZ
S )MatchInfoError
_exceptionrW   rc   Nc                 Z    || _         t        | 	  i t        | j                                y re   )r   r   rj   SystemRouteri   rW   r   s     r^   rj   zMatchInfoError.__init__F  s"    ([9:r]   c                     | j                   S re   r   rl   s    r^   rW   zMatchInfoError.http_exceptionJ      r]   c                 v    dj                  | j                  j                  | j                  j                        S )Nz<MatchInfoError {}: {}>)r   r   statusreasonrl   s    r^   r   zMatchInfoError.__repr__N  s.    (//OO""DOO$:$:
 	
r]   )rX   rY   rZ   r   r'   rj   r   rW   r[   r   r   r   s   @r^   r   r   B  sB    I;} ; ;   
# 
r]   r   rt   rc   c                 8  K   | j                   j                  t        j                  d      }| j                  t
        k(  rW|j                         dk(  r5| j                  j                  d       d{    d| j                  _	        yt        d|z        y7 &w)zDefault handler for Expect header.

    Just send "100 Continue" to client.
    raise HTTPExpectationFailed if value of header is not "100-continue"
     z100-continues   HTTP/1.1 100 Continue

Nr   zUnknown Expect: %s)text)headersgetr   EXPECTversionr$   lowerwriterwriteoutput_sizer(   )rt   expects     r^   r   r   T  sz      __  b1F-'<<>^+..&&'GHHH)*GNN&'-AF-JKK (Hs   A/B1B2'Bc            	            e Zd Zdddee   ddf fdZdddedeee   e	f   d	ee
   dd
fdZddZdedefdZej"                  dedeeeef      fd       ZdefdZded
   fdZ xZS )r4   Nra   rb   rc   c                `    t         |   |       i | _        d | _        t	               | _        y )Nra   )r   rj   _routes
_any_routeset_allowed_methods)ri   rb   r   s     r^   rj   zResource.__init__e  s+    d#1337*-%r]   r   r   r   r   r8   c                    | j                   j                  || j                        x}rt        d|j                   d      t        ||| |      }| j                  |       |S )Nz+Added route will never be executed, method z is already registeredr   )r   r   r   r   r   r8   register_route)ri   r   r   r   r   	route_objs         r^   	add_routezResource.add_routek  so     LL$$VT__==5=,, (  "&'4W	I&r]   c                     t        |t              s
J d|       |j                  t        j                  k(  r|| _        | j                  j                  |j                         || j                  |j                  <   y )Nz)Instance of Route class is required, got )	r   r8   r   r   METH_ANYr   r   addr   ri   r   s     r^   r   zResource.register_route}  sm    =
 	A6ui@	A 
 <<4==(#DO!!%,,/%*U\\"r]   rt   c                    K   | j                  |j                  j                        x}d t               fS | j                  j                  |j                  | j                        x}rt        ||      | j                  fS d | j                  fS wre   )
_matchrel_url	path_safer   r   r   r   r   r2   r   )ri   rt   r   r   s       r^   rw   zResource.resolve  s}     ++goo&?&?@@JI;LL$$W^^T__EE5E&z594;P;PPPT****s   BBrM   c                      y re   r@   r   s     r^   r  zResource._match  s    r]   c                 ,    t        | j                        S re   lenr   rl   s    r^   __len__zResource.__len__      4<<  r]   c                 H    t        | j                  j                               S re   iterr   valuesrl   s    r^   __iter__zResource.__iter__      DLL'')**r]   )r   r8   rc   N)rX   rY   rZ   r   r[   rj   r   r   r"   r%   r   r  r   r-   r   rw   r   r   r   r  intr  r   r  r   r   s   @r^   r4   r4   d  s    04 0 0 0 48 tL)723
 !0 
$++W + + 	3 8DcN#;  ! !+(?3 +r]   r4   c                        e Zd Zdddedee   ddf fdZedefd       ZddZd	eddfd
Z	dedee
eef      fdZdedefdZdefdZdefdZdefdZ xZS )r5   Nra   rM   rb   rc   c                ^    t         |   |       |r|j                  d      sJ || _        y )Nra   rF   )r   rj   
startswith_path)ri   rM   rb   r   s      r^   rj   zPlainResource.__init__  s.    d#4??3///
r]   c                     | j                   S re   r  rl   s    r^   ro   zPlainResource.canonical  rm   r]   c                 ,    | j                   sd| _         y y )NrF   r  rl   s    r^   r   zPlainResource.freeze  s    zzDJ r]   rQ   c                     |j                  d      sJ |j                  d      rJ t        |      dkD  sJ || j                  z   | _        y NrF   r   )r  endswithr  r  r{   s     r^   r|   zPlainResource.add_prefix  sH      %%%??3'''6{Qdjj(
r]   c                 &    | j                   |k(  ri S y re   r  r   s     r^   r  zPlainResource._match  s    ::Ir]   c                      | j                   |k(  S re   r  r   s     r^   r   zPlainResource.raw_match  s    zzT!!r]   c                     d| j                   iS )NrM   r  rl   s    r^   r   zPlainResource.get_info  s    

##r]   c                 D    t        j                  | j                  d      S NTrM   encoded)r   buildr  rl   s    r^   rs   zPlainResource.url_for  s    yydjj$77r]   c                 h    | j                   d| j                   z   dz   nd}d| d| j                   dS )N'' r   z<PlainResource  r   )rb   r  rh   s     r^   r   zPlainResource.__repr__  s8    )-)>sTYY%B a

|155r]   r   )rX   rY   rZ   r[   r   rj   r   ro   r   r|   r   r  r   r   rL   r   r   rs   r   r   r   s   @r^   r5   r5     s    ;? S 8C= D 
 3  ) ) )3 8DcN#; "c "d "$) $8 86# 6r]   r5   c                       e Zd Z ej                  d      Z ej                  d      ZdZdddede	e   ddf fd	Z
edefd
       ZdeddfdZdede	eeef      fdZdedefdZdefdZdedefdZdefdZ xZS )r6   z#\{(?P<var>[_a-zA-Z][_a-zA-Z0-9]*)\}z.\{(?P<var>[_a-zA-Z][_a-zA-Z0-9]*):(?P<re>.+)\}z[^{}/]+Nra   rM   rb   rc   c                   t         	|   |       || _        d}d}t        j	                  |      D ]  }| j
                  j                  |      }|rI|dj                  |j                  d      | j                        z  }|d|j                  d      z   dz   z  }j| j                  j                  |      }|r>| dj                  di |j                         z  }|d|j                  d      z   dz   z  }d|v sd|v rt        d| d	| d
      t        |      }||z  }|t        j                  |      z  }	 	 t        j                   |      }|j$                  j'                  t(              sJ |j'                  d      sJ || _        || _        y # t        j"                  $ r}t        d| d|       d d }~ww xY w)Nra   r   z
(?P<{}>{})var{}z(?P<{var}>{re})zInvalid path 'z'['z']zBad pattern 'z': rF   r@   )r   rj   
_orig_pathrE   splitDYN	fullmatchr   groupGOODDYN_WITH_RE	groupdictr   _requote_pathreescapecompileerrorrO   r  rG   _pattern
_formatter)
ri   rM   rb   rO   rN   partr   compiledexcr   s
            r^   rj   zDynamicResource.__init__  s   d#	NN4( 	'DHH&&t,E<..u{{5/A499MMS5;;u#55;;	$$..t4E3,33Heoo6GHHS5;;u#55;;	d{cTk >$s4&!CDD &DIryy&G%	'(	Jzz'*H **8444##C((( # xx 	J}WIS>?TI	Js   =F F?(F::F?c                     | j                   S re   )rA  rl   s    r^   ro   zDynamicResource.canonical  r   r]   rQ   c                     |j                  d      sJ |j                  d      rJ t        |      dkD  sJ t        j                  t        j
                  |      | j                  j                  z         | _        || j                  z   | _        y r   )	r  r!  r  r<  r>  r=  r@  rO   rA  r{   s     r^   r|   zDynamicResource.add_prefix  sp      %%%??3'''6{Q

299V#4t}}7L7L#LM 4??2r]   c                     | j                   j                  |      }|y |j                         j                         D ci c]  \  }}|t	        |       c}}S c c}}w re   )r@  r6  r:  items_unquote_path_safe)ri   rM   r   keyvalues        r^   r  zDynamicResource._match  sZ    ''-==B__=N=T=T=V
/9sEC#E**
 	
 
s    Ac                      | j                   |k(  S re   )r3  r   s     r^   r   zDynamicResource.raw_match  s    $&&r]   c                 4    | j                   | j                  dS )N)rN   rO   )rA  r@  rl   s    r^   r   zDynamicResource.get_info   s    !__GGr]   partsc           
          | j                   j                  |j                         D ci c]  \  }}|t        |       c}}      }t	        j
                  |d      S c c}}w r&  )rA  
format_maprH  _quote_pathr   r)  )ri   rN  kvurls        r^   rs   zDynamicResource.url_for  sK    oo(()V1![^*;)VWyyc400 *Ws   A
c                 |    | j                   d| j                   z   dz   nd}dj                  || j                        S )Nr+  r,  r   z$<DynamicResource {name} {formatter}>)rb   rN   )rb   r   rA  rh   s     r^   r   zDynamicResource.__repr__  s@    )-)>sTYY%B5<< = 
 	
r]   )rX   rY   rZ   r<  r>  r5  r9  r8  r[   r   rj   r   ro   r|   r   r  r   r   rL   r   r   rs   r   r   r   s   @r^   r6   r6     s    
"**;
<C"**NOKD;?  $S  $8C=  $D  $D 3  3 3 3
3 
8DcN#; 
'c 'd 'H) H1s 1s 1
# 
r]   r6   c                   n     e Zd Zdddedee   ddf fdZedefd       ZdeddfdZdede	fd	Z
 xZS )
PrefixResourceNra   rQ   rb   rc   c                    |r|j                  d      sJ |       |dv s|j                  d      rJ |       t        |   |       t	        |      | _        | j
                  dz   | _        y )NrF   )r   rF   ra   )r  r!  r   rj   r;  _prefix_prefix2)ri   rQ   rb   r   s      r^   rj   zPrefixResource.__init__  sh    V..s3;V;3"&//#*>FF>d#$V,s*r]   c                     | j                   S re   )rY  rl   s    r^   ro   zPrefixResource.canonical  r   r]   c                     |j                  d      sJ |j                  d      rJ t        |      dkD  sJ || j                  z   | _        | j                  dz   | _        y r   )r  r!  r  rY  rZ  r{   s     r^   r|   zPrefixResource.add_prefix  sX      %%%??3'''6{Q,s*r]   c                      yr   r@   r{   s     r^   r   zPrefixResource.raw_match!  s    r]   )rX   rY   rZ   r[   r   rj   r   ro   r|   r   r   r   r   s   @r^   rW  rW    se    =A +s +Xc] +d + 3  + + +  r]   rW  c                   $    e Zd ZdZddddddddededee   d	ee   d
ede	de	de	ddf fdZ
dddedee	   defdZededefd       ZdefdZdeddfdZdedefdZdefdZdee   fdZdedefdZdedefdZdedefd Zdefd!Z  xZ!S )"r9   rS  N   Frb   r   
chunk_size
show_indexfollow_symlinksappend_versionrQ   rP   rb   r   ra  rb  rc  rd  rc   c                   t         
|   ||       	 t        |      j                         j	                  d      }|j                         st        d| d      || _        || _	        || _
        || _        || _        || _        t        d| j                  | |      t        d	| j                  | |      d
| _        t#        | j                         | _        y # t
        $ r}	t        d| d      |	d }	~	ww xY w)Nra   T)strictr+  z' does not existz' is not a directoryGETr   HEAD)rg  rh  )r   rj   r   
expanduserrw   FileNotFoundErrorr   is_dir
_directory_show_index_chunk_size_follow_symlinksr   _append_versionr8   _handler   r   r   )ri   rQ   rP   rb   r   ra  rb  rc  rd  r?  r   s             r^   rj   zStaticResource.__init__*  s    	d+	IY224<<D<II !q+?@AA#%% /-- !t||T. "d>	
 !$DLL 1' ! 	Iq+;<=5H	Is   )C 	C7"C22C7)rd  filenamec                N   || j                   }t        |      j                  d      }t        j                  | j
                  d      }t        dk  r||j                  dd      z  }n||z  }|r| j                  j                  |      }	 | j                  rTt        t        j                  j                  |            }|j                  | j                         |j!                         }n+|j!                         }|j                  | j                         |j'                         rZ|j)                  d      5 }|j+                         }d d d        | j-                        }	|j/                  | j0                  |	i      }|S |S # t"        t$        f$ r |cY S w xY w# 1 sw Y   RxY w)NrF   Tr'  r      %%25rb)rp  r[   lstripr   r)  rY  rC   replacerl  joinpathro  r   osrM   normpathrelative_torw   r   rj  is_fileopenread_get_file_hash
with_queryVERSION_KEY)
ri   rr  rd  rT  unresolved_pathnormalized_pathfilepathf
file_byteshs
             r^   rs   zStaticResource.url_forN  sr    !!11Nx='',iiT\\48& ((e44C.C"oo66x@O((&*277+;+;O+L&MO#//@.668H.668H((9
 ! ]]4( *A!"J*''
3nnd&6&6%:;

  12  
* *s   BF 9FFFF$
byte_arrayc                     t        j                         }|j                  |        t        j                  |j                               }|j                  d      S )Nascii)hashlibsha256updatebase64urlsafe_b64encodedigestdecode)r  mb64s      r^   r  zStaticResource._get_file_hashw  s?    NN	&&qxxz2zz'""r]   c                 J    | j                   | j                  | j                  dS )N)rP   rQ   rR   )rl  rY  r   rl   s    r^   r   zStaticResource.get_info~  s!    llll
 	
r]   r   c                     d| j                   v rt        d      t        d|| | j                        | j                   d<   | j                  j                  d       y )NOPTIONSzOPTIONS route was set alreadyr   )r   r   r8   r   r   r  )ri   r   s     r^   set_options_routez StaticResource.set_options_route  sR    $>??"/wT5I5I#
Y 	!!),r]   rt   c                   K   |j                   j                  }|j                  }t        j                  j                  |      }t        r|j                  dd      }|j                  | j                        s|| j                  k7  rd t               fS | j                  }||vrd |fS dt        |t        | j                        dz   d        i}t        || j                   |         |fS w)N\rF   rr  r   )r	  r
  r   r|  rM   r}  rI   rz  r  rZ  rY  r   r   rI  r  r2   r   )ri   rt   rM   r   	norm_pathallowed_methodsr   s          r^   rw   zStaticResource.resolve  s     (( GG$$T*	!))$4I##DMM2yDLL7P;//((( "4T#dll:Ka:O:Q5R"ST
#JV0DEWWs   C%C'c                 ,    t        | j                        S re   r  rl   s    r^   r  zStaticResource.__len__  r  r]   c                 H    t        | j                  j                               S re   r  rl   s    r^   r  zStaticResource.__iter__  r  r]   c                    K   |j                   d   }| j                  j                  |      }t        j                         }|j                  d | j                  |       d {   S 7 w)Nrr  )
match_inforl  r{  r   get_running_looprun_in_executor_resolve_path_to_response)ri   rt   rr  r  loops        r^   rq  zStaticResource._handle  sb     %%j1//228<'')))$00/
 
 	
 
s   AA(!A&"A(r  c                 P   	 | j                   rTt        t        j                  j	                  |            }|j                  | j                         |j                         }n+|j                         }|j                  | j                         	 |j                         r2| j                  rt        | j                  |      d      S t               	 t#        || j$                        S # t        gt        $ r}t               |d}~ww xY w# t         $ r}t               |d}~ww xY w)zFTake the unresolved path and query the file system to form a response.Nz	text/html)r   content_type)ra  )ro  r   r|  rM   r}  r~  rl  rw   r   CIRCULAR_SYMLINK_ERRORr+   rk  rm  r.   _directory_as_htmlr)   PermissionErrorr,   rn  )ri   r  r  	file_pathr?  s        r^   r  z(StaticResource._resolve_path_to_response  s   
	,$$"&rww'7'7'H"I++DOO<+335	+335	%%doo6
	-!###!44Y?%0 
 (/) " I$2B2BCC) 434 	, .e+	,   	-/u,	-s6   BC( 7D 
D (D	9DD		D%D  D%dir_pathc           	      x   |j                         sJ |j                  | j                        j                         }dt	        |       }d| d}g }|j                         }t        |      D ]  }|j                  | j                        j                         }t        | j                   d|       }	|j                         r|j                   d}
n|j                  }
|j                  d|	 dt	        |
       d        dj                  d	j                  |            }d
| d	| d}d| d}d| d	| d}|S )z"returns directory's index as html.z
Index of /z<h1>z</h1>rF   z<li><a href="z">z	</a></li>z<ul>
{}
</ul>
z<body>
z
</body>z<head>
<title>z</title>
</head>z<html>
z
</html>)rk  r~  rl  as_posixhtml_escapeiterdirsortedrQ  rY  rb   appendr   join)ri   r  relative_path_to_dirindex_ofh1
index_list	dir_index_filerel_pathquoted_file_url	file_nameulbodyhead_strhtmls                  r^   r  z!StaticResource._directory_as_html  sP      '33DOODMMO,@ ABCH:U#
$$&	I& 	E((9BBDH)T\\N!H:*FGO ||~$zzl!,	!JJ	0;y3I2J)T	 %%dii
&;<"Rt9-$XJ.?@(2dV95r]   c                     | j                   d| j                   z   dz   nd}dj                  || j                  | j                        S )Nr+  r   z/<StaticResource {name} {path} -> {directory!r}>)rb   rM   rP   )rb   r   rY  rl  rh   s     r^   r   zStaticResource.__repr__  sG    (,		(=sTYY$2@GGDLLDOO H 
 	
r]   )"rX   rY   rZ   r  r[   r&   r   r   r  r   rj   r   rs   staticmethodbytesr  rL   r   r%   r  r-   r   rw   r  r   r7   r  r/   rq  r   r  r  r   r   r   s   @r^   r9   r9   '  sn   K #37$  %$"2"2 "2
 sm"2 !0"2 "2 "2 "2 "2 
"2P *.	' ' !	'
 
'R #5 #S # #
) 
- -T -XW X X$! !+(=1 +
W 
 
!D !D. !DF4 C @
# 
r]   r9   c                        e Zd Zdeddddf fdZdeddf fdZdeddfdZd	ed
edefdZde	fdZ
dedefdZdefdZdee   fdZdefdZ xZS )PrefixedSubAppResourcerQ   rS   r;   rc   Nc                 T    t         |   |       || _        | j                  |       y re   )r   rj   _app_add_prefix_to_resources)ri   rQ   rS   r   s      r^   rj   zPrefixedSubAppResource.__init__  s%     	%%f-r]   c                 F    t         |   |       | j                  |       y re   )r   r|   r  )ri   rQ   r   s     r^   r|   z!PrefixedSubAppResource.add_prefix  s    6"%%f-r]   c                     | j                   j                  }|j                         D ]5  }|j                  |       |j	                  |       |j                  |       7 y re   )r  router	resourcesunindex_resourcer|   index_resource)ri   rQ   r  r   s       r^   r  z/PrefixedSubAppResource._add_prefix_to_resources  sU    !!((* 	,H ##H-'!!(+	,r]   r   rq   c                     t        d      )Nz3.url_for() is not supported by sub-application rootr   r   s      r^   rs   zPrefixedSubAppResource.url_for
  s    PQQr]   c                 4    | j                   | j                  dS )N)rS   rQ   )r  rY  rl   s    r^   r   zPrefixedSubAppResource.get_info  s    yyDLL99r]   rt   c                 "  K   | j                   j                  j                  |       d {   }|j                  | j                          t	        |j
                  t              r|j
                  j                  }||fS t               }||fS 7 awre   )	r  r  rw   r   r   rW   r*   r  r   ri   rt   r  methodss       r^   rw   zPrefixedSubAppResource.resolve  s}     99++33G<<
499%j//1EF //??G 7"" eG7"" =s   )BBA"Bc                 \    t        | j                  j                  j                               S re   )r  r  r  rR   rl   s    r^   r  zPrefixedSubAppResource.__len__  s     499##**,--r]   c                 \    t        | j                  j                  j                               S re   )r  r  r  rR   rl   s    r^   r  zPrefixedSubAppResource.__iter__  s     DII$$++-..r]   c                 P    dj                  | j                  | j                        S )Nz,<PrefixedSubAppResource {prefix} -> {app!r}>)rQ   rS   )r   rY  r  rl   s    r^   r   zPrefixedSubAppResource.__repr__  s(    =DD<<TYY E 
 	
r]   )rX   rY   rZ   r[   rj   r|   r  r   rs   rL   r   r-   r   rw   r  r  r   r7   r  r   r   r   s   @r^   r  r    s    .s . .4 .
. . .,s ,t ,RS RC RC R:) :#W # #. ./(=1 /
# 
r]   r  c                       e Zd Zej                  dedefd       Zej                  defd       Z	e
ej                  defd              Zy)rU   rt   rc   c                    K   yw)z1Return bool if the request satisfies the criteriaNr@   rv   s     r^   r   zAbstractRuleMatching.match&  rx   ry   c                      yr~   r@   rl   s    r^   r   zAbstractRuleMatching.get_info*  rp   r]   c                      y)zReturn a strNr@   rl   s    r^   ro   zAbstractRuleMatching.canonical.  rp   r]   N)rX   rY   rZ   r   r   r-   r   r   rL   r   r   r[   ro   r@   r]   r^   rU   rU   %  sy    @7 @t @ @ 	J) J J 3   r]   rU   c                        e Zd Z ej                  d      Zdeddf fdZedefd       Z	dedefdZ
dedefd	Zd
edefdZdefdZ xZS )Domainz(?!-)[a-z\d-]{1,63}(?<!-)rT   rc   Nc                 N    t         |           | j                  |      | _        y re   )r   rj   
validation_domain)ri   rT   r   s     r^   rj   zDomain.__init__7  s    v.r]   c                     | j                   S re   r  rl   s    r^   ro   zDomain.canonical;  r   r]   c                     t        |t              st        d      |j                  d      j	                         }|st        d      d|v rt        d      t        d|z         }|j                  J t         fd|j                  j                  d      D              st        d      |j                  d	k(  r|j                  S |j                   d
|j                   S )NzDomain must be strrA   zDomain cannot be emptyz://zScheme not supportedzhttp://c              3   T   K   | ]  }j                   j                  |       ! y wre   )re_partr6  ).0xri   s     r^   	<genexpr>z$Domain.validation.<locals>.<genexpr>I  s      N4<<))!,Ns   %(zDomain not validP   :)r   r[   	TypeErrorrstripr   r   r   raw_hostallr4  port)ri   rT   rT  s   `  r^   r  zDomain.validation?  s    &#&011s#))+566f_344)f$%||'''Ncll6H6H6MNN/0088r><<,,q
++r]   rt   c                    K   |j                   j                  t        j                        }|sy| j	                  |      S wr   )r   r   r   HOSTmatch_domain)ri   rt   hosts      r^   r   zDomain.matchO  s5     ""499-  &&s   >A r  c                 <    |j                         | j                  k(  S re   )r   r  ri   r  s     r^   r  zDomain.match_domainU  s    zz|t||++r]   c                     d| j                   iS )NrT   r  rl   s    r^   r   zDomain.get_infoX  s    $,,''r]   )rX   rY   rZ   r<  r>  r  r[   rj   r   ro   r  r-   r   r   r  rL   r   r   r   s   @r^   r  r  4  s    bjj56G/s /t / 3  , , , '7 't ', , ,() (r]   r  c                   r     e Zd Z ej                  d      Zdeddf fdZedefd       Z	dede
fdZ xZS )	
MaskDomainz(?!-)[a-z\d\*-]{1,63}(?<!-)rT   rc   Nc                     t         |   |       | j                  j                  dd      j                  dd      }t	        j
                  |      | _        y )NrA   z\.*z.*)r   rj   r  rz  r<  r>  _mask)ri   rT   maskr   s      r^   rj   zMaskDomain.__init___  sC     ||##C/77TBZZ%
r]   c                 .    | j                   j                  S re   )r  rO   rl   s    r^   ro   zMaskDomain.canonicald  s    zz!!!r]   r  c                 <    | j                   j                  |      d uS re   )r  r6  r  s     r^   r  zMaskDomain.match_domainh  s    zz##D)55r]   )rX   rY   rZ   r<  r>  r  r[   rj   r   ro   r   r  r   r   s   @r^   r  r  \  sU    bjj78G&s &t &
 "3 " "6 6 6r]   r  c                   ^    e Zd ZdeddddfdZedefd       ZdefdZ	d	e
defd
ZdefdZy)MatchedSubAppResourcerV   rS   r;   rc   Nc                 X    t         j                  |        d| _        || _        || _        y )Nr   )r3   rj   rY  r  _rule)ri   rV   rS   s      r^   rj   zMatchedSubAppResource.__init__m  s%    !!$'	
r]   c                 .    | j                   j                  S re   )r  ro   rl   s    r^   ro   zMatchedSubAppResource.canonicals  s    zz###r]   c                 4    | j                   | j                  dS )N)rS   rV   )r  r  rl   s    r^   r   zMatchedSubAppResource.get_infow  s    yy$**55r]   rt   c                   K   | j                   j                  |       d {   sd t               fS | j                  j                  j                  |       d {   }|j                  | j                         t        |j                  t              r|j                  j                  }||fS t               }||fS 7 7 cwre   )r  r   r   r  r  rw   r   r   rW   r*   r  r  s       r^   rw   zMatchedSubAppResource.resolvez  s     ZZ%%g...;99++33G<<
499%j//1EF //??G 7"" eG7"" /<s"   C B<8C B>A"C >C c                 "    d| j                   dS )Nz<MatchedSubAppResource -> r   )r  rl   s    r^   r   zMatchedSubAppResource.__repr__  s    +DII=::r]   )rX   rY   rZ   rU   rj   r   r[   ro   rL   r   r-   r   rw   r   r@   r]   r^   r  r  l  sc    1  $  $3 $ $6) 6	#W 	# 	#;# ;r]   r  c                        e Zd ZdZdddedeeee   f   de	de
e   ddf
 fd	Zdefd
Zede
e   fd       ZdededefdZdefdZ xZS )r8   zA route with resourceNr   r   r   r   r   rc   c                ,    t         |   ||||       y )Nr   )r   rj   )ri   r   r   r   r   r   s        r^   rj   zResourceRoute.__init__  s      	GNX 	 	
r]   c                 f    dj                  | j                  | j                  | j                        S )Nz3<ResourceRoute [{method}] {resource} -> {handler!r})r   r   r   )r   r   r   r   rl   s    r^   r   zResourceRoute.__repr__  s.    DKK;; L 
 	
r]   c                 H    | j                   y | j                   j                  S re   )r   rb   rl   s    r^   rb   zResourceRoute.name  s    >>!~~"""r]   r   rq   c                 V    | j                   J  | j                   j                  |i |S )r   )r   rs   r   s      r^   rs   zResourceRoute.url_for  s.    ~~)))%t~~%%t6v66r]   c                 R    | j                   J | j                   j                         S re   )r   r   rl   s    r^   r   zResourceRoute.get_info  s%    ~~)))~~&&((r]   )rX   rY   rZ   __doc__r[   r   r%   r   r"   r3   r   r   rj   r   r   rb   r   rs   rL   r   r   r   s   @r^   r8   r8     s     48



 w\ 223

 #	

 !0

 



# 

 #hsm # #
7S 7C 7C 7
)) )r]   r8   c                        e Zd Zdeddf fdZdededefdZede	e   fd       Z
defd	Zd
edefdZedefd       Zedefd       ZdefdZ xZS )r   rW   rc   Nc                 d    t         |   t        j                  | j                         || _        y re   )r   rj   r   r  rq  _http_exceptionr   s     r^   rj   zSystemRoute.__init__  s"    5-r]   r   rq   c                     t        d      )Nz).url_for() is not allowed for SystemRouter  r   s      r^   rs   zSystemRoute.url_for  s    FGGr]   c                      y re   r@   rl   s    r^   rb   zSystemRoute.name  r   r]   c                     d| j                   iS )NrW   r  rl   s    r^   r   zSystemRoute.get_info  s     $"6"677r]   rt   c                 "   K   | j                   wre   r  rv   s     r^   rq  zSystemRoute._handle  s     """s   c                 .    | j                   j                  S re   )r  r   rl   s    r^   r   zSystemRoute.status      ##***r]   c                 .    | j                   j                  S re   )r  r   rl   s    r^   r   zSystemRoute.reason  r  r]   c                 &    dj                  |       S )Nz*<SystemRoute {self.status}: {self.reason}>rl   )r   rl   s    r^   r   zSystemRoute.__repr__  s    ;BBBMMr]   )rX   rY   rZ   r'   rj   r[   r   rs   r   r   rb   rL   r   r-   r/   rq  r  r   r   r   r   r   s   @r^   r   r     s    .} . .HS HC HC H hsm  8) 8#W # # + + + + + +N# Nr]   r   c                   <    e Zd ZdefdZdeddef   fdZdefdZy)r:   rc   c                 B  K   | j                   j                  t        j                  vr| j	                          t        | | j                   j                  j                         d       }|| j	                           |        d {   }t        |t              sJ |S 7 wre   )	rt   r   r   METH_ALL_raise_allowed_methodsgetattrr   r   r/   )ri   r   rets      r^   _iterz
View._iter  s}     <<dmm3'')t||2288:DA>'')Hn#~...
 s   BBBBNc                 >    | j                         j                         S re   )r"  	__await__rl   s    r^   r$  zView.__await__  s    zz|%%''r]   c                     t         j                  D ch c]  }t        | |j                               s|! }}t	        | j
                  j                  |      c c}w re   )r   r  hasattrr   r*   rt   r   )ri   r  r  s      r^   r  zView._raise_allowed_methods  sE    &*mmPwtQWWY7O1PP"4<<#6#6HH Qs
   AA)	rX   rY   rZ   r/   r"  r   r$  r   r  r@   r]   r^   r:   r:     s4    	^ 	(9T4%?@ (I Ir]   r:   c                   P    e Zd Zdee   ddfdZdefdZdee   fdZ	de
defdZy)	ResourcesViewr  rc   Nc                     || _         y re   
_resources)ri   r  s     r^   rj   zResourcesView.__init__  s	    #r]   c                 ,    t        | j                        S re   )r  r+  rl   s    r^   r  zResourcesView.__len__  s    4??##r]   c              #   8   K   | j                   E d {    y 7 wre   r*  rl   s    r^   r  zResourcesView.__iter__  s     ??""   r   c                     || j                   v S re   r*  ri   r   s     r^   __contains__zResourcesView.__contains__  s    4??**r]   )rX   rY   rZ   r   r3   rj   r  r  r   r  objectr   r1  r@   r]   r^   r(  r(    sL    $$'7"8 $T $$ $#(#34 #+V + +r]   r(  c                   L    e Zd Zdee   fdZdefdZdee	   fdZ
dedefdZy)	
RoutesViewr  c                 d    g | _         |D ]$  }|D ]  }| j                   j                  |        & y re   )r   r  )ri   r  r   r   s       r^   rj   zRoutesView.__init__  s9    ,.! 	+H! +##E*+	+r]   rc   c                 ,    t        | j                        S re   r  rl   s    r^   r  zRoutesView.__len__  r  r]   c              #   8   K   | j                   E d {    y 7 wre   r   rl   s    r^   r  zRoutesView.__iter__  s     <<r.  r   c                     || j                   v S re   r8  r  s     r^   r1  zRoutesView.__contains__  s    $$r]   N)rX   rY   rZ   r   r3   rj   r  r  r   r7   r  r2  r   r1  r@   r]   r^   r4  r4    sD    +$'7"8 +! ! (=1  %& %T %r]   r4  c                       e Zd Z ej                  d      Zd4 fdZdedefdZ	de
e   fdZdefdZd	edefd
ZdedefdZdefdZdefdZdeeef   fdZd	eddfdZd	edefdZd	eddfdZd	eddfdZdddedee   defdZ ddddedede!e"e#e$   f   dee   dee%   de&fdZ'ddddddddede(dee   dee%   d ed!ed"ed#edefd$Z)dede"d%e*de&fd&Z+dede"d%e*de&fd'Z,dd(d)dede"dee   d*ed%e*de&fd+Z-dede"d%e*de&fd,Z.dede"d%e*de&fd-Z/dede"d%e*de&fd.Z0dede"d%e*de&fd/Z1dede#e$   d%e*de&fd0Z2d4 fd1Z3d2e4e5   de6e&   fd3Z7 xZ8S )5r1   z[.:-]rc   Nc                 Z    t         |           g | _        i | _        i | _        g | _        y re   )r   rj   r+  _named_resources_resource_index_matched_sub_app_resourcesr   s    r^   rj   zUrlDispatcher.__init__  s-    24=?BDGI'r]   rt   c                   K   | j                   }t               }| j                  D ])  }|j                  |       d {   \  }}||c S ||z  }+ |j                  j
                  }|r_|j                  |d      D ])  }|j                  |       d {   \  }}||c S ||z  }+ |dk(  rn|j                  d      d   xs d}|r_|rt        t        |j                  |            S t        t                     S 7 7 kw)Nr@   rF   r   )r=  r   r>  rw   r	  r
  r   
rpartitionr   r*   r   r+   )	ri   rt   resource_indexr  r   r   allowedurl_part	candidates	            r^   rw   zUrlDispatcher.resolve	  s    --$'E 77 	+H(0(8(8(A"AJ%!!7*	+ ??,,+//"= /	,5,=,=g,F&F#
G)%%#w.O/ 3**3/29cH  !"6w~~"WXXln--5 #B 'Gs(   :D C<AD C>4D 5D >D c                 ,    t        | j                        S re   )r  r<  rl   s    r^   r  zUrlDispatcher.__iter__2  s    D))**r]   c                 ,    t        | j                        S re   )r  r<  rl   s    r^   r  zUrlDispatcher.__len__5  s    4(())r]   r   c                     || j                   v S re   r<  r0  s     r^   r1  zUrlDispatcher.__contains__8  s    40000r]   rb   c                      | j                   |   S re   rH  rh   s     r^   __getitem__zUrlDispatcher.__getitem__;  s    $$T**r]   c                 ,    t        | j                        S re   )r(  r+  rl   s    r^   r  zUrlDispatcher.resources>  s    T__--r]   c                 ,    t        | j                        S re   )r4  r+  rl   s    r^   rR   zUrlDispatcher.routesA  s    $//**r]   c                 ,    t        | j                        S re   )r   r<  rl   s    r^   named_resourceszUrlDispatcher.named_resourcesD  s     5 566r]   c                    t        |t              s
J d|       | j                  rt        d      |j                  }|| j
                  j                  |      }|D ]P  }t        j                  |      rt        d|d      |j                         r8t        dj                  |             || j                  v r(t        dj                  || j                  |               || j                  |<   | j                  j                  |       t        |t              r| j                   j                  |       y | j#                  |       y )Nz4Instance of AbstractResource class is required, got z.Cannot register a resource into frozen router.zIncorrect route name z/, python keywords cannot be used for route namezoIncorrect route name {!r}, the name should be a sequence of python identifiers separated by dash, dot or columnz'Duplicate {!r}, already handled by {!r})r   r3   frozenr   rb   NAME_SPLIT_REr4  keyword	iskeywordr   isidentifierr   r<  r+  r  r  r>  r  )ri   r   rb   rN  rB  s        r^   register_resourcezUrlDispatcher.register_resourceG  sV   &
 	OA(N	O 
 ;;OPP}}&&,,T2E $$T*$/x 8) ) 
 ((*$1 28	  t,,, ..4fT4;P;PQU;V.W  +3D!!$'x(h 56++228<)r]   c                     d|j                   x}v r&|j                  d      d   j                  d      d   }|j                  d      xs dS )z9Return a key to index the resource in the resource index.r1  r   rF   )ro   	partitionr@  r  )ri   r   	index_keys      r^   _get_resource_index_keyz%UrlDispatcher._get_resource_index_keyn  sR     2 2293 "++C03>>sCAFI$++r]   c                 |    | j                  |      }| j                  j                  |g       j                  |       y)z%Add a resource to the resource index.N)rY  r=  
setdefaultr  ri   r   resource_keys      r^   r  zUrlDispatcher.index_resourcey  s5    33H= 	''b9@@Jr]   c                 b    | j                  |      }| j                  |   j                  |       y)z*Remove a resource from the resource index.N)rY  r=  remover\  s      r^   r  zUrlDispatcher.unindex_resource  s+    33H=\*11(;r]   ra   rM   c                   |r|j                  d      st        d      | j                  r?| j                  d   }|j                  |k(  r!|j	                  |      rt        t        |      S d|v s9d|v s5t        j                  |      s t        ||      }| j                  |       |S t        ||      }| j                  |       |S )NrF   z)path should be started with / or be emptyr1  r2  ra   )r  r   r+  rb   r   r   r4   rE   searchr5   rU  r6   )ri   rM   rb   r   s       r^   add_resourcezUrlDispatcher.add_resource  s    ,HII??r*H}}$););D)AHh//tsd{hood.C$T5H""8,O"4d3x(r]   )rb   r   r   r   r   c                P    | j                  ||      }|j                  |||      S )Nra   r   )rc  r  )ri   r   rM   r   rb   r   r   s          r^   r  zUrlDispatcher.add_route  s1     $$T$5!!&'.!QQr]   r_  Fr`  rQ   ra  rb  rc  rd  c          
          |j                  d      sJ |j                  d      r|dd }t        ||||||||      }	| j                  |	       |	S )z^Add static files view.

        prefix - url prefix
        path - folder with files

        rF   Nra  r`  )r  r!  r9   rU  )
ri   rQ   rM   rb   r   ra  rb  rc  rd  r   s
             r^   
add_staticzUrlDispatcher.add_static  sf    $   %%%??3CR[F!)!!+)	
 	x(r]   rq   c                 H     | j                   t        j                  ||fi |S )z(Shortcut for add_route with method HEAD.)r  r   	METH_HEADri   rM   r   rq   s       r^   add_headzUrlDispatcher.add_head       t~~dnndGFvFFr]   c                 H     | j                   t        j                  ||fi |S )z+Shortcut for add_route with method OPTIONS.)r  r   METH_OPTIONSri  s       r^   add_optionszUrlDispatcher.add_options  s"    t~~d//wI&IIr]   T)rb   
allow_headro  c                    | j                  ||      }|r" |j                  t        j                  |fi |  |j                  t        j                  |fi |S )zShortcut for add_route with method GET.

        If allow_head is true, another
        route is added allowing head requests to the same endpoint.
        ra   )rc  r  r   rh  METH_GET)ri   rM   r   rb   ro  rq   r   s          r^   add_getzUrlDispatcher.add_get  sU     $$T$5Ht~~wA&A!x!!$--CFCCr]   c                 H     | j                   t        j                  ||fi |S )z(Shortcut for add_route with method POST.)r  r   	METH_POSTri  s       r^   add_postzUrlDispatcher.add_post  rk  r]   c                 H     | j                   t        j                  ||fi |S )z'Shortcut for add_route with method PUT.)r  r   METH_PUTri  s       r^   add_putzUrlDispatcher.add_put  s     t~~dmmT7EfEEr]   c                 H     | j                   t        j                  ||fi |S )z)Shortcut for add_route with method PATCH.)r  r   
METH_PATCHri  s       r^   	add_patchzUrlDispatcher.add_patch  s     t~~dootWGGGr]   c                 H     | j                   t        j                  ||fi |S )z*Shortcut for add_route with method DELETE.)r  r   METH_DELETEri  s       r^   
add_deletezUrlDispatcher.add_delete  s"    t~~d..gHHHr]   c                 H     | j                   t        j                  ||fi |S )z?Shortcut for add_route with ANY methods for a class-based view.)r  r   r  ri  s       r^   add_viewzUrlDispatcher.add_view  s"     t~~dmmT7EfEEr]   c                 d    t         |           | j                  D ]  }|j                           y re   )r   r   r+  )ri   r   r   s     r^   r   zUrlDispatcher.freeze  s*     	HOO	r]   rR   c                 X    g }|D ]"  }|j                  |j                  |              $ |S )zAppend routes to route table.

        Parameter should be a sequence of RouteDef objects.

        Returns a list of registered AbstractRoute instances.
        )extendregister)ri   rR   registered_routes	route_defs       r^   
add_routeszUrlDispatcher.add_routes  s8      	?I$$Y%7%7%=>	?  r]   r   )9rX   rY   rZ   r<  r>  rQ  rj   r-   r2   rw   r   r[   r  r  r  r2  r   r1  r3   rJ  r(  r  r4  rR   r   rN  rU  rY  r  r  r   r4   rc  r   r%   r   r"   r   r7   r  r&   rf  r   rj  rn  rr  ru  rx  r{  r~  r  r   r   r0   r   r  r   r   s   @r^   r1   r1     s   BJJx(MJ'.W '.1D '.R+(3- +* *1V 1 1+ +(8 +.= .+
 +7.>)>!? 7%**: %*t %*N	,0@ 	,S 	,K'7 KD K<)9 <d <
 @D  x}  , #37
R
R 
R w\ 223	
R sm
R !0
R 

R" #37$  %$    
 sm  !0          
 DGS G7 Gc Gm GJ Jg J J J #DD D
 smD D D 
D&GS G7 Gc Gm GFC F' FS F] FHc HG Hs H} HIs IW I I IFF"&|"4F@CF	F

!*:!; 
!]@S 
!r]   r1   rK  c                 z    t         dk  r| j                  dd      } t        j                  | d      j                  S )Nrt  rv  rw  Fr'  )rC   rz  r   r)  raw_pathrK  s    r^   rQ  rQ    s1    fc5)99%/888r]   c                 R    d| vr| S | j                  dd      j                  dd      S )Nrv  z%2FrF   rw  )rz  r  s    r^   rI  rI    s-    
%==$,,UC88r]   c                 H    t        |       }d| v r|j                  dd      }|S )Nrv  rw  )rQ  rz  )rK  r   s     r^   r;  r;    s*     F
e|s+Mr]   )r   r   r  	functoolsr  r  r   rR  r|  platformr<  r   r   r   pathlibr   typesr   typingr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   yarlr   r   yarl_versionr   r   r    r!   r"   helpersr#   httpr$   typedefsr%   r&   web_exceptionsr'   r(   r)   r*   r+   web_fileresponser,   web_requestr-   web_responser.   r/   web_routedefr0   __all__web_appr;   r[   BaseDictdictr   r  OSErrorr   r  r   mapr  r4  rC   r\   r>  rD   rE   r=  rG   systemrI   r   r   r   partialr  rL   r3   ABCr7   r2   r   r   r4   r5   r6   rW  r9   r  rU   r  r  r  r8   r   r:   r(  r4  r1   rQ  rI  r;  r@   r]   r^   <module>r     s   
        	  	 
    "     2 2  @ @   '  +   2 * $CH~HH '!cll&=&=g&F J,,w6,B  (-S6Hl6H6H6Mbq6Q-R'SeE#s(O$ S&0bjj+'gcl#  !+

1!%
  !ryy~%* %)(//+y8
E$K 87)Yx/G%HHI/0#c(:;i48"	 "&,/uh7 ,/^R3CGG R3j>B($5 >BB
( 
$L7 Lt L 1+ 1+l%6H %6PI
h I
X% 2M
^ M
`+
^ +
\377 %(! %(P6 6 ;2 ;:!)M !)HN- N<I< I(+E8$45yAQ7R +%/=1I %"F!NGC1A,A$B F!R9s 9s 99c 9c 9  r]   