
    rp0ju                        % S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
r
S SKrS SKrS SKJrJrJrJrJrJrJrJr  S SKJr  S SKJr  S SK
Jr  S SKJr  S SKJrJrJrJ r J!r!J"r"J#r#  S SK$J%r%J&r'  S	S
K(J)r)  S	SK J*r*J+r+J,r,  S	SK-J.r.J/r/  S	SK0J1r1  S	SK2J3r3J4r4  S	SK5J6r6J7r7J8r8J9r9J:r:  S	SK;J<r<  S	SK=J>r>  S	SK?J@r@JArA  S	SKBJCrC  SrD\(       a  S	SKEJFrF  \G\H\H4   rIO\GrI\R                  S:  a  \K4OSrL\M" \N" \O\'R                  " S5      SS 5      5      rQ\\M\OS4      \RS'   \
R                  " S5      rT\\\H      \RS'   \
R                  " S5      rU\\\H      \RS'   \
R                  " S 5      rW\\H   \RS!'   \	R                  " 5       S":H  rY\\Z   \RS#'   \\>/\\AS-     4   r[\M\!S$   \\\H   4   r]\R                  " \R                  S%S&9r_ " S' S(\"S)S*9r` " S+ S,\\S-   5      ra " S. S-\ R                  5      rc " S/ S$\I\*5      rd " S0 S1\d5      reS2\>S3S4S4 jrf " S5 S6\a5      rg " S7 S8\g5      rh " S9 S:\g5      ri " S; S<\a5      rj " S= S>\j5      rk " S? S@\j5      rl " SA SB\ R                  5      rm " SC SD\m5      rn " SE SF\n5      ro " SG SH\l5      rp " SI SJ\c5      rq " SK SL\c5      rr " SM SN\,5      rs " SO SP\\\a   \\a   5      rt " SQ SR\\\c   \\c   5      ru " SS ST\+\\H\a4   5      rvSU\HS3\H4SV jrwSU\HS3\H4SW jrxSU\HS3\H4SX jryg)Y    N)	AwaitableCallable	Container	GeneratorIterableIteratorMappingSized)wraps)Path)Pattern)MappingProxyType)TYPE_CHECKINGAnyFinalNoReturnOptional	TypedDictcast)URL__version__   )hdrs)AbstractMatchInfoAbstractRouterAbstractView)DEBUGDEFAULT_CHUNK_SIZE)HttpVersion11)HandlerPathLike)HTTPExceptionHTTPExpectationFailedHTTPForbiddenHTTPMethodNotAllowedHTTPNotFound)FileResponse)Request)ResponseStreamResponse)AbstractRouteDef)
UrlDispatcherUrlMappingMatchInfoAbstractResourceResourcePlainResourceDynamicResourceAbstractRouteResourceRouteStaticResourceView)Application)       .   .YARL_VERSIONz$^[0-9A-Za-z!#\$%&'\*\+\-\.\^_`\|~]+$HTTP_METHOD_REz*(\{[_a-zA-Z][^{}]*(?:\{[^{}]*\}[^{}]*)*\})ROUTE_RE/PATH_SEPWindows
IS_WINDOWSr-   T)quotec                       \ rS rSr% \\S'   \\S'   \\   \S'   \\S'   \\S'   \\S4   \S'   S	\S
'   \\S'   S\S'   \	\S'   Sr
g)	_InfoDictZ   path	formatterpattern	directoryprefixr2   routesr6   appdomainAbstractRuleMatchingrulehttp_exceptionr9   N)__name__
__module____qualname____firstlineno__str__annotations__r   r   r	   r"   __static_attributes__r9       S/home/wildlama/miniconda3/lib/python3.13/site-packages/aiohttp/web_urldispatcher.pyrE   rE   Z   sG    
INS\OKC())	K
  !!rY   rE   F)totalc                   ~   \ rS rSrSS.S\S-  SS4S jjr\S\S-  4S j5       r\\R                  S\4S j5       5       r
\R                  S	\S\4S
 j5       r\R                  S\S\4S j5       r\R                  S\SS4S j5       r\R                  S\4S j5       rSS jr\R                  S\S\4S j5       rSrg)r.   m   Nnamer_   returnc                    Xl         g N_nameselfr_   s     rZ   __init__AbstractResource.__init__n   s    
rY   c                     U R                   $ rb   rc   rf   s    rZ   r_   AbstractResource.nameq       zzrY   c                     g)zGExposes the resource's canonical path.

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

Nr9   rj   s    rZ   	canonicalAbstractResource.canonicalu       rY   kwargsc                     g)z2Construct url for resource with additional params.Nr9   )rf   rq   s     rZ   url_forAbstractResource.url_for~   rp   rY   requestc                    #    g7f)zGResolve resource.

Return (UrlMappingMatchInfo, allowed_methods) pair.
Nr9   rf   ru   s     rZ   resolveAbstractResource.resolve           rK   c                     g)zGAdd a prefix to processed URLs.

