
    vh                       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 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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' d dl(m)Z) d dl*m+Z+ d dl,m-Z-m.Z.m/Z/ d dl0m1Z1m2Z2m3Z3m4Z4m5Z5 d dl6m7Z7m8Z8  G d de9      Z: G d de      Z;d0dZ<	 	 	 	 d1dZ=	 	 	 	 d2dZ>d3dZ?	 	 	 	 	 	 	 	 d4dZ@ ej                  d      ZB	 	 	 	 d5d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	 	 	 	 d6d+ZK G d, d-      ZL G d. d/      ZMy)7    )annotationsN)	Awaitable
Collection	GeneratorSequence)AbstractAsyncContextManagerAbstractContextManagerasynccontextmanager)Enum)Pattern)AnyCallableTypeVar)wrap_app_handling_exceptions)get_route_pathis_async_callable)run_in_threadpool)CONVERTOR_TYPES	Convertor)URLHeadersURLPath)HTTPException)
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       I/var/www/html/luna/venv/lib/python3.12/site-packages/starlette/routing.pyr.   zNoMatchFound.__init__#   s=    4 0 0 2345dV>&QSTU    )r0   strr1   zdict[str, Any]returnNone)__name__
__module____qualname____doc__r.   __classcell__)r3   s   @r4   r'   r'      s    
V Vr5   r'   c                      e Zd ZdZdZdZy)Matchr         N)r9   r:   r;   NONEPARTIALFULL r5   r4   r?   r?   (   s    DGDr5   r?   c                    t        j                  dt               t        | t        j
                        r'| j                  } t        | t        j
                        r't        j                  |       S )z~
    Correctly determines if an object is a coroutine function,
    including those wrapped in functools.partial objects.
    zViscoroutinefunction_or_partial is deprecated, and will be removed in a future release.)	warningswarnDeprecationWarning
isinstance	functoolspartialfuncinspectiscoroutinefunction)objs    r4   iscoroutinefunction_or_partialrQ   .   sT    
 MM` S)++
,hh S)++
,&&s++r5   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NrE   )scopereceivesendresponsefrequests       r4   appz*request_response.<locals>.app.<locals>.appJ   s.     wZ'H5'4000 (0s   +'+)++rV   r"   rW   r!   rX   r#   r7   r8   )r   r   )rV   rW   rX   r\   r[   rZ   s       @r4   r\   zrequest_response.<locals>.appG   s8     %$/	1 9*38NNNs   ,868r]   )r   rK   rL   r   )rM   r\   rZ   s     @r4   request_responser^   <   s2     "$'Y->->?PRV-W O Jr5   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)rW   rX   c                2   K           d {    y 7 wrU   rE   )rV   rW   rX   rM   sessions      r4   r\   z+websocket_session.<locals>.app.<locals>.app^   s     w-s   r]   )r$   r   )rV   rW   rX   r\   rb   rM   s       @r4   r\   zwebsocket_session.<locals>.app[   s8     E7>	  9*38NNNs   -979r]   rE   )rM   r\   s   ` r4   websocket_sessionrc   S   s    O Jr5   c                D    t        | d| j                  j                        S )Nr9   )getattrr3   r9   )endpoints    r4   get_namerg   f   s    8Z););)D)DEEr5   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_convertorsr1   keyvalue	convertors         r4   replace_paramsrt   j   s    
 ;,,./ !
