
    ,h                       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	Z	d dl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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l%m&Z&m'Z'm(Z(m)Z)m*Z* d dl+m,Z,m-Z-  G d de.      Z/ G d de      Z0d-dZ1	 	 	 	 d.dZ2	 	 	 	 d/dZ3d0dZ4	 	 	 	 	 	 	 	 d1dZ5 ejl                  d      Z7	 	 	 	 d2dZ8 G d d      Z9 G d de9      Z: G d d e9      Z; G d! d"e9      Z< G d# d$e9      Z= ej|                  d%      Z? G d& d'ej                  e?         ZA	 	 	 	 d3d(ZB G d) d*      ZC G d+ d,      ZDy)4    )annotationsN)asynccontextmanager)Enum)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       S/var/www/html/Resume-Scraper/venv/lib/python3.12/site-packages/starlette/routing.pyr$   zNoMatchFound.__init__!   s=    4 0 0 2345dV>&QSTU    )r&   strr'   zdict[str, typing.Any]returnNone)__name__
__module____qualname____doc__r$   __classcell__)r)   s   @r*   r   r      s    
V Vr+   r   c                      e Zd ZdZdZdZy)Matchr         N)r/   r0   r1   NONEPARTIALFULL r+   r*   r5   r5   &   s    DGDr+   r5   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    r*   iscoroutinefunction_or_partialrG   ,   sT    
 MM` S)++
,hh S)++
,&&s++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Nr;   )scopereceivesendresponsefrequests       r*   appz*request_response.<locals>.app.<locals>.appH   s.     wZ'H5'4000 (0s   +'+)++rL   r   rM   r   rN   r   r-   r.   )r   r   )rL   rM   rN   rR   rQ   rP   s       @r*   rR   zrequest_response.<locals>.appE   s8     %$/	1 9*38NNNs   ,868rS   )r   rA   rB   r	   )rC   rR   rP   s     @r*   request_responserT   :   s2     "$'Y->->?PRV-W O Jr+   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)rM   rN   c                2   K           d {    y 7 wrK   r;   )rL   rM   rN   rC   sessions      r*   rR   z+websocket_session.<locals>.app.<locals>.app\   s     w-s   rS   )r   r   )rL   rM   rN   rR   rX   rC   s       @r*   rR   zwebsocket_session.<locals>.appY   s8     E7>	  9*38NNNs   -979rS   r;   )rC   rR   s   ` r*   websocket_sessionrY   Q   s    O Jr+   c                D    t        | d| j                  j                        S )Nr/   )getattrr)   r/   )endpoints    r*   get_namer]   d   s    8Z););)D)DEEr+   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_convertorsr'   keyvalue	convertors         r*   replace_paramsrj   h   s    
 ;,,./ !
