
    /js                       d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	m
Z
mZmZmZmZ d dlmZmZmZ d dlmZ d dlmZ d dlmZmZ d dlmZ d d	lmZmZ d d
lmZ d dlm Z m!Z! d dl"m#Z#m$Z$m%Z% d dl&m'Z'm(Z( d dl)m*Z* d dl+m,Z, d dl-m.Z.m/Z/m0Z0 d dl1m2Z2m3Z3m4Z4m5Z5m6Z6 d dl7m8Z8m9Z9  G d de:      Z; G d de      Z<	 	 	 	 d/dZ=	 	 	 	 d0dZ>d1dZ?	 	 	 	 	 	 	 	 d2dZ@ ej                  d      ZB	 	 	 	 d3dZC G d d      ZD G d d eD      ZE G d! d"eD      ZF G d# d$eD      ZG G d% d&eD      ZH ed'      ZI G d( d)eeI         ZJ	 	 	 	 d4d*ZK G d+ d,      ZL G d- d.      ZMy)5    )annotationsN)	AwaitableCallable
Collection	GeneratorSequence)AbstractAsyncContextManagerAbstractContextManagerasynccontextmanager)Enum)Pattern)AnyTypeVar)wrap_app_handling_exceptions)get_route_pathis_async_callable)run_in_threadpool)CONVERTOR_TYPES	Convertor)URLHeadersURLPath)HTTPExceptionStarletteDeprecationWarning)
Middleware)Request)PlainTextResponseRedirectResponseResponse)ASGIAppLifespanReceiveScopeSend)	WebSocketWebSocketClosec                  $     e Zd ZdZd fdZ xZS )NoMatchFoundz}
    Raised by `.url_for(name, **path_params)` and `.url_path_for(name, **path_params)`
    if no matching route exists.
    c                    dj                  t        |j                                     }t        |   d| d| d       y )N, zNo route exists for name "z" and params "z".)joinlistkeyssuper__init__)selfnamepath_paramsparams	__class__s       O/var/www/html/maxservice/venv/lib/python3.12/site-packages/starlette/routing.pyr/   zNoMatchFound.__init__#   s=    4 0 0 2345dV>&QSTU    )r1   strr2   zdict[str, Any]returnNone)__name__