Required for subapplications support.
Nr9   rf   rK   s     rZ   
add_prefixAbstractResource.add_prefix   rp   rY   c                     gz;Return a dict with additional info useful for introspectionNr9   rj   s    rZ   get_infoAbstractResource.get_info   rp   rY   c                     g rb   r9   rj   s    rZ   freezeAbstractResource.freeze   s    rY   rG   c                     g)z Perform a raw match against pathNr9   rf   rG   s     rZ   	raw_matchAbstractResource.raw_match   rp   rY   rc   r`   N)rR   rS   rT   rU   rV   rg   propertyr_   abcabstractmethodrn   r   rs   r(   _Resolverx   r~   rE   r   r   boolr   rX   r9   rY   rZ   r.   r.   m   s1   -1 d
 d  cDj   3    	A A A A 	W    	    	J) J J 	/c /d / /rY   r.   r2   c                   V   \ rS rSrSSS.S\S\\\   -  S\S-  S\	S-  SS4
S	 jjr
\S\4S
 j5       r\S\4S j5       r\\R                  S\S-  4S j5       5       r\S\	S-  4S j5       r\R                  S\4S j5       r\R                  S\S\S\4S j5       rS\S\S-  4S jrSrg)r2      Nexpect_handlerresourcemethodhandlerr   r   r`   c                  ^ Uc  [         n[        R                  " U5      (       d:  [        R                  S:  a  [
        R                  " U5      (       d   SU< 35       eUR                  5       n[        R                  U5      (       d  [        U S35      e[        U5      (       d   U5       e[        R                  " U5      (       d/  [        R                  S:  a  [
        R                  " U5      (       a  O[        R                  " U5      (       a)  [        (       a   e[        R                  " S[        5        Ol[!        U["        5      (       a  [%        U[&        5      (       a  OA[        R                  " S[        5        [)        U5      S[*        S[,        4U4S jj5       nUmUnXl        X l        X0l        X@l        g )	N)r7      zCoroutine is expected, got z is not allowed HTTP methodz6Bare generators are deprecated, use @coroutine wrapperz-Bare functions are deprecated, use async onesru   r`   c                    >#    T" U 5      n[         R                  " U5      (       a
  UI S h  vN n[        U[        5      (       d   eU$  N7frb   )asyncioiscoroutine
isinstancer*   )ru   resultold_handlers     rZ   handler_wrapper/AbstractRoute.__init__.<locals>.handler_wrapper   sE     $W-&&v..#)\F!&.9999 *s   )AA
A)_default_expect_handlerinspectiscoroutinefunctionsysversion_infor   upperr=   match
ValueErrorcallableisgeneratorfunctionr   warningswarnDeprecationWarningr   type
issubclassr   r   r(   r*   _method_handler_expect_handler	_resource)rf   r   r   r   r   r   r   s         @rZ   rg   AbstractRoute.__init__   sv    !4N**>::w&7+F+F~+V+V	<((:;	< 
 ##F++x'BCDD  )') &&w//w&7+F+Fw+O+O((11}uMMH" &&:g|+L+LMM?AS 7^w >   "K%G-!rY   c                     U R                   $ rb   )r   rj   s    rZ   r   AbstractRoute.method       ||rY   c                     U R                   $ rb   )r   rj   s    rZ   r   AbstractRoute.handler   s    }}rY   c                     g)z8Optional route's name, always equals to resource's name.Nr9   rj   s    rZ   r_   AbstractRoute.name   rp   rY   c                     U R                   $ rb   )r   rj   s    rZ   r   AbstractRoute.resource   s    ~~rY   c                     gr   r9   rj   s    rZ   r   AbstractRoute.get_info   rp   rY   argsrq   c                     g)/Construct url for route with additional params.Nr9   rf   r   rq   s      rZ   rs   AbstractRoute.url_for   rp   rY   ru   c                 @   #    U R                  U5      I S h  vN $  N7frb   )r   rw   s     rZ   handle_expect_header"AbstractRoute.handle_expect_header   s     ))'2222s   )r   r   r   r   )rR   rS   rT   rU   rV   r    r   r   _ExpectHandlerr.   rg   r   r   r   r   r   r_   r   rE   r   r   rs   r(   r*   r   rX   r9   rY   rZ   r2   r2      sF    15,05"5" 4--5"
 '-5" #T)5" 
5"n       GcDj G  G *T1   	J) J J 	>S >C >C > >3' 3nt>S 3rY   c                   <  ^  \ rS rSrSrS\\\4   S\SS4U 4S jjr\	S\
4S j5       r\	S\4S	 j5       r\	S\4S
 j5       r\	S\S-  4S j5       rS\4S jr\	S\S   4S j5       rSS jr\	SS j5       r\R.                  SS j5       rSS jrS\4U 4S jjrSrU =r$ )r-      )_route_apps_current_app_frozen
match_dictrouter`   Nc                 Z   > [         TU ]  U5        X l        / U l        S U l        SU l        g NF)superrg   r   r   r   r   )rf   r   r   	__class__s      rZ   rg   UrlMappingMatchInfo.__init__   s+    $(*
04rY   c                 .    U R                   R                  $ rb   )r   r   rj   s    rZ   r   UrlMappingMatchInfo.handler   s    {{"""rY   c                     U R                   $ rb   )r   rj   s    rZ   r   UrlMappingMatchInfo.route   s    {{rY   c                 .    U R                   R                  $ rb   )r   r   rj   s    rZ   r   "UrlMappingMatchInfo.expect_handler  s    {{///rY   c                     g rb   r9   rj   s    rZ   rQ   "UrlMappingMatchInfo.http_exception      rY   c                 6    U R                   R                  5       $ rb   )r   r   rj   s    rZ   r   UrlMappingMatchInfo.get_info  s    {{##%%rY   )r6   .c                 ,    [        U R                  5      $ rb   )tupler   rj   s    rZ   appsUrlMappingMatchInfo.apps  s    TZZ  rY   c                     U R                   (       a  [        S5      eU R                  c  Xl        U R                  R	                  SU5        g )Nz-Cannot change apps stack after .freeze() callr   )r   RuntimeErrorr   r   insertrf   rM   s     rZ   add_appUrlMappingMatchInfo.add_app  s;    <<NOO$ #

!S!rY   c                 (    U R                   nUc   eU$ rb   )r   r   s     rZ   current_appUrlMappingMatchInfo.current_app  s    
rY   c                 ~    [         (       a,  XR                  ;  a  [        SU R                  < SU< 35      eXl        g )Nz#Expected one of the following apps z, got )r   r   r   r   r   s     rZ   r   r      s:    5**$"9$**vcWU   rY   c                     SU l         g )NT)r   rj   s    rZ   r   UrlMappingMatchInfo.freeze)  s	    rY   c                 B   > S[         TU ]  5        SU R                   S3$ )Nz<MatchInfo : >)r   __repr__r   rf   r   s    rZ   r   UrlMappingMatchInfo.__repr__,  s%    UW-/04;;-qAArY   )r   r   r   r   )rM   r6   r`   N)r`   r6   r   )rR   rS   rT   rU   	__slots__dictrV   r2   rg   r   r    r   r   r   r   r"   rQ   rE   r   r   r   r   r   setterr   r   rX   __classcell__r   s   @rZ   r-   r-      s   >I4S> - D  # # # }   0 0 0  4  &) & !e./ ! !"  
    B# B BrY   c                   ^   ^  \ rS rSrSrS\SS4U 4S jjr\S\4S j5       rS\	4S jr
SrU =r$ )	MatchInfoErrori0  
_exceptionrQ   r`   Nc                 X   > Xl         [        TU ]	  0 [        U R                   5      5        g rb   )r   r   rg   SystemRouterf   rQ   r   s     rZ   rg   MatchInfoError.__init__4  s     ([9:rY   c                     U R                   $ rb   r   rj   s    rZ   rQ   MatchInfoError.http_exception8      rY   c                 d    SU R                   R                   SU R                   R                   S3$ )Nz<MatchInfoError r   r   )r   statusreasonrj   s    rZ   r   MatchInfoError.__repr__<  s.    !$//"8"8!9DOO<R<R;SSTUUrY   )rR   rS   rT   rU   r   r"   rg   r   rQ   rV   r   rX   r   r   s   @rZ   r   r   0  sJ    I;} ; ;   V# V VrY   r   ru   r`   c                 6  #    U R                   R                  [        R                  S5      nU R                  [
        :X  aU  UR                  5       S:X  a5  U R                  R                  S5      I Sh  vN   SU R                  l	        g[        SU-  S9eg N#7f)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#   )ru   expects     rZ   r   r   @  sy      __  b1F-'<<>^+..&&'GHHH)*GNN&'-AF-JKK (Hs   A1B3B4$Bc            	          ^  \ rS rSrSS.S\S-  SS4U 4S jjjrSS.S\S	\\   \-  S
\	S-  SS4S jjr
SS jrS\S\4S jr\R                   S\S\\\4   S-  4S j5       rS\4S jrS\S   4S jrSrU =r$ )r/   iP  Nr^   r_   r`   c                Z   > [         TU ]  US9  0 U l        S U l        [	        5       U l        g )Nr^   )r   rg   _routes
_any_routeset_allowed_methods)rf   r_   r   s     rZ   rg   Resource.__init__Q  s+    d#1304*-%rY   r   r   r   r   r3   c                    U R                   R                  XR                  5      =n(       a  [        SUR                   S35      e[        XXS9nU R                  U5        U$ )Nz+Added route will never be executed, method z is already registeredr  )r  r  r  r   r   r3   register_route)rf   r   r   r   r   	route_objs         rZ   	add_routeResource.add_routeW  si     LL$$V__==5=,, (  "&4W	I&rY   c                    [        U[        5      (       d   SU< 35       eUR                  [        R                  :X  a  Xl        U R                  R                  UR                  5        XR                  UR                  '   g )Nz)Instance of Route class is required, got )	r   r3   r   r   METH_ANYr  r  addr  rf   r   s     rZ   r!  Resource.register_routei  sn    =
 
 	A6ui@	A 
 <<4==(#O!!%,,/%*U\\"rY   ru   c                 *  #    U R                  UR                  R                  5      =nc  S [        5       4$ U R                  R                  UR                  U R                  5      =n(       a  [        X#5      U R                  4$ S U R                  4$ 7frb   )
_matchrel_url	path_safer  r  r  r   r  r-   r  )rf   ru   r   r   s       rZ   rx   Resource.resolver  sz     ++goo&?&?@@JI;LL$$W^^T__EE5E&z94;P;PPPT****s   BBrG   c                     g rb   r9   r   s     rZ   r+  Resource._matchy  s    rY   c                 ,    [        U R                  5      $ rb   lenr  rj   s    rZ   __len__Resource.__len__}      4<<  rY   c                 H    [        U R                  R                  5       5      $ rb   iterr  valuesrj   s    rZ   __iter__Resource.__iter__      DLL'')**rY   )r  r  r  )r   r3   r`   N)rR   rS   rT   rU   rV   rg   r   r   r    r   r#  r!  r(   r   rx   r   r   r   r+  intr4  r   r;  rX   r   r   s   @rZ   r/   r/   P  s    -1 0d
 0d 0 0 15 l#g-
 '- 
$++W + + 	3 4S>D#8  ! !+(?3 + +rY   r/   c                      ^  \ rS rSrSS.S\S\S-  SS4U 4S jjjr\S\4S j5       rSS	 jrS
\SS4S jr	S\S\
\\4   S-  4S jrS\S\4S jrS\4S jrS\4S jrS\4S jrSrU =r$ )r0   i  Nr^   rG   r_   r`   c                j   > [         TU ]  US9  U(       a  UR                  S5      (       d   eXl        g )Nr^   r?   )r   rg   
startswith_path)rf   rG   r_   r   s      rZ   rg   PlainResource.__init__  s/    d#4??3////
rY   c                     U R                   $ rb   rB  rj   s    rZ   rn   PlainResource.canonical  rl   rY   c                 6    U R                   (       d  SU l         g g )Nr?   rE  rj   s    rZ   r   PlainResource.freeze  s    zzDJ rY   rK   c                     UR                  S5      (       d   eUR                  S5      (       a   e[        U5      S:  d   eXR                  -   U l        g Nr?   r   )rA  endswithr3  rB  r}   s     rZ   r~   PlainResource.add_prefix  sL      %%%%??3''''6{Qjj(
rY   c                 (    U R                   U:X  a  0 $ g rb   rE  r   s     rZ   r+  PlainResource._match  s    ::IrY   c                      U R                   U:H  $ rb   rE  r   s     rZ   r   PlainResource.raw_match  s    zzT!!rY   c                     SU R                   0$ )NrG   rE  rj   s    rZ   r   PlainResource.get_info  s    

##rY   c                 @    [         R                  " U R                  SS9$ NTrG   encoded)r   buildrB  rj   s    rZ   rs   PlainResource.url_for  s    yydjj$77rY   c                 j    U R                   b  SU R                   -   S-   OSnSU SU R                   S3$ )N'' r  z<PlainResource  r   )r_   rB  re   s     rZ   r   PlainResource.__repr__  s8    )-)>sTYY%B a

|155rY   rE  r   )rR   rS   rT   rU   rV   rg   r   rn   r   r~   r   r+  r   r   rE   r   r   rs   r   rX   r   r   s   @rZ   r0   r0     s    8< S 3:   
 3  ) ) )3 4S>D#8 "c "d "$) $8 86# 6 6rY   r0   c                     ^  \ rS rSr\R
                  " S5      r\R
                  " S5      rSrSS.S\	S\	S-  S	S4U 4S
 jjjr
\S	\	4S j5       rS\	S	S4S jrS\	S	\\	\	4   S-  4S jrS\	S	\4S jrS	\4S jrS\	S	\4S jrS	\	4S jrSrU =r$ )r1   i  z#\{(?P<var>[_a-zA-Z][_a-zA-Z0-9]*)\}z.\{(?P<var>[_a-zA-Z][_a-zA-Z0-9]*):(?P<re>.+)\}z[^{}/]+Nr^   rG   r_   r`   c                  > [         T	U ]  US9  Xl        SnSn[        R	                  U5       GH  nU R
                  R                  U5      nU(       aJ  USR                  UR                  S5      U R                  5      -  nUSUR                  S5      -   S-   -  nMp  U R                  R                  U5      nU(       a?  USR                  " S0 UR                  5       D6-  nUSUR                  S5      -   S-   -  nM  SU;   d  SU;   a  [        SU S	U S
35      e[        U5      nXE-  nU[        R                  " U5      -  nGM      [        R                   " U5      nUR$                  R'                  [(        5      (       d   eUR'                  S5      (       d   eXpl        X@l        g ! [        R"                   a  n[        SU SU 35      S eS nAff = f)Nr^   r  z
(?P<{}>{})var{}z(?P<{var}>{re})zInvalid path 'z'['z']zBad pattern 'z': r?   r9   )r   rg   
_orig_pathr>   splitDYN	fullmatchformatgroupGOODDYN_WITH_RE	groupdictr   _requote_pathreescapecompileerrorrI   rA  r@   _pattern
_formatter)
rf   rG   r_   rI   rH   partr   compiledexcr   s
            rZ   rg   DynamicResource.__init__  s   d#	NN4(DHH&&t,E<..u{{5/A499MMS5;;u#55;;	$$..t4E,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4##C(((( # xx 	J}WIS>?TI	Js   F, ,G GGc                     U R                   $ rb   )rr  rj   s    rZ   rn   DynamicResource.canonical  r  rY   rK   c                 8   UR                  S5      (       d   eUR                  S5      (       a   e[        U5      S:  d   e[        R                  " [        R
                  " U5      U R                  R                  -   5      U l        XR                  -   U l        g rJ  )	rA  rK  r3  rm  ro  rn  rq  rI   rr  r}   s     rZ   r~   DynamicResource.add_prefix  st      %%%%??3''''6{Q

299V#4t}}7L7L#LM ??2rY   c                     U R                   R                  U5      nUc  g UR                  5       R                  5        VVs0 s H  u  p4U[	        U5      _M     snn$ s  snnf rb   )rq  rf  rk  items_unquote_path_safe)rf   rG   r   keyvalues        rZ   r+  DynamicResource._match  s]    ''-==B__=N=T=T=V
=VzsC#E**=V
 	
 
s   Ac                      U R                   U:H  $ rb   )rc  r   s     rZ   r   DynamicResource.raw_match  s    $&&rY   c                 4    U R                   U R                  S.$ )N)rH   rI   )rr  rq  rj   s    rZ   r   DynamicResource.get_info  s    !__GGrY   partsc           
          U R                   R                  UR                  5        VVs0 s H  u  p#U[        U5      _M     snn5      n[        R
                  " USS9$ s  snnf rT  )rr  
format_mapr|  _quote_pathr   rW  )rf   r  kvurls        rZ   rs   DynamicResource.url_for  sM    oo(()V![^*;)VWyyc400 *Ws   A
c                 j    U R                   b  SU R                   -   S-   OSnSU SU R                   S3$ )NrZ  r[  r  z<DynamicResource r\  r   )r_   rr  re   s     rZ   r   DynamicResource.__repr__  s9    )-)>sTYY%B"4&$//):!<<rY   )rr  rc  rq  )rR   rS   rT   rU   rm  ro  re  rj  ri  rV   rg   r   rn   r~   r   r+  r   r   rE   r   r   rs   r   rX   r   r   s   @rZ   r1   r1     s    
**;
<C**NOKD8<  $S  $3:  $  $  $D 3  3 3 3
3 
4S>D#8 
'c 'd 'H) H1s 1s 1=# = =rY   r1   c                      ^  \ rS rSrSS.S\S\S-  SS4U 4S jjjr\S\4S j5       rS\SS4S	 jrS\S\	4S
 jr
SrU =r$ )PrefixResourcei  Nr^   rK   r_   r`   c                   > U(       a  UR                  S5      (       d   U5       eUS;   d  UR                  S5      (       a   U5       e[        TU ]  US9  [	        U5      U l        U R
                  S-   U l        g )Nr?   )r  r?   r^   )rA  rK  r   rg   rl  _prefix_prefix2)rf   rK   r_   r   s      rZ   rg   PrefixResource.__init__  sn    V..s33;V;3"&//#*>*>FF>d#$V,s*rY   c                     U R                   $ rb   )r  rj   s    rZ   rn   PrefixResource.canonical   r   rY   c                     UR                  S5      (       d   eUR                  S5      (       a   e[        U5      S:  d   eXR                  -   U l        U R                  S-   U l        g rJ  )rA  rK  r3  r  r  r}   s     rZ   r~   PrefixResource.add_prefix  s\      %%%%??3''''6{Q,s*rY   c                     gr   r9   r}   s     rZ   r   PrefixResource.raw_match  s    rY   )r  r  )rR   rS   rT   rU   rV   rg   r   rn   r~   r   r   rX   r   r   s   @rZ   r  r    so    :> +s +S4Z +4 + + 3  + + +   rY   r  c                   J  ^  \ rS rSrSrSS\SSSS.S\S\S\S-  S	\S-  S
\	S\
S\
S\
SS4U 4S jjjrSS.S\S\
S-  S\4S jjr\S\S\4S j5       rS\4S jrS\SS4S jrS\S\4S jrS\	4S jrS\\   4S jrS\S\4S jrS\S\4S jrS\S\4S  jr S\4S! jr!S"r"U =r#$ )#r4   i  r  NFr_   r   
chunk_size
show_indexfollow_symlinksappend_versionrK   rJ   r_   r   r  r  r  r  r`   c                  > [         T
U ]  XS9   [        U5      R                  5       R	                  SS9nUR                  5       (       d  [        SU S35      eX l        X`l	        XPl
        Xpl        X@l        Xl        [        SU R                  XS9[        S	U R                  XS9S
.U l        [#        U R                   5      U l        g ! [
         a  n	[        SU S35      U	eS n	A	ff = f)Nr^   T)strictrZ  z' does not existz' is not a directoryGETr  HEAD)r  r  )r   rg   r   
expanduserrx   FileNotFoundErrorr   is_dir
_directory_show_index_chunk_size_follow_symlinksr   _append_versionr3   _handler  r  r  )rf   rK   rJ   r_   r   r  r  r  r  rp  r   s             rZ   rg   StaticResource.__init__  s     	+	IY224<<D<II !!q+?@AA#%% /-- !t||T "d	
 !$DLL 1' ! 	Iq+;<=5H	Is   &C	 	
C(C##C()r  filenamec                v   Uc  U R                   n[        U5      R                  S5      n[        R                  " U R
                  SS9n[        S:  a  X1R                  SS5      -  nOX1-  nU(       Ga  U R                  R                  U5      n U R                  (       aT  [        [        R                  R                  U5      5      nUR                  U R                  5        UR!                  5       nO,UR!                  5       nUR                  U R                  5         UR'                  5       (       aZ  UR)                  S5       nUR+                  5       nS S S 5        U R-                  W5      n	UR/                  U R0                  U	05      nU$ U$ ! ["        [$        4 a    Us $ f = f! , (       d  f       NX= f)Nr?   TrU  r      %%25rb)r  rV   lstripr   rW  r  r<   replacer  joinpathr  r   osrG   normpathrelative_torx   r   r  is_fileopenread_get_file_hash
with_queryVERSION_KEY)
rf   r  r  r  unresolved_pathnormalized_pathfilepathf
file_byteshs
             rZ   rs   StaticResource.url_for8  sj    !!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%   A$F 5+F F*F'&F'*
F8
byte_arrayc                     [         R                  " 5       nUR                  U 5        [        R                  " UR                  5       5      nUR                  S5      $ )Nascii)hashlibsha256updatebase64urlsafe_b64encodedigestdecode)r  mb64s      rZ   r  StaticResource._get_file_hasha  s?    NN	&&qxxz2zz'""rY   c                 J    U R                   U R                  U R                  S.$ )N)rJ   rK   rL   )r  r  r  rj   s    rZ   r   StaticResource.get_infoh  s!    llll
 	
rY   r   c                     SU R                   ;   a  [        S5      e[        SXU R                  S9U R                   S'   U R                  R                  S5        g )NOPTIONSzOPTIONS route was set alreadyr  )r  r   r3   r   r  r'  )rf   r   s     rZ   set_options_route StaticResource.set_options_routeo  sP    $>??"/wT5I5I#
Y 	!!),rY   ru   c                   #    UR                   R                  nUR                  n[        R                  R                  U5      n[        (       a  UR                  SS5      nUR                  U R                  5      (       d  X@R                  :w  a  S [        5       4$ U R                  nX5;  a  S U4$ S[        U[        U R                  5      S-   S  5      0n[        X`R                   U   5      U4$ 7f)N\r?   r  r   )r,  r-  r   r  rG   r  rB   r  rA  r  r  r  r  r}  r3  r-   r  )rf   ru   rG   r   	norm_pathallowed_methodsr   s          rZ   rx   StaticResource.resolvew  s     (( GG$$T*	:!))$4I##DMM22yLL7P;//((( "4T#dll:Ka:O:Q5R"ST
#JV0DEWWs   C/C1c                 ,    [        U R                  5      $ rb   r2  rj   s    rZ   r4  StaticResource.__len__  r6  rY   c                 H    [        U R                  R                  5       5      $ rb   r8  rj   s    rZ   r;  StaticResource.__iter__  r=  rY   c                 &  #    UR                   S   n[        U5      R                  5       (       a
  [        5       eU R                  R                  U5      n[        R                  " 5       nUR                  S U R                  U5      I S h  vN $  N7f)Nr  )

match_infor   is_absoluter&   r  r  r   get_running_looprun_in_executor_resolve_path_to_response)rf   ru   r  r  loops        rZ   r  StaticResource._handle  s~     %%j1>%%'' . //228<'')))$00/
 
 	
 
s   BB
BBr  c                 f    U R                   (       aT  [        [        R                  R	                  U5      5      nUR                  U R                  5        UR                  5       nO,UR                  5       nUR                  U R                  5          UR                  5       (       a4  U R                  (       a  [        U R                  U5      SS9$ [        5       e [#        X0R$                  S9$ ! [        /[        Q7 a  n[        5       UeSnAff = f! [          a  n[        5       UeSnAff = f)zFTake the unresolved path and query the file system to form a response.Nz	text/html)r  content_type)r  )r  r   r  rG   r  r  r  rx   r   CIRCULAR_SYMLINK_ERRORr&   r  r  r)   _directory_as_htmlr$   PermissionErrorr'   r  )rf   r  r  	file_pathrp  s        rZ   r  (StaticResource._resolve_path_to_response  s   
	,$$"&rww'7'7'H"I++DOO<+335	+335	%%doo6
	-!!###!44Y?%0 
 (/) " I2B2BCC) 434 	, .e+	,   	-/u,	-s<   A$C1 '+C1 >D 
D 1DDD
D0 D++D0dir_pathc           	         UR                  5       (       d   eUR                  U R                  5      R                  5       nS[	        U5       3nSU S3n/ nUR                  5       n[        U5       H  nUR                  U R                  5      R                  5       n[        U R                   SU 35      n	UR                  5       (       a  UR                   S3n
OUR                  n
UR                  SU	 S[	        U
5       S35        M     SR                  S	R                  U5      5      nS
U S	U S3nSU S3nSU S	U S3nU$ )z"returns directory's index as html.z
Index of /z<h1>z</h1>r?   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>)r  r  r  as_posixhtml_escapeiterdirsortedr  r  r_   appendrg  join)rf   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                  rZ   r  !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rY   c                     U R                   b  SU R                   -   S-   OSnSU SU R                   SU R                  < S3$ )NrZ  r  z<StaticResource r\   -> r   )r_   r  r  re   s     rZ   r   StaticResource.__repr__  sC    (,		(=sTYY$2!$qd4??:MQOOrY   )r  r  r  r  r   r  r  r  )$rR   rS   rT   rU   r  r   rV   r!   r   r>  r   rg   r   rs   staticmethodbytesr  rE   r   r    r  r(   r   rx   r4  r   r2   r;  r*   r  r   r  r  r   rX   r   r   s   @rZ   r4   r4     s{   K  04,  %$"2"2 "2
 Dj"2 '-"2 "2 "2 "2 "2 
"2 "2P '+	' ' t	'
 
'R #5 #S # #
) 
- -T -XW X X$! !+(=1 +

W 

 

!D !D. !DF4 C @P# P PrY   r4   c                      ^  \ rS rSrS\SSSS4U 4S jjrS\SS4U 4S jjrS\SS4S	 jrS
\S\S\4S jr	S\
4S jrS\S\4S jrS\4S jrS\\   4S jrS\4S jrSrU =r$ )PrefixedSubAppResourcei  rK   rM   r6   r`   Nc                 R   > [         TU ]  U5        X l        U R                  U5        g rb   )r   rg   _app_add_prefix_to_resources)rf   rK   rM   r   s      rZ   rg   PrefixedSubAppResource.__init__  s#     	%%f-rY   c                 F   > [         TU ]  U5        U R                  U5        g rb   )r   r~   r  )rf   rK   r   s     rZ   r~   !PrefixedSubAppResource.add_prefix  s    6"%%f-rY   c                     U R                   R                  nUR                  5        H6  nUR                  U5        UR	                  U5        UR                  U5        M8     g rb   )r  router	resourcesunindex_resourcer~   index_resource)rf   rK   r  r   s       rZ   r  /PrefixedSubAppResource._add_prefix_to_resources  sP    !!((*H ##H-'!!(+ +rY   r   rq   c                     [        S5      e)Nz3.url_for() is not supported by sub-application rootr   r   s      rZ   rs   PrefixedSubAppResource.url_for  s    PQQrY   c                 4    U R                   U R                  S.$ )N)rM   rK   )r  r  rj   s    rZ   r   PrefixedSubAppResource.get_info  s    yyDLL99rY   ru   c                 (  #    U R                   R                  R                  U5      I S h  vN nUR                  U R                   5        [	        UR
                  [        5      (       a  UR
                  R                  nX#4$ [        5       nX#4$  Nd7frb   )	r  r  rx   r   r   rQ   r%   r  r  rf   ru   r  methodss       rZ   rx   PrefixedSubAppResource.resolve  s{     99++33G<<
499%j//1EFF //??G "" eG"" =s   )BBA%Bc                 \    [        U R                  R                  R                  5       5      $ rb   )r3  r  r  rL   rj   s    rZ   r4  PrefixedSubAppResource.__len__  s     499##**,--rY   c                 \    [        U R                  R                  R                  5       5      $ rb   )r9  r  r  rL   rj   s    rZ   r;  PrefixedSubAppResource.__iter__  s     DII$$++-..rY   c                 >    SU R                    SU R                  < S3$ )Nz<PrefixedSubAppResource r  r   )r  r  rj   s    rZ   r   PrefixedSubAppResource.__repr__  s    )$,,tDII=JJrY   r  )rR   rS   rT   rU   rV   rg   r~   r  r   rs   rE   r   r(   r   rx   r>  r4  r   r2   r;  r   rX   r   r   s   @rZ   r  r    s    .s . .4 .
. . .,s ,t ,RS RC RC R:) :#W # #. ./(=1 /K# K KrY   r  c                       \ rS rSr\R
                  S\S\4S j5       r\R
                  S\	4S j5       r
\\R
                  S\4S j5       5       rSrg)	rO   i  ru   r`   c                    #    g7f)z1Return bool if the request satisfies the criteriaNr9   rw   s     rZ   r   AbstractRuleMatching.match  rz   r{   c                     gr   r9   rj   s    rZ   r   AbstractRuleMatching.get_info  rp   rY   c                     g)zReturn a strNr9   rj   s    rZ   rn   AbstractRuleMatching.canonical  rp   rY   r9   N)rR   rS   rT   rU   r   r   r(   r   r   rE   r   r   rV   rn   rX   r9   rY   rZ   rO   rO     sy    @7 @t @ @ 	J) J J 3   rY   rO   c                      ^  \ rS rSr\R
                  " S5      rS\SS4U 4S jjr\	S\4S j5       r
S\S\4S jrS	\S\4S
 jrS\S\4S jrS\4S jrSrU =r$ )Domaini  z(?!-)[a-z\d-]{1,63}(?<!-)rN   r`   Nc                 N   > [         TU ]  5         U R                  U5      U l        g rb   )r   rg   
validation_domain)rf   rN   r   s     rZ   rg   Domain.__init__!  s    v.rY   c                     U R                   $ rb   r9  rj   s    rZ   rn   Domain.canonical%  r   rY   c                   ^  [        U[        5      (       d  [        S5      eUR                  S5      R	                  5       nU(       d  [        S5      eSU;   a  [        S5      e[        SU-   5      nUR                  c   e[        U 4S jUR                  R                  S5       5       5      (       d  [        S5      eUR                  S	:X  a  UR                  $ UR                   S
UR                   3$ )NzDomain must be strr:   zDomain cannot be emptyz://zScheme not supportedzhttp://c              3   Z   >#    U  H   nTR                   R                  U5      v   M"     g 7frb   )re_partrf  ).0xrf   s     rZ   	<genexpr>$Domain.validation.<locals>.<genexpr>3  s%     N6M4<<))!,,6Ms   (+zDomain not validP   :)r   rV   	TypeErrorrstripr  r   r   raw_hostallrd  port)rf   rN   r  s   `  rZ   r8  Domain.validation)  s    &#&&011s#))+566f_344)f$%||'''Ncll6H6H6MNNN/0088r><<,,q
++rY   ru   c                    #    UR                   R                  [        R                  5      nU(       d  gU R	                  U5      $ 7fr   )r  r  r   HOSTmatch_domain)rf   ru   hosts      rZ   r   Domain.match9  s4     ""499-  &&s   AArP  c                 <    UR                  5       U R                  :H  $ rb   )r  r9  rf   rP  s     rZ   rO  Domain.match_domain?  s    zz|t||++rY   c                     SU R                   0$ )NrN   r<  rj   s    rZ   r   Domain.get_infoB  s    $,,''rY   r<  )rR   rS   rT   rU   rm  ro  r@  rV   rg   r   rn   r8  r(   r   r   rO  rE   r   rX   r   r   s   @rZ   r6  r6    s    jj56G/s /t / 3  , , , '7 't ', , ,() ( (rY   r6  c                      ^  \ rS rSr\R
                  " S5      rS\SS4U 4S jjr\	S\4S j5       r
S\S\4S	 jrS
rU =r$ )
MaskDomainiF  z(?!-)[a-z\d\*-]{1,63}(?<!-)rN   r`   Nc                    > [         TU ]  U5        U R                  R                  SS5      R                  SS5      n[        R
                  " U5      U l        g )Nr:   z\.*z.*)r   rg   r9  r  rm  ro  _mask)rf   rN   maskr   s      rZ   rg   MaskDomain.__init__I  sC     ||##C/77TBZZ%
rY   c                 .    U R                   R                  $ rb   )r[  rI   rj   s    rZ   rn   MaskDomain.canonicalN  s    zz!!!rY   rP  c                 <    U R                   R                  U5      S L$ rb   )r[  rf  rS  s     rZ   rO  MaskDomain.match_domainR  s    zz##D)55rY   )r[  )rR   rS   rT   rU   rm  ro  r@  rV   rg   r   rn   r   rO  rX   r   r   s   @rZ   rX  rX  F  sX    jj78G&s &t &
 "3 " "6 6 6 6rY   rX  c                   p    \ rS rSrS\SSSS4S jr\S\4S j5       rS\	4S	 jr
S
\S\4S jrS\4S jrSrg)MatchedSubAppResourceiV  rP   rM   r6   r`   Nc                 T    [         R                  U 5        SU l        X l        Xl        g )Nr  )r.   rg   r  r  _rule)rf   rP   rM   s      rZ   rg   MatchedSubAppResource.__init__W  s!    !!$'	
rY   c                 .    U R                   R                  $ rb   )re  rn   rj   s    rZ   rn   MatchedSubAppResource.canonical]  s    zz###rY   c                 4    U R                   U R                  S.$ )N)rM   rP   )r  re  rj   s    rZ   r   MatchedSubAppResource.get_infoa  s    yy$**55rY   ru   c                   #    U R                   R                  U5      I S h  vN (       d  S [        5       4$ U R                  R                  R                  U5      I S h  vN nUR                  U R                  5        [        UR                  [        5      (       a  UR                  R                  nX#4$ [        5       nX#4$  N Nf7frb   )re  r   r  r  r  rx   r   r   rQ   r%   r  r$  s       rZ   rx   MatchedSubAppResource.resolved  s     ZZ%%g...;99++33G<<
499%j//1EFF //??G "" eG"" /<s"   CC=CC A%CCc                 $    SU R                   < S3$ )Nz<MatchedSubAppResource -> r   r-  rj   s    rZ   r   MatchedSubAppResource.__repr__o  s    +DII=::rY   )r  r  re  )rR   rS   rT   rU   rO   rg   r   rV   rn   rE   r   r(   r   rx   r   rX   r9   rY   rZ   rc  rc  V  sc    1  $  $3 $ $6) 6	#W 	# 	#;# ;rY   rc  c                      ^  \ rS rSrSrSS.S\S\\\   -  S\	S\
S-  S	S4
U 4S
 jjjrS	\4S jr\S	\S-  4S j5       rS\S\S	\4S jrS	\4S jrSrU =r$ )r3   is  zA route with resourceNr  r   r   r   r   r`   c                "   > [         TU ]  XXCS9  g )Nr   )r   rg   )rf   r   r   r   r   r   s        rZ   rg   ResourceRoute.__init__v  s     	N 	 	
rY   c                 V    SU R                    SU R                   SU R                  < 3$ )Nz<ResourceRoute [z] r  )r   r   r   rj   s    rZ   r   ResourceRoute.__repr__  s)    !$++b0@T\\DTUUrY   c                 J    U R                   c  g U R                   R                  $ rb   )r   r_   rj   s    rZ   r_   ResourceRoute.name  s    >>!~~"""rY   r   rq   c                 X    U R                   c   eU R                   R                  " U0 UD6$ )r   )r   rs   r   s      rZ   rs   ResourceRoute.url_for  s,    ~~)))~~%%t6v66rY   c                 T    U R                   c   eU R                   R                  5       $ rb   )r   r   rj   s    rZ   r   ResourceRoute.get_info  s%    ~~)))~~&&((rY   r9   )rR   rS   rT   rU   __doc__rV   r    r   r   r.   r   rg   r   r   r_   r   rs   rE   r   rX   r   r   s   @rZ   r3   r3   s  s     15



 4--

 #	

 '-

 


 

V# V #cDj # #
7S 7C 7C 7
)) ) )rY   r3   c                      ^  \ rS rSrS\SS4U 4S jjrS\S\S\4S jr\	S\S-  4S	 j5       r
S\4S
 jrS\S\4S jr\	S\4S j5       r\	S\4S j5       rS\4S jrSrU =r$ )r  i  rQ   r`   Nc                 b   > [         TU ]  [        R                  U R                  5        Xl        g rb   )r   rg   r   r&  r  _http_exceptionr  s     rZ   rg   SystemRoute.__init__  s     5-rY   r   rq   c                     [        S5      e)Nz).url_for() is not allowed for SystemRouter  r   s      rZ   rs   SystemRoute.url_for  s    FGGrY   c                     g rb   r9   rj   s    rZ   r_   SystemRoute.name  r   rY   c                     SU R                   0$ )NrQ   r}  rj   s    rZ   r   SystemRoute.get_info  s     $"6"677rY   ru   c                 "   #    U R                   e7frb   r  rw   s     rZ   r  SystemRoute._handle  s     """s   c                 .    U R                   R                  $ rb   )r}  r	  rj   s    rZ   r	  SystemRoute.status      ##***rY   c                 .    U R                   R                  $ rb   )r}  r
  rj   s    rZ   r
  SystemRoute.reason  r  rY   c                 <    SU R                    SU R                   S3$ )Nz<SystemRoute r   r   )r	  r
  rj   s    rZ   r   SystemRoute.__repr__  s    t{{m2dkk]!<<rY   r  )rR   rS   rT   rU   r"   rg   rV   r   rs   r   r_   rE   r   r(   r*   r  r>  r	  r
  r   rX   r   r   s   @rZ   r  r    s    .} . .HS HC HC H cDj  8) 8#W # # + + + + + +=# = =rY   r  c                   J    \ rS rSrS\4S jrS\SS\4   4S jrS\4S jr	Sr
g)r5   i  r`   c                 P  #    U R                   R                  [        R                  ;  a  U R	                  5         [        X R                   R                  R                  5       S 5      nUc  U R	                  5         U" 5       I S h  vN n[        U[        5      (       d   eU$  N7frb   )	ru   r   r   METH_ALL_raise_allowed_methodsgetattrr  r   r*   )rf   r   rets      rZ   _iter
View._iter  s}     <<dmm3'')||2288:DA>'')Hn#~....
 s   BB&B$B&Nc                 >    U R                  5       R                  5       $ rb   )r  	__await__rj   s    rZ   r  View.__await__  s    zz|%%''rY   c                     [         R                   Vs1 s H%  n[        XR                  5       5      (       d  M#  UiM'     nn[	        U R
                  R                  U5      es  snf rb   )r   r  hasattrr  r%   ru   r   )rf   r  r  s      rZ   r  View._raise_allowed_methods  sD    &*mmPmwtWWY7O1mP"4<<#6#6HH Qs
   "A!A!r9   )rR   rS   rT   rU   r*   r  r   r  r   r  rX   r9   rY   rZ   r5   r5     s4    	^ 	(9T4%?@ (I IrY   r5   c                   `    \ rS rSrS\\   SS4S jrS\4S jrS\	\   4S jr