U9s?d"(-I''.E<<c	C7DOOC ! r+   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   r,   :zUnknown path convertor ''z(?P<>)z{%s}r   r6   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)re   is_host
path_regexpath_formatduplicated_paramsidxrf   match
param_nameconvertor_typeri   namesendinghostnames                 r*   compile_pathr   z   s    //#&&GJK
C%%d+ %*\\%%8"
N'..s30^4L^L\\]2^^#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@@@r+   c                  ,    e Zd ZddZddZddZddZy)		BaseRoutec                    t               rK   NotImplementedError)r%   rL   s     r*   matcheszBaseRoute.matches       !##r+   c                   t               rK   r   )r%   r&   r'   s      r*   url_path_forzBaseRoute.url_path_for   r   r+   c                   K   t               wrK   r   r%   rL   rM   rN   s       r*   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   r5   r8   r   r   updater   )r%   rL   rM   rN   r   child_scoperO   websocket_closes           r*   __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rL   r   r-   ztuple[Match, Scope]r&   r,   r'   
typing.Anyr-   r   rS   )r/   r0   r1   r   r   r   r   r;   r+   r*   r   r      s    $$$0r+   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)methodsr&   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 )Nrl    Routed paths must start with '/'GETHEAD)rv   re   r\   r]   r&   r   r@   rA   rB   rC   rD   
isfunctionismethodrT   rR   reversedr   upperr   r   r   r   rf   )r%   re   r\   r   r&   r   r   endpoint_handlerclsargskwargsmethods               r*   r$   zRoute.__init__   sT    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   r'   r\   r'   r   )r   r   r   	groupdictra   rf   convertdictgetr   r\   r   r5   r9   r:   r8   	r%   rL   
route_pathr   matched_paramsrg   rh   r'   r   s	            r*   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~r+   c               $   t        |j                               }t        | j                  j                               }|| j                  k7  s||k7  rt	        ||      t        | j                  | j                  |      \  }}|rJ t        |d      S )Nr   re   protocolrw   r"   rf   r&   r   rj   r   r   r%   r&   r'   seen_paramsexpected_paramsre   remaining_paramss          r*   r   zRoute.url_path_for  s    +**,-d3388:;499 >t[11!/0@0@$BWBWYd!e##D622r+   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   rR   i  )r   headerszMethod Not Allowed)r   r    r   r   rR   )r%   rL   rM   rN   r   rO   s         r*   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 rK   )r@   r   re   r\   r   r%   others     r*   __eq__zRoute.__eq__"  sR    ue$ .		UZZ'./. -		
r+   c                    | j                   j                  }t        | j                  xs g       }| j                  | j
                  }}| d|d|d|dS )N(path=, name=z
, methods=rr   )r)   r/   r   r   re   r&   )r%   
class_namer   re   r&   s        r*   __repr__zRoute.__repr__*  sT    ^^,,
+,YY		dVD874(*WKqQQr+   )re   r,   r\    typing.Callable[..., typing.Any]r   list[str] | Noner&   
str | Noner   boolr   "typing.Sequence[Middleware] | Noner-   r.   r   r   rS   r   r   r-   r   r-   r,   	r/   r0   r1   r$   r   r   r   r   r   r;   r+   r*   r   r      s|     %)"&9='V'V 3'V
 "'V 'V  'V 7'V 