__module____qualname____doc__r/   __classcell__)r4   s   @r5   r(   r(      s    
V Vr6   r(   c                      e Zd ZdZdZdZy)Matchr         N)r:   r;   r<   NONEPARTIALFULL r6   r5   r@   r@   (   s    DGDr6   r@   c                b    t        |       r| nt        j                  t        |       dfd}|S )zi
    Takes a function or coroutine `func(request) -> response`,
    and returns an ASGI application.
    c                t   K   t        | ||      dfd} t        |      | ||       d {    y 7 w)Nc                Z   K           d {   } || ||       d {    y 7 7 wNrF   )scopereceivesendresponsefrequests       r5   appz*request_response.<locals>.app.<locals>.app<   s.     wZ'H5'4000 (0s   +'+)++rK   r#   rL   r"   rM   r$   r8   r9   )r   r   )rK   rL   rM   rQ   rP   rO   s       @r5   rQ   zrequest_response.<locals>.app9   s8     %$/	1 9*38NNNs   ,868rR   )r   	functoolspartialr   )funcrQ   rO   s     @r5   request_responserV   .   s2     "$'Y->->?PRV-W O Jr6   c                     d fd}|S )zM
    Takes a coroutine `func(session)`, and returns an ASGI application.
    c                v   K   t        | ||      dfd} t        |      | ||       d {    y 7 w)N)rL   rM   c                2   K           d {    y 7 wrJ   rF   )rK   rL   rM   rU   sessions      r5   rQ   z+websocket_session.<locals>.app.<locals>.appP   s     w-s   rR   )r%   r   )rK   rL   rM   rQ   rZ   rU   s       @r5   rQ   zwebsocket_session.<locals>.appM   s8     E7>	  9*38NNNs   -979rR   rF   )rU   rQ   s   ` r5   websocket_sessionr[   E   s    O Jr6   c                D    t        | d| j                  j                        S )Nr:   )getattrr4   r:   )endpoints    r5   get_namer_   X   s    8Z););)D)DEEr6   c                    t        |j                               D ]O  \  }}d|z   dz   | v s||   }|j                  |      }| j                  d|z   dz   |      } |j	                  |       Q | |fS )N{})r,   items	to_stringreplacepop)pathparam_convertorsr2   keyvalue	convertors         r5   replace_paramsrl   \   s    
 ;,,./ !
U9s?d"(-I''.E<<c	C7DOOC ! r6   z4{([a-zA-Z_][a-zA-Z0-9_]*)(:[a-zA-Z_][a-zA-Z0-9_]*)?}c                x   | j                  d       }d}d}t               }d}i }t        j                  |       D ]  }|j	                  d      \  }}	|	j                  d      }	|	t        v sJ d|	 d       t        |	   }
|t        j                  | ||j                                z  }|d	| d
|
j                   dz  }|| ||j                          z  }|d|z  z  }||v r|j                  |       |
||<   |j                         } |r@dj                  t        |            }t        |      dkD  rdnd}t!        d| d| d|        |r3| |d j#                  d      d   }|t        j                  |      dz   z  }n|t        j                  | |d       dz   z  }|| |d z  }t        j$                  |      ||fS )a*  
    Given a path string, like: "/{username:str}",
    or a host string, like: "{subdomain}.mydomain.org", return a three-tuple
    of (regex, format, {param_name:convertor}).

    regex:      "/(?P<username>[^/]+)"
    format:     "/{username}"
    convertors: {"username": StringConvertor()}
    /^ r   r7   :zUnknown path convertor ''z(?P<>)z{%s}r*   rA   szDuplicated param name z	 at path N$)
startswithsetPARAM_REGEXfinditergroupslstripr   reescapestartregexaddendr+   sortedlen
ValueErrorsplitcompile)rg   is_host
path_regexpath_formatduplicated_paramsidxrh   match
param_nameconvertor_typerk   namesendinghostnames                 r5   compile_pathr   n   s    //#&&GJK"%%
C%%d+ %*\\%%8"
N'..s30^4L^L\\]2^^0#N3	biiS5;;= 9::
ZL)//):!<<
tC%++-00v
**))!!*-'0$iik#& 		&!234-.20%	$PQQ:##C(+bii)C//
biiST
+c11
4:K::j!;0@@@r6   c                  ,    e Zd ZddZddZddZddZy)		BaseRoutec                    t               rJ   NotImplementedError)r0   rK   s     r5   matcheszBaseRoute.matches       !##r6   c                   t               rJ   r   )r0   r1   r2   s      r5   url_path_forzBaseRoute.url_path_for   r   r6   c                   K   t               wrJ   r   r0   rK   rL   rM   s       r5   handlezBaseRoute.handle   s     !##s   c                X  K   | j                  |      \  }}|t        j                  k(  rM|d   dk(  r t        dd      } ||||       d{    y|d   dk(  rt	               } ||||       d{    y|j                  |       | j                  |||       d{    y7 W7 47 	w)z
        A route may be used in isolation as a stand-alone ASGI app.
        This is a somewhat contrived case, as they'll almost always be used
        within a Router, but could be useful for some tooling and minimal apps.
        typehttp	Not Found  status_codeN	websocket)r   r@   rC   r   r&   updater   )r0   rK   rL   rM   r   child_scoperN   websocket_closes           r5   __call__zBaseRoute.__call__   s      "\\%0{EJJV}&,[cJugt444  v+-"0"2%eWd;;;[!kk%$/// 5 < 	0s6   A
B*B$$B*1B&2,B*B(B*&B*(B*NrK   r#   r8   ztuple[Match, Scope]r1   r7   r2   r   r8   r   rR   )r:   r;   r<   r   r   r   r   rF   r6   r5   r   r      s    $$$0r6   r   c                  b    e Zd Zddddd	 	 	 	 	 	 	 	 	 	 	 	 	 d
dZddZddZddZddZdd	Zy)RouteNT)methodsr1   include_in_schema
middlewarec                  |j                  d      sJ d       || _        || _        |t        |      n|| _        || _        |}t        |t        j                        r'|j                  }t        |t        j                        r't        j                  |      st        j                  |      rt        |      | _        |dg}n|| _        |/t        |      D ]!  \  }}	}
 || j                  g|	i |
| _        # |d | _        nL|D ch c]  }|j#                          c}| _        d| j                   v r| j                   j%                  d       t'        |      \  | _        | _        | _        y c c}w )Nrn    Routed paths must start with '/'GETHEAD)rx   rg   r^   r_   r1   r   
isinstancerS   rT   rU   inspect
isfunctionismethodrV   rQ   reversedr   upperr   r   r   r   rh   )r0   rg   r^   r   r1   r   r   endpoint_handlerclsargskwargsmethods               r5   r/   zRoute.__init__   sW    s#G%GG#	 *.,HX&D	!2#)9+<+<=/44 )9+<+<=./73C3CDT3U'1DH '  DH!%-j%9 :!T6txx9$9&9: ?DL9@AvFLLNADL$  (COPTCU@)4+@	 Bs   E2c                   |d   dk(  rt        |      }| j                  j                  |      }|r|j                         }|j	                         D ]&  \  }}| j
                  |   j                  |      ||<   ( t        |j                  di             }|j                  |       | j                  |d}| j                  r#|d   | j                  vrt        j                  |fS t        j                  |fS t        j                  i fS )Nr   r   r2   r^   r2   r   )r   r   r   	groupdictrc   rh   convertdictgetr   r^   r   r@   rD   rE   rC   	r0   rK   
route_pathr   matched_paramsri   rj   r2   r   s	            r5   r   zRoute.matches   s    =F"'.JOO))*5E!&!2"0"6"6"8 TJC*.*?*?*D*L*LU*SN3'T"599]B#?@"">2+/==U<<E(O4<<$G ==+55 ::{22zz2~r6   c               $   t        |j                               }t        | j                  j                               }|| j                  k7  s||k7  rt	        ||      t        | j                  | j                  |      \  }}|rJ t        |d      S )Nr   rg   protocolry   r-   rh   r1   r(   rl   r   r   r0   r1   r2   seen_paramsexpected_paramsrg   remaining_paramss          r5   r   zRoute.url_path_for   s    +**,-d3388:;499 >t[11!/0@0@$BWBWYd!e###D622r6   c                "  K   | j                   r`|d   | j                   vrOddj                  | j                         i}d|v rt        d|      t        dd|      } ||||       d {    y | j	                  |||       d {    y 7 !7 w)Nr   Allowr*   rQ   i  )r   headerszMethod Not Allowed)r   r+   r   r   rQ   )r0   rK   rL   rM   r   rN   s         r5   r   zRoute.handle  s     <<E(O4<<?		$,, 78G~#WEE,-As\cd5'4000((5'4000 10s$   A'B)B*BBBBc                    t        |t              xrO | j                  |j                  k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S rJ   )r   r   rg   r^   r   r0   others     r5   __eq__zRoute.__eq__  sR    ue$ .		UZZ'./. -		
r6   c                    | j                   j                  }t        | j                  xs g       }| j                  | j
                  }}| d|d|d|dS )N(path=, name=z
, methods=rt   )r4   r:   r   r   rg   r1   )r0   
class_namer   rg   r1   s        r5   __repr__zRoute.__repr__  sT    ^^,,
+,YY		dVD874(*WKqQQr6   )rg   r7   r^   Callable[..., Any]r   Collection[str] | Noner1   
str | Noner   boolr   Sequence[Middleware] | Noner8   r9   r   r   rR   r   r   r8   r   r8   r7   	r:   r;   r<   r/   r   r   r   r   r   rF   r6   r5   r   r      s|     +/"&26'V'V %'V
 ('V 'V  'V 0'V 
'VR$	3	1
Rr6   r   c                  V    e Zd Zddd	 	 	 	 	 	 	 	 	 d	dZd
dZddZddZddZddZy)WebSocketRouteN)r1   r   c                   |j                  d      sJ d       || _        || _        |t        |      n|| _        |}t        |t        j                        r'|j                  }t        |t        j                        r't        j                  |      st        j                  |      rt        |      | _        n|| _        |/t        |      D ]!  \  }}} || j                  g|i || _        # t        |      \  | _        | _        | _        y )Nrn   r   )rx   rg   r^   r_   r1   r   rS   rT   rU   r   r   r   r[   rQ   r   r   r   r   rh   )	r0   rg   r^   r1   r   r   r   r   r   s	            r5   r/   zWebSocketRoute.__init__&  s     s#G%GG#	 *.,HX&D	#)9+<+<=/44 )9+<+<=./73C3CDT3U(2DH  DH!%-j%9 :!T6txx9$9&9: DPPTCU@)4+@r6   c                   |d   dk(  rt        |      }| j                  j                  |      }|r|j                         }|j	                         D ]&  \  }}| j
                  |   j                  |      ||<   ( t        |j                  di             }|j                  |       | j                  |d}t        j                  |fS t        j                  i fS )Nr   r   r2   r   )r   r   r   r   rc   rh   r   r   r   r   r^   r@   rE   rC   r   s	            r5   r   zWebSocketRoute.matchesC  s    =K''.JOO))*5E!&!2"0"6"6"8 TJC*.*?*?*D*L*LU*SN3'T"599]B#?@"">2+/==Uzz;..zz2~r6   c               $   t        |j                               }t        | j                  j                               }|| j                  k7  s||k7  rt	        ||      t        | j                  | j                  |      \  }}|rJ t        |d      S )Nr   r   r   r   s          r5   r   zWebSocketRoute.url_path_forR  s    +**,-d3388:;499 >t[11!/0@0@$BWBWYd!e###D;77r6   c                F   K   | j                  |||       d {    y 7 wrJ   rQ   r   s       r5   r   zWebSocketRoute.handle]       hhugt,,,   !!c                    t        |t              xr4 | j                  |j                  k(  xr | j                  |j                  k(  S rJ   )r   r   rg   r^   r   s     r5   r   zWebSocketRoute.__eq__`  s9    %0pTYY%**5LpQUQ^Q^bgbpbpQppr6   c                h    | j                   j                   d| j                  d| j                  dS )Nr   r   rt   )r4   r:   rg   r1   r0   s    r5   r   zWebSocketRoute.__repr__c  s/    ..))*&WTYYMQRSSr6   )