U9s?d"(-I''.E<<c	C7DOOC ! r5   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   r6   :zUnknown path convertor ''z(?P<>)z{%s}r)   r@   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)ro   is_host
path_regexpath_formatduplicated_paramsidxrp   match
param_nameconvertor_typers   namesendinghostnames                 r4   compile_pathr   |   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@@@r5   c                  ,    e Zd ZddZddZddZddZy)		BaseRoutec                    t               rU   NotImplementedError)r/   rV   s     r4   matcheszBaseRoute.matches       !##r5   c                   t               rU   r   )r/   r0   r1   s      r4   url_path_forzBaseRoute.url_path_for   r   r5   c                   K   t               wrU   r   r/   rV   rW   rX   s       r4   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?   rB   r   r%   updater   )r/   rV   rW   rX   r   child_scoperY   websocket_closes           r4   __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rV   r"   r7   ztuple[Match, Scope]r0   r6   r1   r   r7   r   r]   )r9   r:   r;   r   r   r   r   rE   r5   r4   r   r      s    $$$0r5   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)methodsr0   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 )Nrv    Routed paths must start with '/'GETHEAD)r   ro   rf   rg   r0   r   rJ   rK   rL   rM   rN   
isfunctionismethodr^   r\   reversedr   upperr   r   r   r   rp   )r/   ro   rf   r   r0   r   r   endpoint_handlerclsargskwargsmethods               r4   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   r1   rf   r1   r   )r   r   r   	groupdictrk   rp   convertdictgetr   rf   r   r?   rC   rD   rB   	r/   rV   
route_pathr   matched_paramsrq   rr   r1   r   s	            r4   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~r5   c               $   t        |j                               }t        | j                  j                               }|| j                  k7  s||k7  rt	        ||      t        | j                  | j                  |      \  }}|rJ t        |d      S )Nr   ro   protocolr   r,   rp   r0   r'   rt   r   r   r/   r0   r1   seen_paramsexpected_paramsro   remaining_paramss          r4   r   zRoute.url_path_for  s    +**,-d3388:;499 >t[11!/0@0@$BWBWYd!e###D622r5   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)   r\   i  )r   headerszMethod Not Allowed)r   r*   r   r   r\   )r/   rV   rW   rX   r   rY   s         r4   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 rU   )rJ   r   ro   rf   r   r/   others     r4   __eq__zRoute.__eq__$  sR    ue$ .		UZZ'./. -		
r5   c                    | j                   j                  }t        | j                  xs g       }| j                  | j
                  }}| d|d|d|dS )N(path=, name=z
, methods=r|   )r3   r9   r   r   ro   r0   )r/   
class_namer   ro   r0   s        r4   __repr__zRoute.__repr__,  sT    ^^,,
+,YY		dVD874(*WKqQQr5   )ro   r6   rf   Callable[..., Any]r   Collection[str] | Noner0   
str | Noner   boolr   Sequence[Middleware] | Noner7   r8   r   r   r]   r   r   r7   r   r7   r6   	r9   r:   r;   r.   r   r   r   r   r   rE   r5   r4   r   r      s|     +/"&26'V'V %'V
 ('V 'V  'V 0'V 
'VR$	3	1
Rr5   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)r0   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 )Nrv   r   )r   ro   rf   rg   r0   rJ   rK   rL   rM   rN   r   r   rc   r\   r   r   r   r   rp   )	r/   ro   rf   r0   r   r   r   r   r   s	            r4   r.   zWebSocketRoute.__init__4  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+@r5   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   r1   r   )r   r   r   r   rk   rp   r   r   r   r   rf   r?   rD   rB   r   s	            r4   r   zWebSocketRoute.matchesQ  s    =K''.JOO))*5E!&!2"0"6"6"8 TJC*.*?*?*D*L*LU*SN3'T"599]B#?@"">2+/==Uzz;..zz2~r5   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          r4   r   zWebSocketRoute.url_path_for`  s    +**,-d3388:;499 >t[11!/0@0@$BWBWYd!e###D;77r5   c                F   K   | j                  |||       d {    y 7 wrU   r\   r   s       r4   r   zWebSocketRoute.handlek       hhugt,,,   !!c                    t        |t              xr4 | j                  |j                  k(  xr | j                  |j                  k(  S rU   )rJ   r   ro   rf   r   s     r4   r   zWebSocketRoute.__eq__n  s9    %0pTYY%**5LpQUQ^Q^bgbpbpQppr5   c                h    | j                   j                   d| j                  d| j                  dS )Nr   r   r|   )r3   r9   ro   r0   r/   s    r4   r   zWebSocketRoute.__repr__q  s/    ..))*&WTYYMQRSSr5   )
ro   r6   rf   r   r0   r   r   r   r7   r8   r   r   r]   r   r   r   rE   r5   r4   r   r   3  s`      26VV %V
 V 0V 
V:	8-qTr5   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 )Nrx   rv   r   z0Either 'app=...', or 'routes=' must be specified)routesz/{path:path})r   rstripro   	_base_appRouterr\   r   r0   r   r   r   rp   )	r/   ro   r\   r   r0   r   r   r   r   s	            r4   r.   zMount.__init__v  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+@r5   c                0    t        | j                  dg       S Nr   )re   r   r   s    r4   r   zMount.routes  s    t~~x44r5   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_pathrx   rv   ro   r1   app_root_path)r1   r  r  rf   )r   r   r   r   r   rk   rp   r   rn   r   r   r   r\   r?   rD   rB   )r/   rV   r  r   r   r   rq   rr   remaining_pathmatched_pathr1   r   s               r4   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~r5   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)Nro   rv   )ro   ry   r@   rx   r   )r0   r   rt   r   rp   r   r   r   r   r   r   r   r6   r   r'   )
r/   r0   r1   ro   r   remaining_name
path_kwargpath_prefixrouteurls
             r4   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rU   r   r   s       r4   r   zMount.handle  r   r   c                    t        |t              xr4 | j                  |j                  k(  xr | j                  |j                  k(  S rU   )rJ   r   ro   r\   r   s     r4   r   zMount.__eq__  s6    %']DII,C]TYT]T]H]]r5   c                    | j                   j                  }| j                  xs d}| d| j                  d|d| j                  dS )Nrx   r   r   , app=r|   )r3   r9   r0   ro   r\   r/   r   r0   s      r4   r   zMount.__repr__  F    ^^,,
yyBVDII=xvdhh\QRSSr5   )NNN)ro   r6   r\   ASGIApp | Noner   Sequence[BaseRoute] | Noner0   r   r   r   r7   r8   r7   zlist[BaseRoute]r   r   r]   r   r   r9   r:   r;   r.   propertyr   r   r   r   r   r   rE   r5   r4   r   r   u  s     #-1l 37ll l +	l
 l 0l 
l. 5 5B.6-^Tr5   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 )Nrv   zHost must not start with '/')r   hostr\   r0   r   
host_regexhost_formatrp   )r/   r  r\   r0   s       r4   r.   zHost.__init__  sI    ??3'G)GG'		COPTCU@)4+@r5   c                0    t        | j                  dg       S r  )re   r\   r   s    r4   r   zHost.routes  s    txx2..r5   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  rV   r  rx   ry   r   r1   )r1   rf   )r   r   r   r  r   r   rk   rp   r   r   r   r\   r?   rD   rB   )
r/   rV   r   r  r   r   rq   rr   r1   r   s
             r4   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~r5   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)Nro   )ro   r  ry   r@   )ro   r   r  )r0   rn   rt   r   rp   r   r   r   r   r   r6   r   r'   )	r/   r0   r1   ro   r  r   r  r  r  s	            r4   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rU   r   r   s       r4   r   zHost.handle  r   r   c                    t        |t              xr4 | j                  |j                  k(  xr | j                  |j                  k(  S rU   )rJ   r  r  r\   r   s     r4   r   zHost.__eq__  s6    %&\499

+B\txxSXS\S\G\\r5   c                    | j                   j                  }| j                  xs d}| d| j                  d|d| j                  dS )Nrx   z(host=r   r  r|   )r3   r9   r0   r  r\   r  s      r4   r   zHost.__repr__  r  r5   rU   r  r6   r\   r   r0   r   r7   r8   r  r   r   r]   r   r   r  rE   r5   r4   r  r    s7    V / /..-]Tr5   r  _Tc                  4    e Zd ZddZddZ	 	 	 	 	 	 	 	 ddZy)_AsyncLiftContextManagerc                    || _         y rU   )_cm)r/   cms     r4   r.   z!_AsyncLiftContextManager.__init__  s	    r5   c                >   K   | j                   j                         S wrU   )r-  	__enter__r   s    r4   
__aenter__z#_AsyncLiftContextManager.__aenter__  s     xx!!##s   c                D   K   | j                   j                  |||      S wrU   )r-  __exit__)r/   exc_type	exc_value	tracebacks       r4   	__aexit__z"_AsyncLiftContextManager.__aexit__!  s!      xx  9i@@s    N)r.  zAbstractContextManager[_T])r7   r)  )r4  ztype[BaseException] | Noner5  zBaseException | Noner6  ztypes.TracebackType | Noner7   zbool | None)r9   r:   r;   r.   r1  r7  rE   r5   r4   r+  r+    s<    $A,A (A .	A
 
Ar5   r+  c                n    t        j                  |       t        j                        dfd       }|S )Nc                &    t         |             S rU   )r+  )r\   cmgrs    r4   wrapperz+_wrap_gen_lifespan_context.<locals>.wrapper/  s    'S	22r5   )r\   r   r7   z_AsyncLiftContextManager[Any])
contextlibcontextmanagerrK   wraps)lifespan_contextr;  r:  s     @r4   _wrap_gen_lifespan_contextr@  *  s8     $$%56D__T3 3 Nr5   c                  ,    e Zd ZddZddZddZd	dZy)
_DefaultLifespanc                    || _         y rU   )_router)r/   routers     r4   r.   z_DefaultLifespan.__init__7  s	    r5   c                T   K   | j                   j                          d {    y 7 wrU   )rD  startupr   s    r4   r1  z_DefaultLifespan.__aenter__:  s     ll""$$$   (&(c                T   K   | j                   j                          d {    y 7 wrU   )rD  shutdown)r/   exc_infos     r4   r7  z_DefaultLifespan.__aexit__=  s     ll##%%%rH  c                    | S rU   rE   )r/   r\   s     r4   r   z_DefaultLifespan.__call__@  s    r5   N)rE  r  r7   r8   )rK  objectr7   r8   )r/   r)  r\   rN  r7   r)  )r9   r:   r;   r.   r1  r7  r   rE   r5   r4   rB  rB  6  s    %&r5   rB  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
Z
ddZdddZdddZ	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZ	 d	 	 	 	 	 	 	 ddZ	 	 	 d	 	 	 	 	 	 	 	 	 d dZdd!dZd"dZd#dZy)$r  Nr   c                  |g n
t        |      | _        || _        || j                  n|| _        |g n
t        |      | _        |g n
t        |      | _        |s|r1t        j                  dt               |rt        j                  d       |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 )NzThe on_startup and on_shutdown parameters are deprecated, and they will be removed on version 1.0. Use the lifespan parameter instead. See more about it on https://www.starlette.io/lifespan/.zThe `lifespan` parameter cannot be used with `on_startup` or `on_shutdown`. Both `on_startup` and `on_shutdown` will be ignored.zjasync 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default
on_startupon_shutdownrG   rH   rI   rB  r?  rN   isasyncgenfunctionr
   isgeneratorfunctionr@  r\   middleware_stackr   )r/   r   rQ  rS  rT  rU  lifespanr   r   r   r   s              r4   r.   zRouter.__init__E  s]    #NbV 0)0t~~g * 2"Z8H!,!42${:KMMK #	  3CD3ID!''1MMJ"
 %8%D! ((2MMv" %?%D! %-D! $%-j%9 T!T6(+D,A,A(SD(SF(S%T r5   c                   K   |d   dk(  rt               } ||||       d {    y d|v rt        d      t        dd      } ||||       d {    y 7 57 w)Nr   r   r\   r   r   r   )r%   r   r   )r/   rV   rW   rX   r   rY   s         r4   rR  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rU   )r   r   r'   )r/   r0   r1   r  s       r4   r   zRouter.url_path_for  sU    [[ 	E)u))$>+>>	
 4--   s   3	??c                v   K   | j                   D ]$  }t        |      r |        d{     |        & y7 w)z7
        Run any `.on_startup` event handlers.
        N)rT  r   r/   handlers     r4   rG  zRouter.startup  s4       	G )i			   %979c                v   K   | j                   D ]$  }t        |      r |        d{     |        & y7 w)z8
        Run any `.on_shutdown` event handlers.
        N)rU  r   r]  s     r4   rJ  zRouter.shutdown  s6      '' 	G )i			r_  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.
        Fr\   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   r?  RuntimeErrorr   BaseExceptionr6  
format_exc)r/   rV   rW   rX   startedr\   maybe_stateexc_texts           r4   rY  zRouter.lifespan  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)rX  r   s       r4   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   rY  rE  rY  r   rv   ro   r#  )r  )rY  r   r   r?   rD   r   r   rC   r   rQ  r   endswithr   rB   r   r   r6   rS  )r/   rV   rW   rX   rL   r  r   r   partial_scoper   redirect_scoperedirect_urlrY   s                r4   r\   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 rU   )rJ   r  r   r   s     r4   r   zRouter.__eq__   s!    %(HT[[ELL-HHr5   c                V    t        |||      }| j                  j                  |       y N)r\   r0   )r   r   append)r/   ro   r\   r0   r  s        r4   mountzRouter.mount  s"    d$/5!r5   c                V    t        |||      }| j                  j                  |       y rr  )r  r   rs  )r/   r  r\   r0   r  s        r4   r  zRouter.host  s"    Ts.5!r5   c                Z    t        |||||      }| j                  j                  |       y )N)rf   r   r0   r   )r   r   rs  )r/   ro   rf   r   r0   r   r  s          r4   	add_routezRouter.add_route  s1     /
 	5!r5   c                V    t        |||      }| j                  j                  |       y )N)rf   r0   )r   r   rs  )r/   ro   rf   r0   r  s        r4   add_websocket_routezRouter.add_websocket_route  s$     thTB5!r5   c                X     t        j                  dt               d fd}|S )z
        We no longer document this decorator style API, and its usage is discouraged.
        Instead you should use the following approach:

        >>> routes = [Route(path, endpoint=...), ...]
        >>> app = Starlette(routes=routes)
        zThe `route` decorator is deprecated, and will be removed in version 1.0.0.Refer to https://www.starlette.io/routing/#http-routing for the recommended approach.c                4    j                  |        | S )N)r   r0   r   )rw  )rM   r   r   r0   ro   r/   s    r4   	decoratorzRouter.route.<locals>.decorator9  s*    NN"3   Kr5   rM   r   r7   r   rG   rH   rI   )r/   ro   r   r0   r   r|  s   ````` r4   r  zRouter.route%  s,     	d	
	 	 r5   c                P     t        j                  dt               d fd}|S )a  
        We no longer document this decorator style API, and its usage is discouraged.
        Instead you should use the following approach:

        >>> routes = [WebSocketRoute(path, endpoint=...), ...]
        >>> app = Starlette(routes=routes)
        zThe `websocket_route` decorator is deprecated, and will be removed in version 1.0.0. Refer to https://www.starlette.io/routing/#websocket-routing for the recommended approach.c                0    j                  |        | S )N)r0   )ry  )rM   r0   ro   r/   s    r4   r|  z)Router.websocket_route.<locals>.decoratorS  s    $$T4d$;Kr5   r}  r~  )r/   ro   r0   r|  s   ``` r4   websocket_routezRouter.websocket_routeE  s'     	`	
	 r5   c                    |dv sJ |dk(  r| j                   j                  |       y | j                  j                  |       y )N)rG  rJ  rG  )rT  rs  rU  )r/   