'VR$	3	1
Rr+   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)r&   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 )Nrl   r   )rv   re   r\   r]   r&   r@   rA   rB   rC   rD   r   r   rY   rR   r   r   r   r   rf   )	r%   re   r\   r&   r   r   r   r   r   s	            r*   r$   zWebSocketRoute.__init__2  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+@r+   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   r'   r   )r   r   r   r   ra   rf   r   r   r   r   r\   r5   r:   r8   r   s	            r*   r   zWebSocketRoute.matchesO  s    =K''.JOO))*5E!&!2"0"6"6"8 TJC*.*?*?*D*L*LU*SN3'T"599]B#?@"">2+/==Uzz;..zz2~r+   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          r*   r   zWebSocketRoute.url_path_for^  s    +**,-d3388:;499 >t[11!/0@0@$BWBWYd!e##D;77r+   c                F   K   | j                  |||       d {    y 7 wrK   rR   r   s       r*   r   zWebSocketRoute.handlei       hhugt,,,   !!c                    t        |t              xr4 | j                  |j                  k(  xr | j                  |j                  k(  S rK   )r@   r   re   r\   r   s     r*   r   zWebSocketRoute.__eq__l  s9    %0pTYY%**5LpQUQ^Q^bgbpbpQppr+   c                h    | j                   j                   d| j                  d| j                  dS )Nr   r   rr   )r)   r/   re   r&   r%   s    r*   r   zWebSocketRoute.__repr__o  s/    ..))*&WTYYMQRSSr+   )
re   r,   r\   r   r&   r   r   r   r-   r.   r   r   rS   r   r   r   r;   r+   r*   r   r   1  s`      9=VV 3V
 V 7V 
V:	8-qTr+   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 )Nrn   rl   r   z0Either 'app=...', or 'routes=' must be specified)routesz/{path:path})rv   rstripre   	_base_appRouterrR   r   r&   r   r   r   rf   )	r%   re   rR   r   r&   r   r   r   r   s	            r*   r$   zMount.__init__t  s     rzT__S1U3UU&"4h6hhKK$	?&)DN#62DN>>!%-j%9 :!T6txx9$9&9:	COPTPYPY\jPjCk@)4+@r+   c                0    t        | j                  dg       S Nr   )r[   r   r   s    r*   r   zMount.routes  s    t~~x44r+   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_pathrn   rl   re   r'   app_root_path)r'   r   r   r\   )r   r   r   r   r   ra   rf   r   rd   r   r   r   rR   r5   r:   r8   )r%   rL   r   r   r   r   rg   rh   remaining_pathmatched_pathr'   r   s               r*   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~r+   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)Nre   rl   )re   ro   r6   rn   r   )r&   r{   rj   r   rf   r   rv   r   r   r   r   r   r,   r   r   )
r%   r&   r'   re   r   remaining_name
path_kwargpath_prefixrouteurls
             r*   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rK   r   r   s       r*   r   zMount.handle  r   r   c                    t        |t              xr4 | j                  |j                  k(  xr | j                  |j                  k(  S rK   )r@   r   re   rR   r   s     r*   r   zMount.__eq__  s6    %']DII,C]TYT]T]H]]r+   c                    | j                   j                  }| j                  xs d}| d| j                  d|d| j                  dS )Nrn   r   r   , app=rr   )r)   r/   r&   re   rR   r%   r   r&   s      r*   r   zMount.__repr__  F    ^^,,
yyBVDII=xvdhh\QRSSr+   )NNN)re   r,   rR   ASGIApp | Noner   !typing.Sequence[BaseRoute] | Noner&   r   r   r   r-   r.   r-   zlist[BaseRoute]r   r   rS   r   r   r/   r0   r1   r$   propertyr   r   r   r   r   r   r;   r+   r*   r   r   s  s     #48l :>ll l 2	l
 l 7l 
l. 5 5B.6-^Tr+   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 )Nrl   zHost must not start with '/')rv   hostrR   r&   r   
host_regexhost_formatrf   )r%   r  rR   r&   s       r*   r$   zHost.__init__  sF    ??3'G)GG		COPTCU@)4+@r+   c                0    t        | j                  dg       S r   )r[   rR   r   s    r*   r   zHost.routes  s    txx2..r+   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   rL   r  rn   ro   r   r'   )r'   r\   )r   r   r   r  r   r   ra   rf   r   r   r   rR   r5   r:   r8   )
r%   rL   r   r  r   r   rg   rh   r'   r   s
             r*   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~r+   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)Nre   )re   r  ro   r6   )re   r   r  )r&   rd   rj   r  rf   r   rv   r   r   r   r,   r   r   )	r%   r&   r'   re   r  r   r  r  r  s	            r*   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rK   r   r   s       r*   r   zHost.handle	  r   r   c                    t        |t              xr4 | j                  |j                  k(  xr | j                  |j                  k(  S rK   )r@   r  r  rR   r   s     r*   r   zHost.__eq__  s6    %&\499

+B\txxSXS\S\G\\r+   c                    | j                   j                  }| j                  xs d}| d| j                  d|d| j                  dS )Nrn   z(host=r   r
  rr   )r)   r/   r&   r  rR   r  s      r*   r   zHost.__repr__  r  r+   rK   r  r,   rR   r   r&   r   r-   r.   r  r   r   rS   r   r   r  r;   r+   r*   r  r    s7    V / /..-]Tr+   r  _Tc                  4    e Zd ZddZddZ	 	 	 	 	 	 	 	 ddZy)_AsyncLiftContextManagerc                    || _         y rK   )_cm)r%   cms     r*   r$   z!_AsyncLiftContextManager.__init__  s	    r+   c                >   K   | j                   j                         S wrK   )r$  	__enter__r   s    r*   
__aenter__z#_AsyncLiftContextManager.__aenter__  s     xx!!##s   c                D   K   | j                   j                  |||      S wrK   )r$  __exit__)r%   exc_type	exc_value	tracebacks       r*   	__aexit__z"_AsyncLiftContextManager.__aexit__  s!      xx  9i@@s    N)r%  ztyping.ContextManager[_T])r-   r   )r+  ztype[BaseException] | Noner,  zBaseException | Noner-  ztypes.TracebackType | Noner-   zbool | None)r/   r0   r1   r$   r(  r.  r;   r+   r*   r"  r"    s<    $A,A (A .	A
 
Ar+   r"  c                n    t        j                  |       t        j                        dfd       }|S )Nc                &    t         |             S rK   )r"  )rR   cmgrs    r*   wrapperz+_wrap_gen_lifespan_context.<locals>.wrapper-  s    'S	22r+   )rR   r   r-   z$_AsyncLiftContextManager[typing.Any])
contextlibcontextmanagerrA   wraps)lifespan_contextr2  r1  s     @r*   _wrap_gen_lifespan_contextr7  (  s8     $$%56D__T3 3 Nr+   c                  ,    e Zd ZddZddZddZd	dZy)
_DefaultLifespanc                    || _         y rK   )_router)r%   routers     r*   r$   z_DefaultLifespan.__init__5  s	    r+   c                T   K   | j                   j                          d {    y 7 wrK   )r;  startupr   s    r*   r(  z_DefaultLifespan.__aenter__8  s     ll""$$$   (&(c                T   K   | j                   j                          d {    y 7 wrK   )r;  shutdown)r%   exc_infos     r*   r.  z_DefaultLifespan.__aexit__;  s     ll##%%%r?  c                    | S rK   r;   )r%   rR   s     r*   r   z_DefaultLifespan.__call__>  s    r+   N)r<  r   r-   r.   )rB  objectr-   r.   )r%   r   rR   rE  r-   r   )r/   r0   r1   r$   r(  r.  r   r;   r+   r*   r9  r9  4  s    %&r+   r9  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_shutdownr=   r>   r?   r9  r6  rD   isasyncgenfunctionr   isgeneratorfunctionr7  rR   middleware_stackr   )r%   r   rH  rJ  rK  rL  lifespanr   r   r   r   s              r*   r$   zRouter.__init__C  s]    #NbV 0)0t~~g * 2"Z8H!,!42${:KMMK #	  :J4:PD!''1MMJ"
 %8%D! ((2MMv" %?%D! %-D! $%-j%9 T!T6(+D,A,A(SD(SF(S%T r+   c                   K   |d   dk(  rt               } ||||       d {    y d|v rt        d      t        dd      } ||||       d {    y 7 57 w)Nr   r   rR   r   r   r   )r   r   r   )r%   rL   rM   rN   r   rO   s         r*   rI  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rK   )r   r   r   )r%   r&   r'   r  s       r*   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)rK  r   r%   handlers     r*   r>  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)rL  r   rT  s     r*   rA  zRouter.shutdown  s6      '' 	G )i			rV  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.
        FrR   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   r6  RuntimeErrorr   BaseExceptionr-  
format_exc)r%   rL   rM   rN   startedrR   maybe_stateexc_texts           r*   rP  zRouter.lifespan  s6    
 ))E*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)rO  r   s       r*   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   rP  r<  rP  r   rl   re   r  )r  )rP  r   r   r5   r:   r   r   r9   r   rH  r   endswithr   r8   r   r   r,   rJ  )r%   rL   rM   rN   rB   r  r   r   partial_scoper   redirect_scoperedirect_urlrO   s                r*   rR   z
Router.app  s    V} 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 rK   )r@   r   r   r   s     r*   r   zRouter.__eq__  s!    %(HT[[ELL-HHr+   c                V    t        |||      }| j                  j                  |       y N)rR   r&   )r   r   append)r%   re   rR   r&   r  s        r*   mountzRouter.mount  s"    d$/5!r+   c                V    t        |||      }| j                  j                  |       y ri  )r  r   rj  )r%   r  rR   r&   r  s        r*   r  zRouter.host  s"    Ts.5!r+   c                Z    t        |||||      }| j                  j                  |       y )N)r\   r   r&   r   )r   r   rj  )r%   re   r\   r   r&   r   r  s          r*   	add_routezRouter.add_route	  s1     /
 	5!r+   c                V    t        |||      }| j                  j                  |       y )N)r\   r&   )r   r   rj  )r%   re   r\   r&   r  s        r*   add_websocket_routezRouter.add_websocket_route  s$     thTB5!r+   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   r&   r   )rn  )rC   r   r   r&   re   r%   s    r*   	decoratorzRouter.route.<locals>.decorator7  s*    NN"3   Kr+   rC   typing.Callabler-   ru  r=   r>   r?   )r%   re   r   r&   r   rs  s   ````` r*   r  zRouter.route#  s,     	d	
	 	 r+   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)r&   )rp  )rC   r&   re   r%   s    r*   rs  z)Router.websocket_route.<locals>.decoratorQ  s    $$T4d$;Kr+   rt  rv  )r%   re   r&   rs  s   ``` r*   websocket_routezRouter.websocket_routeC  s'     	`	
	 r+   c                    |dv sJ |dk(  r| j                   j                  |       y | j                  j                  |       y )N)r>  rA  r>  )rK  rj  rL  )r%   