S\S\4S	 jrS
rg)ResourcesViewi  r  r`   Nc                     Xl         g rb   
_resources)rf   r  s     rZ   rg   ResourcesView.__init__  s    #rY   c                 ,    [        U R                  5      $ rb   )r3  r  rj   s    rZ   r4  ResourcesView.__len__  s    4??##rY   c              #   8   #    U R                    S h  vN   g  N7frb   r  rj   s    rZ   r;  ResourcesView.__iter__  s     ??""   r   c                     XR                   ;   $ rb   r  rf   r   s     rZ   __contains__ResourcesView.__contains__  s    ??**rY   r  )rR   rS   rT   rU   listr.   rg   r>  r4  r   r;  objectr   r  rX   r9   rY   rZ   r  r    sL    $$'7"8 $T $$ $#(#34 #+V + +rY   r  c                   \    \ rS rSrS\\   4S jrS\4S jrS\	\
   4S jrS\S\4S jrS	rg
)
RoutesViewi  r  c                 l    / U l         U H'  nU H  nU R                   R                  U5        M      M)     g rb   )r  r  )rf   r  r   r   s       rZ   rg   RoutesView.__init__  s/    ,.!H!##E* " "rY   r`   c                 ,    [        U R                  5      $ rb   r2  rj   s    rZ   r4  RoutesView.__len__  r6  rY   c              #   8   #    U R                    S h  vN   g  N7frb   r  rj   s    rZ   r;  RoutesView.__iter__  s     <<r  r   c                     XR                   ;   $ rb   r  r(  s     rZ   r  RoutesView.__contains__  s    $$rY   r  N)rR   rS   rT   rU   r  r.   rg   r>  r4  r   r2   r;  r  r   r  rX   r9   rY   rZ   r  r    sD    +$'7"8 +! ! (=1  %& %T %rY   r  c                     ^  \ rS rSr\R
                  " S5      rS5U 4S jjrS\S\	4S jr
S\\   4S jrS\4S	 jrS
\S\4S jrS\S\4S jrS\4S jrS\4S jrS\\\4   4S jrS
\SS4S jrS
\S\4S jrS
\SS4S jrS
\SS4S jrSS.S\S\S-  S\4S jjr SSS.S\S\S\!\"\#   -  S\S-  S\$S-  S\%4S jjr&SS\'SSSS.S\S\(S\S-  S\$S-  S \S!\S"\S#\S\4S$ jjr)S\S\!S%\*S\%4S& jr+S\S\!S%\*S\%4S' jr,SS(S).S\S\!S\S-  S*\S%\*S\%4S+ jjr-S\S\!S%\*S\%4S, jr.S\S\!S%\*S\%4S- jr/S\S\!S%\*S\%4S. jr0S\S\!S%\*S\%4S/ jr1S\S\"\#   S%\*S\%4S0 jr2S5U 4S1 jjr3S2\4\5   S\6\%   4S3 jr7S4r8U =r9$ )6r,   i  z[.:-]r`   Nc                 Z   > [         TU ]  5         / U l        0 U l        0 U l        / U l        g rb   )r   rg   r  _named_resources_resource_index_matched_sub_app_resourcesr   s    rZ   rg   UrlDispatcher.__init__  s-    24=?BDGI'rY   ru   c                 4  #    U R                   n[        5       nU R                   H)  nUR                  U5      I S h  vN u  pVUb  Us  $ X6-  nM+     UR                  R
                  nU(       al  UR                  US5       H)  nUR                  U5      I S h  vN u  pVUb  Us  $ X6-  nM+     US:X  a  O&UR                  S5      S   =(       d    SnU(       a  Ml  U(       a  [        [        UR                  U5      5      $ [        [        5       5      $  N N}7f)Nr9   r?   r   )r  r  r  rx   r,  r-  r  
rpartitionr   r%   r   r&   )	rf   ru   resource_indexr  r   r   allowedurl_part	candidates	            rZ   rx   UrlDispatcher.resolve  s
    --$'E 77H(0(8(8(A"AJ%!!* 8 ??,,+//"=	,5,=,=g,F&F#
)%%#.O > 3**3/29cH h !"6w~~"WXXln--5 #B 'Gs)   :DDADDA D:DDc                 ,    [        U R                  5      $ rb   )r9  r  rj   s    rZ   r;  UrlDispatcher.__iter__  s    D))**rY   c                 ,    [        U R                  5      $ rb   )r3  r  rj   s    rZ   r4  UrlDispatcher.__len__  s    4(())rY   r   c                     XR                   ;   $ rb   r  r  s     rZ   r  UrlDispatcher.__contains__   s    0000rY   r_   c                      U R                   U   $ rb   r  re   s     rZ   __getitem__UrlDispatcher.__getitem__#  s    $$T**rY   c                 ,    [        U R                  5      $ rb   )r  r  rj   s    rZ   r  UrlDispatcher.resources&  s    T__--rY   c                 ,    [        U R                  5      $ rb   )r  r  rj   s    rZ   rL   UrlDispatcher.routes)  s    $//**rY   c                 ,    [        U R                  5      $ rb   )r   r  rj   s    rZ   named_resourcesUrlDispatcher.named_resources,  s     5 566rY   c                    [        U[        5      (       d   SU< 35       eU R                  (       a  [        S5      eUR                  nUb  U R
                  R                  U5      nU HS  n[        R                  " U5      (       a  [        SU< S35      eUR                  5       (       a  ME  [        SU< S35      e   X R                  ;   a   [        SU< SU R                  U   < 35      eXR                  U'   U R                  R                  U5        [        U[        5      (       a  U R                  R                  U5        g U R!                  U5        g )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 namezV, the name should be a sequence of python identifiers separated by dash, dot or columnz
Duplicate z, already handled by )r   r.   frozenr   r_   NAME_SPLIT_RErd  keyword	iskeywordr   isidentifierr  r  r  rc  r  r  )rf   r   r_   r  rs  s        rZ   register_resourceUrlDispatcher.register_resource/  sb   &
 
 	OA(N	O 
 ;;OPP}}&&,,T2E$$T**$/x 8) ) 
 ((**$/x 81 1   ,,,   )**.*?*?*E)HJ  +3!!$'x(h 566++228<)rY   c                     SUR                   =n;   a&  UR                  S5      S   R                  S5      S   nUR                  S5      =(       d    S$ )z9Return a key to index the resource in the resource index.ra  r   r?   )rn   	partitionr  rH  )rf   r   	index_keys      rZ   _get_resource_index_key%UrlDispatcher._get_resource_index_keyV  sR     2 2293 "++C03>>sCAFI$++rY   c                 |    U R                  U5      nU R                  R                  U/ 5      R                  U5        g)z%Add a resource to the resource index.N)r  r  
