
    CCf                       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       Q/var/www/highfloat_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   ,   sV    
 MM	3
 S)++
,hh S)++
,&&s++r+   c                     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                   K   t              r        d {   }nt               d {   } || ||       d {    y 7 ,7 7 	wN)r   r	   )scopereceivesendresponserC   requests       r*   appz*request_response.<locals>.app.<locals>.appF   sI      &!%g.!24!AA5'4000 /A0s1   AAAA	AAA	AArL   r   rM   r   rN   r   r-   r.   )r   r   )rL   rM   rN   rQ   rP   rC   s       @r*   rQ   zrequest_response.<locals>.appC   s8     %$/	1 9*38NNNs   ,868rR   r;   rC   rQ   s   ` r*   request_responserT   ;   s    
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*   rQ   z+websocket_session.<locals>.app.<locals>.app]   s     w-s   rR   )r   r   )rL   rM   rN   rQ   rX   rC   s       @r*   rQ   zwebsocket_session.<locals>.appZ   s8     E7>	  9*38NNNs   -979rR   r;   rS   s   ` r*   websocket_sessionrY   R   s    O Jr+   c                    t        j                  |       st        j                  |       r| j                  S | j                  j                  S rK   )rD   	isroutineisclassr/   r)   )endpoints    r*   get_namer^   e   s9    "gooh&?   &&&r+   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_paramsrk   k   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)rf   is_host
path_regexpath_formatduplicated_paramsidxrg   match
param_nameconvertor_typerj   namesendinghostnames                 r*   compile_pathr   }   s    //#&&GJK
C%%d+ %*\\%%8"
N'..s3o-	8%n%5Q7	8-#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   rR   )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 ]  \  }}	}
 ||	d| j                  i|
| _        ! |d | _        nL|D ch c]  }|j#                          c}| _        d| j                   v r| j                   j%                  d       t'        |      \  | _        | _        | _        y c c}w )Nrm    Routed paths must start with '/'GETrQ   HEAD)rw   rf   r]   r^   r&   r   r@   rA   rB   rC   rD   
isfunctionismethodrT   rQ   reversedr   upperr   r   r   r   rg   )r%   rf   r]   r   r&   r   r   endpoint_handlerclsargskwargsmethods               r*   r$   zRoute.__init__   sW    s#G%GG#	 *.,HX&D	!2#)9+<+<=/44 )9+<+<=./73C3CDT3U'1DH '  DH!%-j%9 >!T6d=488=f=> ?DL9@AvFLLNADL$  (COPTCU@)4+@	 Bs   	E0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   	groupdictrb   rg   convertdictgetr   r]   r   r5   r9   r:   r8   	r%   rL   
route_pathr   matched_paramsrh   ri   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   rf   protocolrx   r"   rg   r&   r   rk   r   r   r%   r&   r'   seen_paramsexpected_paramsrf   remaining_paramss          r*   r   zRoute.url_path_for  s    +**,-d3388:;499 >t[11!/d33["
 $##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   rQ   i  )r   headerszMethod Not Allowed)r   r    r   r   rQ   )r%   rL   rM   rN   r   rO   s         r*   r   zRoute.handle  s     <<E(O4<<?		$,, 78G~#WEE,(c7 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   rf   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=rs   )r)   r/   r   r   rf   r&   )r%   
class_namer   rf   r&   s        r*   __repr__zRoute.__repr__3  sT    ^^,,
+,YY		dVD874(*WKqQQr+   )rf   r,   r]    typing.Callable[..., typing.Any]r   list[str] | Noner&   
str | Noner   boolr   "typing.Sequence[Middleware] | Noner-   r.   r   r   rR   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 ]  \  }}} ||d| j                  i|| _        ! t        |      \  | _        | _        | _        y )Nrm   r   rQ   )rw   rf   r]   r^   r&   r@   rA   rB   rC   rD   r   r   rY   rQ   r   r   r   r   rg   )	r%   rf   r]   r&   r   r   r   r   r   s	            r*   r$   zWebSocketRoute.__init__;  s     s#G%GG#	 *.,HX&D	#)9+<+<=/44 )9+<+<=./73C3CDT3U(2DH  DH!%-j%9 >!T6d=488=f=> 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   rb   rg   r   r   r   r   r]   r5   r:   r8   r   s	            r*   r   zWebSocketRoute.matchesX  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_forg  s    +**,-d3388:;499 >t[11!/d33["
 $##D;77r+   c                F   K   | j                  |||       d {    y 7 wrK   rQ   r   s       r*   r   zWebSocketRoute.handlet       hhugt,,,   !!c                    t        |t              xr4 | j                  |j                  k(  xr | j                  |j                  k(  S rK   )r@   r   rf   r]   r   s     r*   r   zWebSocketRoute.__eq__w  s;    un- 0		UZZ'0/	
r+   c                h    | j                   j                   d| j                  d| j                  dS )Nr   r   rs   )r)   r/   rf   r&   r%   s    r*   r   zWebSocketRoute.__repr__~  s/    ..))*&WTYYMQRSSr+   )
rf   r,   r]   r   r&   r   r   r   r-   r.   r   r   rR   r   r   r   r;   r+   r*   r   r   :  s_      9=VV 3V
 V 7V 
V:8-
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 ]  \  }}} ||d| j
                  i|| _        ! || _        t        | j                  dz         \  | _	        | _
        | _        y )Nro   rm   r   z0Either 'app=...', or 'routes=' must be specified)routesrQ   z/{path:path})rw   rstriprf   	_base_appRouterrQ   r   r&   r   r   r   rg   )	r%   rf   rQ   r   r&   r   r   r   r   s	            r*   r$   zMount.__init__  s     rzT__S1U3UU1Ov1	>=	>1KK$	?&)DN#62DN>>!%-j%9 >!T6d=488=f=>	COII&D
@)4+@r+   c                0    t        | j                  dg       S Nr   )getattrr   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_pathro   rm   rf   r'   app_root_path)r'   r   r   r]   )r   r   r   r   r   rb   rg   r   re   r   r   r   rQ   r5   r:   r8   )r%   rL   r   r   r   r   rh   ri   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)Nrf   rm   )rf   rp   r6   ro   r   )r&   r|   rk   r   rg   r   rw   r   r   r   r   r   r,   r   r   )
r%   r&   r'   rf   r   remaining_name
path_kwargpath_prefixrouteurls
             r*   r   zMount.url_path_for  s   99 TTYY%66[;P"-f"5"<"<S"AK%3  $"7"7&"D" $D))YY$//$))c/"Byy !% "&c$))nq&8&:!;$0J"$K,:  $"7"7-)K) %+5 (* ,%,,^P?OPC"(//4s3x?#,,  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   rf   rQ   r   s     r*   r   zMount.__eq__  s;    ue$ &		UZZ'&EII%	
r+   c                    | j                   j                  }| j                  xs d}| d| j                  d|d| j                  dS )Nro   r   r   , app=rs   )r)   r/   r&   rf   rQ   r%   r   r&   s      r*   r   zMount.__repr__  F    ^^,,
yyBVDII=xvdhh\QRSSr+   )NNN)rf   r,   rQ   ASGIApp | Noner   !typing.Sequence[BaseRoute] | Noner&   r   r   r   r-   r.   r-   zlist[BaseRoute]r   r   rR   r   r   r/   r0   r1   r$   propertyr   r   r   r   r   r   r;   r+   r*   r   r     s     #48
 :>

 
 2	

 
 7
 

6 5 5B.B-
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 )Nrm   zHost must not start with '/')rw   hostrQ   r&   r   
host_regexhost_formatrg   )r%   r  rQ   r&   s       r*   r$   zHost.__init__  sI    ??3'G)GG'		COPTCU@)4+@r+   c                0    t        | j                  dg       S r   )r   rQ   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  ro   rp   r   r'   )r'   r]   )r   r   r   r  r   r   rb   rg   r   r   r   rQ   r5   r:   r8   )
r%   rL   r   r  r   r   rh   ri   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)Nrf   )rf   r  rp   r6   )rf   r   r  )r&   re   rk   r  rg   r   rw   r   r   r   r,   r   r   )	r%   r&   r'   rf   r  r   r  r  r  s	            r*   r   zHost.url_path_for  s=   99 TTYY%66[;P??6*D%3  $"7"7&"D" $Dt44YY$//$))c/"Byy !% "&c$))nq&8&:!;%3  $"7"7&"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  rQ   r   s     r*   r   zHost.__eq__-  s;    ud# &		UZZ'&EII%	
r+   c                    | j                   j                  }| j                  xs d}| d| j                  d|d| j                  dS )Nro   z(host=r   r  rs   )r)   r/   r&   r  rQ   r  s      r*   r   zHost.__repr__4  r  r+   rK   r  r,   rQ   r   r&   r   r-   r.   r  r   r   rR   r   r   r  r;   r+   r*   r  r    s6    V / /.6-
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__A  s     xx!!##s   c                D   K   | j                   j                  |||      S wrK   )r&  __exit__)r%   exc_type	exc_value	tracebacks       r*   	__aexit__z"_AsyncLiftContextManager.__aexit__D  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*  r0  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$  )rQ   cmgrs    r*   wrapperz+_wrap_gen_lifespan_context.<locals>.wrapperT  s    'S	22r+   )rQ   r   r-   z$_AsyncLiftContextManager[typing.Any])
contextlibcontextmanagerrA   wraps)lifespan_contextr4  r3  s     @r*   _wrap_gen_lifespan_contextr9  M  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__\  s	    r+   c                T   K   | j                   j                          d {    y 7 wrK   )r=  startupr   s    r*   r*  z_DefaultLifespan.__aenter___  s     ll""$$$   (&(c                T   K   | j                   j                          d {    y 7 wrK   )r=  shutdown)r%   exc_infos     r*   r0  z_DefaultLifespan.__aexit__b  s     ll##%%%rA  c                    | S rK   r;   )r%   rQ   s     r*   r   z_DefaultLifespan.__call__e  s    r+   N)r>  r   r-   r.   )rD  objectr-   r.   )r%   r"  rQ   rG  r-   r"  )r/   r0   r1   r$   r*  r0  r   r;   r+   r*   r;  r;  [  s    %&r+   r;  c                  B   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?   r;  r8  rD   isasyncgenfunctionr   isgeneratorfunctionr9  rQ   middleware_stackr   )r%   r   rJ  rL  rM  rN  lifespanr   r   r   r   s              r*   r$   zRouter.__init__j  s`    #NbV 0)0t~~g * 2"Z8H!,!42${:KMMK #	  :J4:PD!''1MMJ"
 %8%D! ((2MMJ"
 %?%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   rQ   r   r   r   )r   r   r   )r%   rL   rM   rN   r   rO   s         r*   rK  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)rM  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)rN  r   rV  s     r*   rC  zRouter.shutdown  s6      '' 	G )i			rX  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   r8  RuntimeErrorr   BaseExceptionr/  