rg   r7   r^   r   r1   r   r   r   r8   r9   r   r   rR   r   r   r   rF   r6   r5   r   r   %  s`      26VV %V
 V 0V 
V:	8-qTr6   r   c                  r    e Zd Z	 	 	 d
dd	 	 	 	 	 	 	 	 	 	 	 ddZedd       ZddZddZddZddZ	dd	Z
y)MountNr   c                  |dk(  s|j                  d      sJ d       |	|J d       |j                  d      | _        ||| _        nt	        |      | _        | j                  | _        |/t        |      D ]!  \  }}} || j
                  g|i || _        # || _        t        | j                  dz         \  | _	        | _
        | _        y )Nrp   rn   r   z0Either 'app=...', or 'routes=' must be specified)routesz/{path:path})rx   rstriprg   	_base_appRouterrQ   r   r1   r   r   r   rh   )	r0   rg   rQ   r   r1   r   r   r   r   s	            r5   r/   zMount.__init__h  s     rzT__S1U3UU1&"4h6hh4KK$	?&)DN#62DN>>!%-j%9 :!T6txx9$9&9:	COPTPYPY\jPjCk@)4+@r6   c                0    t        | j                  dg       S Nr   )r]   r   r   s    r5   r   zMount.routes  s    t~~x44r6   c                F   |d   dv r|j                  dd      }t        |      }| j                  j                  |      }|r|j	                         }|j                         D ]&  \  }}| j                  |   j                  |      ||<   ( d|j                  d      z   }|d t        |        }	t        |j                  di             }
|
j                  |       |
|j                  d|      ||	z   | j                  d	}t        j                  |fS t        j                  i fS )
Nr   r   r   	root_pathrp   rn   rg   r2   app_root_path)r2   r  r   r^   )r   r   r   r   r   rc   rh   r   rf   r   r   r   rQ   r@   rE   rC   )r0   rK   r   r   r   r   ri   rj   remaining_pathmatched_pathr2   r   s               r5   r   zMount.matches  s   =11		+r2I'.JOO))*5E!&!2"0"6"6"8 TJC*.*?*?*D*L*LU*SN3'T!$~'9'9&'A!A)*@S-@,@A"599]B#?@"">2#. &+YY	%J!*\!9 $  zz;..zz2~r6   c                  | j                   \|| j                   k(  rMd|v rI|d   j                  d      |d<   t        | j                  | j                  |      \  }}|st        |      S | j                   |j                  | j                   dz         r| j                   |}n|t        | j                         dz   d  }|j                  d      }d|d<   t        | j                  | j                  |      \  }}|||d<   | j                  xs g D ]I  }	  |j                  |fi |}	t        |j                  d      t        |	      z   |	j                        c S  t        ||      # t        $ r Y cw xY w)Nrg   rn   )rg   rq   rA   rp   r   )r1   r}   rl   r   rh   r   rx   r   r   r   r   r   r7   r   r(   )
r0   r1   r2   rg   r   remaining_name
path_kwargpath_prefixrouteurls
             r5   r   zMount.url_path_for  sy   99 TTYY%66[;P"-f"5"<"<S"AK%3D4D4DdF[F[]h%i"D"#D))YY$//$))c/"Byy !% "&c$))nq&8&:!;$0J"$K,:4;K;KTMbMbdo,p)K)%+5 (* ,%,,^P?OPC"(:(:3(?#c((JUXUaUabb 4-- $ s   AE&&	E21E2c                F   K   | j                  |||       d {    y 7 wrJ   r   r   s       r5   r   zMount.handle  r   r   c                    t        |t              xr4 | j                  |j                  k(  xr | j                  |j                  k(  S rJ   )r   r   rg   rQ   r   s     r5   r   zMount.__eq__  s6    %']DII,C]TYT]T]H]]r6   c                    | j                   j                  }| j                  xs d}| d| j                  d|d| j                  dS )Nrp   r   r   , app=rt   )r4   r:   r1   rg   rQ   r0   r   r1   s      r5   r   zMount.__repr__  F    ^^,,
yyBVDII=xvdhh\QRSSr6   )NNN)rg   r7   rQ   ASGIApp | Noner   Sequence[BaseRoute] | Noner1   r   r   r   r8   r9   r8   zlist[BaseRoute]r   r   rR   r   r   r:   r;   r<   r/   propertyr   r   r   r   r   r   rF   r6   r5   r   r   g  s     #-1l 37ll l +	l
 l 0l 
l. 5 5B.6-^Tr6   r   c                  P    e Zd Zd	d
dZedd       ZddZddZddZddZ	ddZ
y)HostNc                    |j                  d      rJ d       || _        || _        || _        t	        |      \  | _        | _        | _        y )Nrn   zHost must not start with '/')rx   hostrQ   r1   r   
host_regexhost_formatrh   )r0   r  rQ   r1   s       r5   r/   zHost.__init__  sI    ??3'G)GG'		COPTCU@)4+@r6   c                0    t        | j                  dg       S r   )r]   rQ   r   s    r5   r   zHost.routes  s    txx2..r6   c                   |d   dv rt        |      }|j                  dd      j                  d      d   }| j                  j	                  |      }|r|j                         }|j                         D ]&  \  }}| j                  |   j                  |      ||<   ( t        |j                  di             }|j                  |       || j                  d	}	t        j                  |	fS t        j                  i fS )
Nr   r   rK   r  rp   rq   r   r2   )r2   r^   )r   r   r   r  r   r   rc   rh   r   r   r   rQ   r@   rE   rC   )
r0   rK   r   r  r   r   ri   rj   r2   r   s
             r5   r   zHost.matches  s    =11E*G;;vr*005a8DOO))$/E!&!2"0"6"6"8 TJC*.*?*?*D*L*LU*SN3'T"599]B#?@"">2.9txxPzz;..zz2~r6   c                  | j                   W|| j                   k(  rHd|v rD|j                  d      }t        | j                  | j                  |      \  }}|st        ||      S | j                   |j                  | j                   dz         r| j                   |}n|t        | j                         dz   d  }t        | j                  | j                  |      \  }}| j                  xs g D ]8  }	  |j                  |fi |}t        t        |      |j                  |      c S  t        ||      # t        $ r Y Rw xY w)Nrg   )rg   r  rq   rA   )rg   r   r  )r1   rf   rl   r  rh   r   rx   r   r   r   r7   r   r(   )	r0   r1   r2   rg   r  r   r  r  r	  s	            r5   r   zHost.url_path_for  s5   99 TTYY%66[;P??6*D%3D4D4DdF[F[]h%i"D"#Dt44YY$//$))c/"Byy !% "&c$))nq&8&:!;%3D4D4DdF[F[]h%i"D"* ,%,,^P?OPC"C3<<dSS 4-- $ s   03D33	D?>D?c                F   K   | j                  |||       d {    y 7 wrJ   r   r   s       r5   r   zHost.handle  r   r   c                    t        |t              xr4 | j                  |j                  k(  xr | j                  |j                  k(  S rJ   )r   r  r  rQ   r   s     r5   r   zHost.__eq__   s6    %&\499

+B\txxSXS\S\G\\r6   c                    | j                   j                  }| j                  xs d}| d| j                  d|d| j                  dS )Nrp   z(host=r   r  rt   )r4   r:   r1   r  rQ   r  s      r5   r   zHost.__repr__  r  r6   rJ   r  r7   rQ   r    r1   r   r8   r9   r  r   r   rR   r   r   r  rF   r6   r5   r  r    s7    V / /..-]Tr6   r  _Tc                  4    e Zd ZddZddZ	 	 	 	 	 	 	 	 ddZy)_AsyncLiftContextManagerc                    || _         y rJ   )_cm)r0   cms     r5   r/   z!_AsyncLiftContextManager.__init__  s	    r6   c                >   K   | j                   j                         S wrJ   )r'  	__enter__r   s    r5   
__aenter__z#_AsyncLiftContextManager.__aenter__  s     xx!!##s   c                D   K   | j                   j                  |||      S wrJ   )r'  __exit__)r0   exc_type	exc_value	tracebacks       r5   	__aexit__z"_AsyncLiftContextManager.__aexit__  s!      xx  9i@@s    N)r(  zAbstractContextManager[_T])r8   r#  )r.  ztype[BaseException] | Noner/  zBaseException | Noner0  ztypes.TracebackType | Noner8   zbool | None)r:   r;   r<   r/   r+  r1  rF   r6   r5   r%  r%    s<    $A,A (A .	A
 
Ar6   r%  c                n    t        j                  |       t        j                        dfd       }|S )Nc                &    t         |             S rJ   )r%  )rQ   cmgrs    r5   wrapperz+_wrap_gen_lifespan_context.<locals>.wrapper!  s    'S	22r6   )rQ   r   r8   z_AsyncLiftContextManager[Any])
contextlibcontextmanagerrS   wraps)lifespan_contextr5  r4  s     @r5   _wrap_gen_lifespan_contextr:    s8     $$%56D__T3 3 Nr6   c                  ,    e Zd ZddZddZddZd	dZy)
_DefaultLifespanc                    || _         y rJ   )_router)r0   routers     r5   r/   z_DefaultLifespan.__init__)  s	    r6   c                   K   y wrJ   rF   r   s    r5   r+  z_DefaultLifespan.__aenter__,  	        c                   K   y wrJ   rF   )r0   exc_infos     r5   r1  z_DefaultLifespan.__aexit__/  rA  rB  c                    | S rJ   rF   )r0   rQ   s     r5   r   z_DefaultLifespan.__call__2  s    r6   N)r?  r   )r8   r9   )rD  objectr8   r9   )r0   r#  rQ   rF  r8   r#  )r:   r;   r<   r/   r+  r1  r   rF   r6   r5   r<  r<  (  s    r6   r<  c                      e Zd Z	 	 	 	 ddd	 	 	 	 	 	 	 	 	 	 	 ddZddZddZddZddZddZdd	Z	ddd
Z
dddZ	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZ	 d	 	 	 	 	 	 	 ddZy)r   Nr   c                  |g n
t        |      | _        || _        || j                  n|| _        |t        |       | _        nt        j                  |      r+t        j                  dt               t        |      | _        nGt        j                  |      r+t        j                  dt               t        |      | _        n|| _        | j                  | _        |r0t#        |      D ]!  \  }}} || j                   g|i || _        # y y )Nzjasync generator function lifespans are deprecated, use an @contextlib.asynccontextmanager function insteadzdgenerator function lifespans are deprecated, use an @contextlib.asynccontextmanager function instead)r,   r   redirect_slashes	not_founddefaultr<  r9  r   isasyncgenfunctionwarningswarnr   r   isgeneratorfunctionr:  rQ   middleware_stackr   )	r0   r   rI  rK  lifespanr   r   r   r   s	            r5   r/   zRouter.__init__7  s     #NbV 0)0t~~g3CD3ID!''1MMJ+
 %8$AD!((2MMv+ %?x$HD!$,D! $%-j%9 T!T6(+D,A,A(SD(SF(S%T r6   c                   K   |d   dk(  rt               } ||||       d {    y d|v rt        d      t        dd      } ||||       d {    y 7 57 w)Nr   r   rQ   r   r   r   )r&   r   r   )r0   rK   rL   rM   r   rN   s         r5   rJ  zRouter.not_found^  sl     =K',.O!%$777
 E>C00(#FHugt,,, 8 	-s!    AA/AAAAc                   | j                   D ]  }	  |j                  |fi |c S  t        ||      # t        $ r Y 1w xY wrJ   )r   r   r(   )r0   r1   r2   r  s       r5   r   zRouter.url_path_form  sU    [[ 	E)u))$>+>>	
 4--   s   3	??c                6  K   d}|j                  d      } |        d{    	 | j                  |      4 d{   }|#d|vrt        d      |d   j                  |        |ddi       d{    d} |        d{    ddd      d{     |dd	i       d{    y7 7 q7 <7 -7 # 1 d{  7  sw Y   /xY w7 $# t        $ rA t        j                         }|r |d
|d       d{  7     |d|d       d{  7    w xY ww)z{
        Handle ASGI lifespan messages, which allows us to manage application
        startup and shutdown events.
        FrQ   Nstatez:The server does not support "state" in the lifespan scope.r   zlifespan.startup.completeTzlifespan.shutdown.completezlifespan.shutdown.failed)r   messagezlifespan.startup.failed)r   r9  RuntimeErrorr   BaseExceptionr0  
format_exc)r0   rK   rL   rM   startedrQ   maybe_stateexc_texts           r5   rQ  zRouter.lifespanu  s6    
 99U#i	?,,S1    [*e+*+ghh'N))+6F$?@AAAi      <=>>>% 	 
 B         ?  	 ++-H$>8TUUU  $=(STTT	s   DB+DC B-C 3B52B/3B5B1B5C B3C D%C
&D-C /B51B53C 5C;B><CC 
D-D9C<:DDDDc                F   K   | j                  |||       d{    y7 w)z;
        The main entry point to the Router class.
        N)rP  r   s       r5   r   zRouter.__call__  s       ##E7D999r   c                  K   |d   dv sJ d|vr| |d<   |d   dk(  r| j                  |||       d {    y d }| j                  D ]r  }|j                  |      \  }}|t        j                  k(  r.|j                  |       |j                  |||       d {     y |t        j                  k(  sl|o|}|}t |-|j                         |j                  |||       d {    y t        |      }	|d   dk(  r| j                  r|	dk7  rt        |      }
|	j                  d      r|
d   j                  d      |
d<   n|
d   dz   |
d<   | j                  D ]^  }|j                  |
      \  }}|t        j                  k7  s+t        |
      }t        t!        |      	      } ||||       d {     y  | j#                  |||       d {    y 7 7 B7 7 +7 w)
Nr   )r   r   rQ  r?  rQ  r   rn   rg   r  )r	  )rQ  r   r   r@   rE   r   r   rD   r   rI  r   endswithr   rC   r   r   r7   rK  )r0   rK   rL   rM   rT   r  r   r   partial_scoper   redirect_scoperedirect_urlrN   s                r5   rQ   z
Router.app  s    V} AAAA5 "E(O=J&--w555[[ 
	,E "'u!5E;

"[)ll5'4888%--'GO +
	,  LL'..666#E*
=F"t'<'<sAR!%[N""3')7)?)F)Fs)Kv&)7)?#)Ev& %*]]>%B"{EJJ&#&^#<L/C4EFH"5'4888 ll5'4000S 6 9 7  9 	1sk   1G#GA$G#GG#3G#6/G#%G&BG#.G#3G4G#G!G#G#G#G#!G#c                X    t        |t              xr | j                  |j                  k(  S rJ   )r   r   r   r   s     r5   r   zRouter.__eq__  s!    %(HT[[ELL-HHr6   c                V    t        |||      }| j                  j                  |       y N)rQ   r1   )r   r   append)r0   rg   rQ   r1   r  s        r5   mountzRouter.mount  s"    d$/5!r6   c                V    t        |||      }| j                  j                  |       y re  )r  r   rf  )r0   r  rQ   r1   r  s        r5   r  zRouter.host  s"    Ts.5!r6   c                Z    t        |||||      }| j                  j                  |       y )N)r^   r   r1   r   )r   r   rf  )r0   rg   r^   r   r1   r   r  s          r5   	add_routezRouter.add_route  s1     /
 	5!r6   c                V    t        |||      }| j                  j                  |       y )N)r^   r1   )r   r   rf  )r0   rg   r^   r1   r  s        r5   add_websocket_routezRouter.add_websocket_route  s$     thTB5!r6   )NTNN)r   r  rI  r   rK  r  rQ  zLifespan[Any] | Noner   r   r8   r9   rR   r   r   rJ   )rg   r7   rQ   r    r1   r   r8   r9   r"  )NNT)rg   r7   r^   3Callable[[Request], Awaitable[Response] | Response]r   r   r1   r   r   r   r8   r9   )rg   r7   r^   &Callable[[WebSocket], Awaitable[None]]r1   r   r8   r9   )r:   r;   r<   r/   rJ  r   rQ  r   rQ   r   rg  r  rj  rl  rF   r6   r5   r   r   6  s	    .2!%"& *.%T 37%T*%T %T  	%T '%T 0%T 
%TN-.?6:01dI"" +/"&"" F" (	"
 "  " 
"*  	"" 9" 	"
 
"r6   r   )rU   rm  r8   r    )rU   rn  r8   r    )r^   r   r8   r7   )rg   r7   rh   zdict[str, Convertor[Any]]r2   zdict[str, str]r8   ztuple[str, dict[str, str]])rg   r7   r8   z3tuple[Pattern[str], str, dict[str, Convertor[Any]]])r9  z)Callable[[Any], Generator[Any, Any, Any]]r8   z1Callable[[Any], AbstractAsyncContextManager[Any]])N
__future__r   r6  rS   r   r~   r0  typesrM  collections.abcr   r   r   r   r   r	   r
   r   enumr   r   typingr   r   starlette._exception_handlerr   starlette._utilsr   r   starlette.concurrencyr   starlette.convertorsr   r   starlette.datastructuresr   r   r   starlette.exceptionsr   r   starlette.middlewarer   starlette.requestsr   starlette.responsesr   r   r   starlette.typesr    r!   r"   r#   r$   starlette.websocketsr%   r&   	Exceptionr(   r@   rV   r[   r_   rl   r   rz   r   r   r   r   r   r  r#  r%  r:  r<  r   rF   r6   r5   <module>r     s   "    	    P P _ _    E > 3 ; : : K + & M M C C :V9 VD 
=.
0&F
/    	 bjjOP5A
5A85Ap0 0<^RI ^RB?TY ?TDaTI aTH;T9 ;T| T]A:2> A 	?	6	 u" u"r6   