setdefaultr  rf   r   resource_keys      rZ   r  UrlDispatcher.index_resourcea  s5    33H= 	''b9@@JrY   c                 b    U R                  U5      nU R                  U   R                  U5        g)z*Remove a resource from the resource index.N)r  r  remover  s      rZ   r  UrlDispatcher.unindex_resourcei  s+    33H=\*11(;rY   r^   rG   c                   U(       a!  UR                  S5      (       d  [        S5      eU R                  (       aE  U R                  S   nUR                  U:X  a&  UR	                  U5      (       a  [        [        U5      $ SU;   d<  SU;   d6  [        R                  U5      (       d  [        XS9nU R                  U5        U$ [        XS9nU R                  U5        U$ )Nr?   z)path should be started with / or be emptyra  rb  r^   )rA  r   r  r_   r   r   r/   r>   searchr0   r  r1   )rf   rG   r_   r   s       rZ   add_resourceUrlDispatcher.add_resourcen  s    ,,HII??r*H}}$););D)A)AHh//tsd{hood.C.C$T5H""8,O"43x(rY   )r_   r   r   r   r   c                @    U R                  X$S9nUR                  XUS9$ )Nr^   r  )r  r#  )rf   r   rG   r   r_   r   r   s          rZ   r#  UrlDispatcher.add_route~  s-     $$T$5!!&.!QQrY   Fr  rK   r  r  r  r  c                    UR                  S5      (       d   eUR                  S5      (       a  USS n[        UUUUUUUUS9n	U R                  U	5        U	$ )zFAdd static files view.

prefix - url prefix
path - folder with files

r?   Nr  r  )rA  rK  r4   r  )
rf   rK   rG   r_   r   r  r  r  r  r   s
             rZ   