event_typerM   s      r4   add_event_handlerzRouter.add_event_handlerY  s?    4444"OO""4(##D)r5   c                L     t        j                  dt               d fd}|S )NzThe `on_event` decorator is deprecated, and will be removed in version 1.0.0. Refer to https://www.starlette.io/lifespan/ for recommended approach.c                ,    j                  |        | S rU   )r  )rM   r  r/   s    r4   r|  z"Router.on_event.<locals>.decoratorh  s    "":t4Kr5   r}  r~  )r/   r  r|  s   `` r4   on_eventzRouter.on_eventa  s%    T	
	 r5   )NTNNNN)r   r  rQ  r   rS  r  rT  "Sequence[Callable[[], Any]] | NonerU  r  rY  zLifespan[Any] | Noner   r   r7   r8   r]   r   rM  r   rU   )ro   r6   r\   r   r0   r   r7   r8   r(  )NNT)ro   r6   rf   3Callable[[Request], Awaitable[Response] | Response]r   r   r0   r   r   r   r7   r8   )ro   r6   rf   &Callable[[WebSocket], Awaitable[None]]r0   r   r7   r8   )
ro   r6   r   r   r0   r   r   r   r7   r   )ro   r6   r0   r   r7   r   )r  r6   rM   zCallable[[], Any]r7   r8   )r  r6   r7   r   )r9   r:   r;   r.   rR  r   rG  rJ  rY  r   r\   r   rt  r  rw  ry  r  r  r  r  rE   r5   r4   r  r  D  s    .2!%"&9=:> *.;T 37;T*;T ;T  	;T
 7;T 8;T ';T 0;T 