event_typerC   s      r*   add_event_handlerzRouter.add_event_handlerW  s<    444"OO""4(##D)r+   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 rK   )r|  )rC   r{  r%   s    r*   rs  z"Router.on_event.<locals>.decoratorf  s    "":t4Kr+   rt  rv  )r%   r{  rs  s   `` r*   on_eventzRouter.on_event_  s%    T	
	 r+   )NTNNNN)r   r  rH  r   rJ  r  rK  7typing.Sequence[typing.Callable[[], typing.Any]] | NonerL  r  rP  zLifespan[typing.Any] | Noner   r   r-   r.   rS   r   rD  r   rK   )re   r,   rR   r   r&   r   r-   r.   r  )NNT)re   r,   r\   Atyping.Callable[[Request], typing.Awaitable[Response] | Response]r   r   r&   r   r   r   r-   r.   )re   r,   r\   4typing.Callable[[WebSocket], typing.Awaitable[None]]r&   r   r-   r.   )
re   r,   r   r   r&   r   r   r   r-   ru  )re   r,   r&   r   r-   ru  )r{  r,   rC   ztyping.Callable[[], typing.Any]r-   r.   )r{  r,   r-   ru  )r/   r0   r1   r$   rI  r   r>  rA  rP  r   rR   r   rk  r  rn  rp  r  ry  r|  r  r;   r+   r*   r   r   B  s    59!%"&NROS 15;T :>;T1;T ;T  	;T
 L;T M;T .;T 7;T 