add_staticUrlDispatcher.add_static  sl    $   %%%%??3CR[F!)!!+)	
 	x(rY   rq   c                 F    U R                   " [        R                  X40 UD6$ )z(Shortcut for add_route with method HEAD.)r#  r   	METH_HEADrf   rG   r   rq   s       rZ   add_headUrlDispatcher.add_head      ~~dnndFvFFrY   c                 F    U R                   " [        R                  X40 UD6$ )z+Shortcut for add_route with method OPTIONS.)r#  r   METH_OPTIONSr  s       rZ   add_optionsUrlDispatcher.add_options  s    ~~d//I&IIrY   T)r_   
allow_headr   c                    U R                  XS9nU(       a"  UR                  " [        R                  U40 UD6  UR                  " [        R                  U40 UD6$ )zShortcut for add_route with method GET.

If allow_head is true, another
route is added allowing head requests to the same endpoint.
r^   )r  r#  r   r  METH_GET)rf   rG   r   r_   r   rq   r   s          rZ   add_getUrlDispatcher.add_get  sO     $$T$5t~~wA&A!!$--CFCCrY   c                 F    U R                   " [        R                  X40 UD6$ )z(Shortcut for add_route with method POST.)r#  r   	METH_POSTr  s       rZ   add_postUrlDispatcher.add_post  r  rY   c                 F    U R                   " [        R                  X40 UD6$ )z'Shortcut for add_route with method PUT.)r#  r   METH_PUTr  s       rZ   add_putUrlDispatcher.add_put  s    ~~dmmTEfEErY   c                 F    U R                   " [        R                  X40 UD6$ )z)Shortcut for add_route with method PATCH.)r#  r   
METH_PATCHr  s       rZ   	add_patchUrlDispatcher.add_patch  s    ~~dootGGGrY   c                 F    U R                   " [        R                  X40 UD6$ )z*Shortcut for add_route with method DELETE.)r#  r   METH_DELETEr  s       rZ   
add_deleteUrlDispatcher.add_delete  s    ~~d..HHHrY   c                 F    U R                   " [        R                  X40 UD6$ )z?Shortcut for add_route with ANY methods for a class-based view.)r#  r   r&  r  s       rZ   add_viewUrlDispatcher.add_view  s     ~~dmmTEfEErY   c                 h   > [         TU ]  5         U R                   H  nUR                  5         M     g rb   )r   r   r  )rf   r   r   s     rZ   r   UrlDispatcher.freeze  s%    HOO (rY   rL   c                 \    / nU H#  nUR                  UR                  U 5      5        M%     U$ )zAppend routes to route table.

Parameter should be a sequence of RouteDef objects.

Returns a list of registered AbstractRoute instances.
)extendregister)rf   rL   registered_routes	route_defs       rZ   
add_routesUrlDispatcher.add_routes  s3     I$$Y%7%7%=>    rY   )r  r  r  r  r   ):rR   rS   rT   rU   rm  ro  r  rg   r(   r-   rx   r   rV   r;  r>  r4  r  r   r  r.   r  r  r  r  rL   r	   r  r  r  r  r  r/   r  r    r   r   r   r2   r#  r   r!   r  r   r  r  r  r  r  r  r  r  r   r   r+   r  r  rX   r   r   s   @rZ   r,   r,     s   JJx(MJ'.W '.1D '.R+(3- +* *1V 1 1+ +(8 +.= .+
 +7.>)>!? 7%**: %*t %*N	,0@ 	,S 	,K'7 KD K<)9 <d <
 =A  sTz X ,  04