;Tz-.?6:01dI"" +/"&"" F" (	"
 "  " 
"*  	"" 9" 	"
 
" +/"& ( 	
   
@(*r5   r  )rP   r   r7   r   )rM   r  r7   r   )rM   r  r7   r   )rf   r   r7   r6   )ro   r6   rp   zdict[str, Convertor[Any]]r1   zdict[str, str]r7   ztuple[str, dict[str, str]])ro   r6   r7   z3tuple[Pattern[str], str, dict[str, Convertor[Any]]])r?  z)Callable[[Any], Generator[Any, Any, Any]]r7   z1Callable[[Any], AbstractAsyncContextManager[Any]])N
__future__r   r<  rK   rN   r   r6  typesrG   collections.abcr   r   r   r   r   r	   r
   enumr   r   typingr   r   r   starlette._exception_handlerr   starlette._utilsr   r   starlette.concurrencyr   starlette.convertorsr   r   starlette.datastructuresr   r   r   starlette.exceptionsr   starlette.middlewarer   starlette.requestsr   starlette.responsesr   r   r   starlette.typesr   r    r!   r"   r#   starlette.websocketsr$   r%   	Exceptionr'   r?   rQ   r^   rc   rg   rt   r   r   r   r   r   r   r   r  r)  r+  r@  rB  r  rE   r5   r4   <module>r     s   "    	    F F _ _   ) ) E > 3 ; : : . + & 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	 h hr5   