format_exc)r%   rL   rM   rN   startedrQ   maybe_stateexc_texts           r*   rR  zRouter.lifespan  s<    
 ))E*i	?,,S1 	  	 [*e+*X  '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)rQ  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   rR  r>  rR  r   rm   rf   r  )r  )rR  r   r   r5   r:   r   r   r9   r   rJ  r   endswithr   r8   r   r   r,   rL  )r%   rL   rM   rN   rB   r  r   r   partial_scoper   redirect_scoperedirect_urlrO   s                r*   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 rK   )r@   r   r   r   s     r*   r   zRouter.__eq__(  s!    %(HT[[ELL-HHr+   c                V    t        |||      }| j                  j                  |       y N)rQ   r&   )r   r   append)r%   rf   rQ   r&   r  s        r*   mountzRouter.mount+  s$     d$/5!r+   c                V    t        |||      }| j                  j                  |       y rk  )r  r   rl  )r%   r  rQ   r&   r  s        r*   r  zRouter.host1  s$     Ts.5!r+   c                Z    t        |||||      }| j                  j                  |       y )N)r]   r   r&   r   )r   r   rl  )r%   rf   r]   r   r&   r   r  s          r*   	add_routezRouter.add_route7  s1     /
 	5!r+   c                V    t        |||      }| j                  j                  |       y )N)r]   r&   )r   r   rl  )r%   rf   r]   r&   r  s        r*   add_websocket_routezRouter.add_websocket_routeH  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   )rp  )rC   r   r   r&   rf   r%   s    r*   	decoratorzRouter.route.<locals>.decoratore  s*    NN"3   Kr+   rC   typing.Callabler-   rw  r=   r>   r?   )r%   rf   r   r&   r   ru  s   ````` r*   r  zRouter.routeQ  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&   )rr  )rC   r&   rf   r%   s    r*   ru  z)Router.websocket_route.<locals>.decorator  s    $$T4d$;Kr+   rv  rx  )r%   rf   r&   ru  s   ``` r*   websocket_routezRouter.websocket_routeq  s'     	`	
	 r+   c                    |dv sJ |dk(  r| j                   j                  |       y | j                  j                  |       y )N)r@  rC  r@  )rM  rl  rN  )r%   