R
R 
R 4--	
R Dj
R '-
R 

R"  04,  %$    
 Dj  '-          
 DGS G7 Gc Gm GJ Jg J J J  DD D
 Dj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 
! 
!rY   r,   r  c                 x    [         S:  a  U R                  SS5      n [        R                  " U SS9R                  $ )Nr  r  r  FrU  )r<   r  r   rW  raw_pathr  s    rZ   r  r    s1    fc5)99%/888rY   c                 V    SU ;  a  U $ U R                  SS5      R                  SS5      $ )Nr  z%2Fr?   r  )r  r#  s    rZ   r}  r}    s-    
%==$,,UC88rY   c                 L    [        U 5      nSU ;   a  UR                  SS5      nU$ )Nr  r  )r  r  )r  r   s     rZ   rl  rl    s*     F
e|s+MrY   )zr   r   r  	functoolsr  r	  r   r  r  platformrm  r   r   collections.abcr   r   r   r   r   r   r	   r
   r   pathlibr   r   typesr   typingr   r   r   r   r   r   r   yarlr   r   yarl_versionr  r   r   r   r   helpersr   r   httpr   typedefsr    r!   web_exceptionsr"   r#   r$   r%   r&   web_fileresponser'   web_requestr(   web_responser)   r*   web_routedefr+   __all__web_appr6   r   rV   BaseDictr   r   r  r   mapr>  rd  r<   rW   ro  r=   r>   rn  r@   systemrB   r   r   r  r   partialr  rE   r.   ABCr2   r-   r   r   r/   r0   r1   r  r4   r  rO   r6  rX  rc  r3   r  r5   r  r  r,   r  r}  rl  r9   rY   rZ   <module>r=     sX   
        	  	 
 	 	 	    " Q Q Q 1  @ @ .  '  +   2 * $CH~HH,/,<,<w,F,B ',Sl6H6H6Mbq6Q-R'SeE#s(O$ S&(jj+'gcl#  !#

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