;Tz-.?6:01dI"" %)"&"" T" "	"
 "  " 
"*  	"" G" 	"
 
" %)"& " 	
   
@(*r+   r   )rF   r   r-   r   )rC   r  r-   r   )rC   r  r-   r   )r\   r   r-   r,   )re   r,   rf   z dict[str, Convertor[typing.Any]]r'   zdict[str, str]r-   ztuple[str, dict[str, str]])re   r,   r-   zAtuple[typing.Pattern[str], str, dict[str, Convertor[typing.Any]]])r6  zStyping.Callable[[typing.Any], typing.Generator[typing.Any, typing.Any, typing.Any]]r-   zEtyping.Callable[[typing.Any], typing.AsyncContextManager[typing.Any]])E
__future__r   r3  rA   rD   r|   r-  typestypingr=   r   enumr   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   r5   rG   rT   rY   r]   rj   r   rx   r   r   r   r   r   r  TypeVarr   AsyncContextManagerr"  r7  r9  r   r;   r+   r*   <module>r     s   "    	     *  E > 3 ; : : . + & M M C C :V9 VD ,
K.
>&F
6    	 bjjOP5A
5AF5Ap0 0<^RI ^RB?TY ?TDaTI aTH;T9 ;T| V^^DAv99"= A 	i	J	 h hr+   