event_typerC   s      r*   add_event_handlerzRouter.add_event_handler  sA     4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*   ru  z"Router.on_event.<locals>.decorator  s    "":t4Kr+   rv  rx  )r%   r}  ru  s   `` r*   on_eventzRouter.on_event  s%    T	
	 r+   )NTNNNN)r   r  rJ  r   rL  r  rM  7typing.Sequence[typing.Callable[[], typing.Any]] | NonerN  r  rR  zLifespan[typing.Any] | Noner   r   r-   r.   rR   r   rF  r   rK   )rf   r,   rQ   r   r&   r   r-   r.   r!  )NNT)rf   r,   r]   Atyping.Callable[[Request], typing.Awaitable[Response] | Response]r   r   r&   r   r   r   r-   r.   )rf   r,   r]   4typing.Callable[[WebSocket], typing.Awaitable[None]]r&   r   r-   r.   )
rf   r,   r   r   r&   r   r   r   r-   rw  )rf   r,   r&   r   r-   rw  )r}  r,   rC   ztyping.Callable[[], typing.Any]r-   r.   )r}  r,   r-   rw  )r/   r0   r1   r$   rK  r   r@  rC  rR  r   rQ   r   rm  r  rp  rr  r  r{  r~  r  r;   r+   r*   r   r   i  s    59!%"&NROS 15<T :><T1<T <T  	<T
 L<T M<T .<T 7<T 
<T|-.?::01dI ;?""%"-7"	" ;?""%"-7"	" %)"&"" T" "	"
 "  " 
"*  	"" G" 	"
 
" %)"& " 	
   
@(**%D*	*r+   r   )rF   r   r-   r   )rC   r  r-   r   )rC   r  r-   r   )r]   r   r-   r,   )rf   r,   rg   z dict[str, Convertor[typing.Any]]r'   zdict[str, str]r-   ztuple[str, dict[str, str]])rf   r,   r-   zAtuple[typing.Pattern[str], str, dict[str, Convertor[typing.Any]]])r8  zStyping.Callable[[typing.Any], typing.Generator[typing.Any, typing.Any, typing.Any]]r-   zEtyping.Callable[[typing.Any], typing.AsyncContextManager[typing.Any]])E
__future__r   r5  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^   rk   r   ry   r   r   r   r   r   r  TypeVarr"  AsyncContextManagerr$  r9  r;  r   r;   r+   r*   <module>r     s   "    	     *  E > 3 ; : : . + & M M C C :V9 VD ,
K.
>&'
6    	 bjjOP7A
7AF7At0 0<bRI bRJETY ETPoTI oTdCT9 CTL V^^DAv99"= A  K	 q qr+   