a
    -=ic:                     @   s  d 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 ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ zddlZW n& ey   G dd dZe ZY n0 dZejdkr*zed W n ey(   dZY n0 eedZ e rBej!Z!nG dd dZ!z
ej"Z#W n e$yr   dZ#Y n0 dZ%ej&ej'dej(e)ej&e) f df  Z*ej+rddl,Z-ddl.m/Z/ ddl.m0Z0 ddl1m2Z2 ddl3m4Z4 G dd  d ej5Z6G d!d" d"eZ7e)e)e)d#d$d%Z8dRej&e) ej(d& d'd(d)Z9dSe)ej&e) ej&e) ej(e)e)f d*d+d,Z:dd-d.d/Z;dTe)ej&e) ej&e< dd0d1d2Z=dUej&e> e?d3d4d5Z@e)e<ejAd6d7d8ZBe)e<ejAej'ej(e)e<f e)f d9d:d;ZCejAe)d<d=d>ZDG d?d@ d@eZEG dAdB dBejFeEZGG dCdD dDe!eEZHdVe)e<dEe?e<ej&ejIe7  e?ej&e* ej&e< eEdF
dGdHZJe?d-dIdJZKe)e<ejdKdLdMZLdWe)e<dEe?e?e?ej&ejMe)  ej&ejMe)  e<e)e?e<ej&ejIe7  ej&ejNe)ej'e)ej(e)e)f f f  e?ej&e* ddOdPdQZOdS )Xa  A WSGI and HTTP server for use **during development only**. This
server is convenient to use, but is not designed to be particularly
stable, secure, or efficient. Use a dedicate WSGI server and HTTP
server when deploying to production.

It provides features like interactive debugging and code reloading. Use
``run_simple`` to start the server. Put this in a ``run.py`` script:

.. code-block:: python

    from myapp import create_app
    from werkzeug import run_simple
    N)datetime)	timedelta)timezone)BaseHTTPRequestHandler)
HTTPServer   _log)_wsgi_encoding_dance)InternalServerError)
uri_to_iri)	url_parse)url_unquotec                   @   s   e Zd ZeejdddZdS )	_SslDummynamereturnc                 C   s   t dd S )NzUSSL is unavailable because this Python runtime was not compiled with SSL/TLS support.)RuntimeErrorselfr    r   a/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/werkzeug/serving.py__getattr__'   s    z_SslDummy.__getattr__N)__name__
__module____qualname__strtAnyr   r   r   r   r   r   &   s   r   TntcoloramaFforkc                   @   s   e Zd ZdS )ForkingMixInN)r   r   r   r   r   r   r   r"   =   s   r"      zssl.SSLContextzte.Literal['adhoc'])WSGIApplication)WSGIEnvironment)RSAPrivateKeyWithSerialization)Certificatec                   @   sR   e Zd ZdZeje ddddZedddZ	e
dd	d
Zee
dddZdS )DechunkedInputz8An input stream that handles Transfer-Encoding 'chunked'N)rfiler   c                 C   s   || _ d| _d| _d S )NFr   )_rfile_done_len)r   r)   r   r   r   __init__Y   s    zDechunkedInput.__init__r   c                 C   s   dS )NTr   r   r   r   r   readable^   s    zDechunkedInput.readablec              
   C   sf   z"| j  d}t| d}W n. tyP } ztd|W Y d }~n
d }~0 0 |dk rbtd|S )Nlatin1   zInvalid chunk headerr   z!Negative chunk length not allowed)r*   readlinedecodeintstrip
ValueErrorOSError)r   liner,   er   r   r   read_chunk_lena   s     zDechunkedInput.read_chunk_len)bufr   c                 C   s   d}| j s|t|k r| jdkr*|  | _| jdkr:d| _ | jdkrtt|| j}|| t|kr| jt|| ||d < |  jt|| 8  _t|}n.| j||||| < |  j|8  _||7 }| jdkr| j }|dvrtdq|S )Nr   T)   
   
   z!Missing chunk terminating newline)	r+   lenr,   r;   minr*   readr3   r8   )r   r<   rB   n
terminatorr   r   r   readintok   s(    







zDechunkedInput.readinto)r   r   r   __doc__r   IObytesr-   boolr0   r5   r;   	bytearrayrE   r   r   r   r   r(   V   s
   
r(   c                       s  e Zd ZU dZded< eedddZdddd	Zd
dddZ	d
d fddZ
d%eejd d
dddZeejd fddZedddZedddZd&ejeef ejeef d
dddZeejd
dddZeejd
dd d!Zeeejd
d"d#d$Z  ZS )'WSGIRequestHandlerz3A request handler that implements WSGI dispatching.BaseWSGIServerserverr.   c                 C   s   ddl m} d| S )Nr   )__version__z	Werkzeug/) rN   )r   rN   r   r   r   server_version   s    z!WSGIRequestHandler.server_versionr%   c                 C   s  t | j}| jjd u rdnd}| js,d| _nt| jtrD| jdf| _|jsd|jrdd|j |j }n|j}t	|}d|| j
tj| jj| jjd| j| j| jdt|t|jt| jt| j|  |  | jjd t| jjd	 | jd
}| j D ]\\}}| dd}|dd}|dvrDd| }||v rD||  d| }|||< q|dd  dkrd|d< t|d |d< |jr|jr|j|d< z*| jj dd}|d urt!"||d< W n4 t#y   | j$dd Y n t%y   Y n0 |S )Nhttphttps)<local>r   r   /)r   r   FrO   r   )zwsgi.versionzwsgi.url_scheme
wsgi.inputzwsgi.errorszwsgi.multithreadzwsgi.multiprocesszwsgi.run_oncezwerkzeug.socketSERVER_SOFTWAREREQUEST_METHODZSCRIPT_NAMEZ	PATH_INFOZQUERY_STRINGZREQUEST_URIZRAW_URIREMOTE_ADDRZREMOTE_PORTZSERVER_NAMEZSERVER_PORTZSERVER_PROTOCOL-_z
)ZCONTENT_TYPEZCONTENT_LENGTHZHTTP_,ZHTTP_TRANSFER_ENCODINGchunkedTzwsgi.input_terminatedrU   Z	HTTP_HOST)binary_formZSSL_CLIENT_CERTerrorz&Cannot fetch SSL peer certificate info)&r   pathrM   ssl_contextclient_address
isinstancer   schemenetlocr   r)   sysstderrmultithreadmultiprocess
connectionrP   commandr
   queryaddress_stringport_integerserver_addressrequest_versionheadersitemsupperreplacegetr6   lowerr(   getpeercertsslDER_cert_to_PEM_certr7   logAttributeError)r   request_url
url_schemeZ	path_infoenvironkeyvalueZ	peer_certr   r   r   make_environ   sn    







zWSGIRequestHandler.make_environNc                    s  j dd  dkr&jd   _d d d d d td d fdddfd	d
	dd d fdd}z|j	j
 W n ttjfy } z| W Y d }~nd }~0  ty } zj	jr d ur rd_z d u r$d d |t  W n tyD   Y n0 ddlm} || }j	dd|  W Y d }~n
d }~0 0 d S )NZExpectrO   z100-continues   HTTP/1.1 100 Continue

F)datar   c                    s~  d usJ dd us J dd u rz d d\}}W n tyb   d }}Y n0 t|}|| t }D ]"\}}|| ||  qd|v sd dksd|  krdk sn |d	v sjd
krd dd dd 	  t
| tsJ d| rp rRjtt| dd    jd j|   rpjd j  d S )Nzwrite() before start_responser   rO   zcontent-lengthrW   HEADd      >   i0     HTTP/1.1TzTransfer-Encodingr\   
Connectionclosezapplications must write bytes   r>   )splitr7   r5   Zsend_responsesetZsend_headeraddru   protocol_versionZend_headersrb   rH   wfilewritehexr@   encodeflush)r   Zcode_strmsgcodeheader_keysr~   r   )chunk_responser}   headers_sentheaders_setr   status_sent
status_setr   r   r      sP    


	 z*WSGIRequestHandler.run_wsgi.<locals>.writec                    sD   |r,z r|d  |d W d }q8d }0 nr8td| |S )Nr   r   zHeaders already set)with_tracebackAssertionError)statusrp   exc_info)r   r   r   r   r   r   start_response3  s    z3WSGIRequestHandler.run_wsgi.<locals>.start_responser$   )appr   c              	      sh   | }zD|D ]}| qs*d  r:j d W t|drd|  nt|drb|  0 d S )N    s   0

r   )r   r   hasattrr   )r   Zapplication_iterr   )r   r}   r   r   r   r   r   r   executeA  s    




z,WSGIRequestHandler.run_wsgi.<locals>.executeTr   )DebugTracebackr^   zError on request:
)N)rp   rt   ru   r6   r   r   r   r}   rH   rM   r   ConnectionErrorsockettimeoutconnection_dropped	Exceptionpassthrough_errorsZclose_connectionr   Zdebug.tbtoolsr   Zrender_traceback_textry   )r   r   r:   r   r   r   )	r   r}   r   r   r   r   r   r   r   r   run_wsgi   s<     9 
zWSGIRequestHandler.run_wsgic              
      s   zt    W nz ttjfyB } z| | W Y d}~nPd}~0  ty } z0| jjdurrt	|rr| 
d| n W Y d}~n
d}~0 0 dS )z/Handles a request ignoring dropped connections.NzSSL error occurred: %s)superhandler   r   r   r   r   rM   r`   is_ssl_error	log_error)r   r:   	__class__r   r   r   h  s    zWSGIRequestHandler.handle)r^   r}   r   c                 C   s   dS )z`Called if the connection was closed by the client.  By default
        nothing happens.
        Nr   )r   r^   r}   r   r   r   r   t  s    z%WSGIRequestHandler.connection_droppedr   c                    s   | dr| jS tt |S )NZdo_)
startswithr   getattrr   r   r   r   r   r   {  s    
zWSGIRequestHandler.__getattr__c                 C   s*   t | dd r| jd S | js dS | jd S )Nr}   rX   rS   r   )r   r}   ra   r/   r   r   r   rl     s
    
z!WSGIRequestHandler.address_stringc                 C   s
   | j d S )Nr   )ra   r/   r   r   r   rm     s    zWSGIRequestHandler.port_integerrY   )r   sizer   c                 C   s   z&t | j}| j d| d| j }W n ty>   | j}Y n0 t|}|d dkr`t|d}np|dkrjnf|dkr~t|d}nR|d dkrt|d	}n:|d
krt|d}n&|d dkrt|dd}nt|dd}| dd||| d S )N r   1boldZ200Z304cyan3greenZ404yellow4redmagentainfoz
"%s" %s %s)	r   r_   rj   ro   rz   Zrequestliner   _ansi_stylery   )r   r   r   r_   r   r   r   r   log_request  s(    
zWSGIRequestHandler.log_request)formatargsr   c                 G   s   | j d|g|R   d S )Nr^   ry   r   r   r   r   r   r   r     s    zWSGIRequestHandler.log_errorc                 G   s   | j d|g|R   d S )Nr   r   r   r   r   r   log_message  s    zWSGIRequestHandler.log_messagetypemessager   r   c                 G   s0   t ||   d|   d| dg|R   d S )Nz - - [z] 
)r	   rl   Zlog_date_time_stringr   r   r   r   r   r   r   ry     s    zWSGIRequestHandler.log)N)rY   rY   )r   r   r   rF   __annotations__propertyr   rP   r   r   r   BaseExceptionr   Optionalr   r   r   rl   r5   rm   Unionr   r   r   ry   __classcell__r   r   r   r   rK      s.   
Py 
	 rK   )r   stylesr   c                 G   sB   t s| S ddddddd}|D ]}d||  d	|  } q|  d
S )Nr          !   #   $   )r   r   r   r   r   r   z[mz[0m)_log_add_style)r   r   codesstyler   r   r   r     s    	r   )r'   r&   )cnr   c           
      C   s8  z@ddl m} ddlm} ddlm} ddlm} ddlm	} W n t
y\   tdd Y n0 | }|jdd	|d
}| d u rd} |||jd||j| g}| }| ||| | ttjttjtdd j||j gddj|!|"| gdd#||$ |}	|	|fS )Nr   )x509)NameOID)default_backend)hashes)rsaz<Using ad-hoc certificates requires the cryptography library.i  i   )Zpublic_exponentZkey_sizebackend*zDummy Certificateim  )daysF)critical)%Zcryptographyr   Zcryptography.x509.oidr   Zcryptography.hazmat.backendsr   cryptography.hazmat.primitivesr   Z)cryptography.hazmat.primitives.asymmetricr   ImportError	TypeErrorZgenerate_private_keyNameZNameAttributeZORGANIZATION_NAMEZCOMMON_NAMEZCertificateBuilderZsubject_nameZissuer_nameZ
public_keyZserial_numberZrandom_serial_numberZnot_valid_beforedtnowr   utcZnot_valid_afterr   add_extensionZExtendedKeyUsageZOID_SERVER_AUTHZSubjectAlternativeNameZDNSNamesignSHA256)
r   r   r   r   r   r   r   pkeysubjectcertr   r   r   generate_adhoc_ssl_pair  sZ    
	
r   )	base_pathhostr   r   c           	      C   s   |durd| d| }t |d\}}ddlm} |  d}|  d}t|d	$}|||jj W d   n1 sz0    Y  t|d	2}||j|jj|j	j
| d
 W d   n1 s0    Y  ||fS )a  Creates an SSL key for development.  This should be used instead of
    the ``'adhoc'`` key which generates a new cert on each server start.
    It accepts a path for where it should store the key and cert and
    either a host or CN.  If a host is given it will use the CN
    ``*.host/CN=host``.

    For more information see :func:`run_simple`.

    .. versionadded:: 0.9

    :param base_path: the path to the certificate and key.  The extension
                      ``.crt`` is added for the certificate, ``.key`` is
                      added for the key.
    :param host: the name of the host.  This can be used as an alternative
                 for the `cn`.
    :param cn: the `CN` to use.
    Nz*.z/CN=)r   r   serializationz.crtz.keywbencodingr   Zencryption_algorithm)r   r   r   openr   public_bytesEncodingPEMprivate_bytesPrivateFormatTraditionalOpenSSLNoEncryption)	r   r   r   r   r   r   	cert_file	pkey_filefr   r   r   make_ssl_devcert  s"    

2"r  r.   c            
      C   s   ddl } ddl}t \}}ddlm} |  \}}|  \}}|tj| |tj| t	||
|jj t	||j|jj|jj| d t| t| t||}	|	S )z:Generates an adhoc SSL context for the development server.r   Nr   r   )tempfileatexitr   r   r   mkstempregisterosremover   r   r   r   r   r   r  r  r   load_ssl_context)
r  r  r   r   r   Zcert_handler  Zpkey_handler  ctxr   r   r   generate_adhoc_ssl_context'  s*    
	


r  )r  r  protocolr   c                 C   s(   |du rt j}t |}|| | |S )a  Loads SSL context from cert/private key files and optional protocol.
    Many parameters are directly taken from the API of
    :py:class:`ssl.SSLContext`.

    :param cert_file: Path of the certificate to use.
    :param pkey_file: Path of the private key to use. If not given, the key
                      will be obtained from the certificate file.
    :param protocol: A ``PROTOCOL`` constant from the :mod:`ssl` module.
        Defaults to :data:`ssl.PROTOCOL_TLS_SERVER`.
    N)rw   PROTOCOL_TLS_SERVER
SSLContextload_cert_chain)r  r  r  r  r   r   r   r  E  s
    
r  )r^   r   c                 C   s(   | du rt tt d } t| tjS )z?Checks if the given error (or the current one) is an SSL error.Nr   )r   castr   re   r   rb   rw   SSLError)r^   r   r   r   r   Z  s    r   )r   portr   c                 C   s.   |  drtjS d| v r(ttdr(tjS tjS )zUReturn ``AF_INET4``, ``AF_INET6``, or ``AF_UNIX`` depending on
    the host and port.zunix://:AF_INET6)r   r   AF_UNIXr   r  AF_INET)r   r  r   r   r   select_address_familya  s
    
r  )r   r  familyr   c                 C   s\   |t kr| ddd S zt| ||tjtj}W n tjyN   | |f Y S 0 |d d S )zVReturn a fully qualified socket address that can be passed to
    :func:`socket.bind`.://r   r      )af_unixr   r   getaddrinfoSOCK_STREAMIPPROTO_TCPgaierror)r   r  r  resr   r   r   get_sockaddrk  s    r%  )r  r   c              	   C   s   | t jkrdnd}t  | t jb}z||df W n2 tyf   | t jkrPdnd Y W  d   S 0 | d W  d   S 1 s0    Y  dS )zGet the IP address of an external interface. Used when binding to
    0.0.0.0 or ::1 to show a more useful URL.

    :meta private:
    zfd31:f903:5ab5:1::1z10.253.155.219i2  z::1	127.0.0.1Nr   )r   r  
SOCK_DGRAMconnectr8   getsockname)r  r   sr   r   r   get_interface_ip{  s    &r+  c                
       s   e Zd ZdZdZdZeZdee	de
je
je  ee
je e
je	 dd fddZeee
jddd	d
Zdedd fddZe
je
je
jee	f ef dd fddZddddZ  ZS )rL   zuA WSGI server that that handles one request at a time.

    Use :func:`make_server` to create a server instance.
    FNr$   )r   r  r   handlerr   r`   fdr   c           
         sj  |d u rt }dt|vr*| js$| jr*d|_|| _|| _|| _|| _t	|| | _
}t|t||}	|tkr|d u rtt|	}	tj|	rt|	 t j|	|dd |d u rz|   |   W n ty   |    Y n0 nt||tj| _| j | _|tkr| jd | _|d ur`t |t!r6t"| }n|dkrFt# }|j$| jdd| _|| _%nd | _%d S )	Nr   r   F)bind_and_activater   ZadhocT)server_side)&rK   varsrg   rh   r   r   r  r   r   r  address_familyr%  r5   r  r   r  r   r  r_   existsunlinkr   r-   server_bindserver_activater   server_closer   fromfdr!  r)  rn   rb   tupler  r  wrap_socketr`   )
r   r   r  r   r,  r   r`   r-  r1  rn   r   r   r   r-     sT    






zBaseWSGIServer.__init__r   c                 G   s   t ||g|R   d S Nr   r   r   r   r   ry     s    zBaseWSGIServer.log      ?)poll_intervalr   c                    sB   z2zt  j|d W n ty&   Y n0 W |   n
|   0 d S )N)r<  )r   serve_foreverKeyboardInterruptr6  )r   r<  r   r   r   r=    s
    zBaseWSGIServer.serve_forever)requestra   r   c                    s   | j r t ||S r:  )r   r   handle_error)r   r?  ra   r   r   r   r@    s    zBaseWSGIServer.handle_errorr.   c                 C   s   d}t |dd}|g}| jtkr4|d| j  n| jdu rBdnd}| j}| jdv r|d	| j d
 | jdkrd}ttj}nd}ttj	}|d| d| d| j
  d|v rd| d}|d| d| d| j
  tdd| dS )z<Show information about the address when starting the server.zvWARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.r   r   z * Running on NrQ   rR   >   z::0.0.0.0z * Running on all addresses ()rA  r&  z[::1]r  r  []r   r   )r   r1  r  appendr   r`   r+  r   r  r  r  r	   join)r   Zdev_warningmessagesrc   Zdisplay_hostname	localhostr   r   r   log_startup  s(    



zBaseWSGIServer.log_startup)NFNN)r;  )r   r   r   rF   rg   rh   LISTEN_QUEUErequest_queue_sizer   r5   r   r   TyperK   rI   _TSSLContextArgr-   r   ry   floatr=  r   Tupler@  rI  r   r   r   r   r   rL     s0       I	rL   c                   @   s   e Zd ZdZdZdZdS )ThreadedWSGIServerzA WSGI server that handles concurrent requests in separate
    threads.

    Use :func:`make_server` to create a server instance.
    TN)r   r   r   rF   rg   daemon_threadsr   r   r   r   rP    s   rP  c                       sT   e Zd ZdZdZd
eedeejej	e
  eeje eje dd	 fdd	Z  ZS )ForkingWSGIServerzA WSGI server that handles concurrent requests in separate forked
    processes.

    Use :func:`make_server` to create a server instance.
    T(   NFr$   )	r   r  r   	processesr,  r   r`   r-  r   c	           	   	      s.   t stdt ||||||| || _d S )Nz'Your platform does not support forking.)can_forkr7   r   r-   max_children)	r   r   r  r   rT  r,  r   r`   r-  r   r   r   r-   *  s    zForkingWSGIServer.__init__)rS  NFNN)r   r   r   rF   rh   r   r5   r   r   rL  rK   rI   rM  r-   r   r   r   r   r   rR  !  s$        rR  r$   )
r   r  r   threadedrT  request_handlerr   r`   r-  r   c	           	   
   C   sd   |r|dkrt d|r.t| ||||||dS |dkrNt| |||||||dS t| ||||||dS )a6  Create an appropriate WSGI server instance based on the value of
    ``threaded`` and ``processes``.

    This is called from :func:`run_simple`, but can be used separately
    to have access to the server object, such as to run it in a separate
    thread.

    See :func:`run_simple` for parameter docs.
    r   z4Cannot have a multi-thread and multi-process server.r-  )r7   rP  rR  rL   )	r   r  r   rW  rT  rX  r   r`   r-  r   r   r   make_server<  s(    rZ  c                   C   s   t jddkS )zqCheck if the server is running as a subprocess within the
    Werkzeug reloader.

    .. versionadded:: 0.10
    ZWERKZEUG_RUN_MAINtrue)r  r}   rt   r   r   r   r   is_running_from_reloaderi  s    r\  )hostnamer  r   c              
   C   s  t | |}t| ||}t|tj}|tjtjd |d |tkrjt	
t|}tj|rjt| z|| W n ty } zht|jtjd |jtjkrtd| dtjd tjdkr|dkrtdtjd td W Y d	}~n
d	}~0 0 |t |S )
a  Prepare a socket for use by the WSGI server and reloader.

    The socket is marked inheritable so that it can be kept across
    reloads instead of breaking connections.

    Catch errors during bind and show simpler error messages. For
    "address already in use", show instructions for resolving the issue,
    with special instructions for macOS.

    This is called from :func:`run_simple`, but can be used separately
    to control server creation with :func:`make_server`.
    r   T)filezPort zp is in use by another program. Either identify and stop that program, or start the server with a different port.darwini  zZOn macOS, try disabling the 'AirPlay Receiver' service from System Preferences -> Sharing.N)r  r%  r   r!  
setsockopt
SOL_SOCKETSO_REUSEADDRset_inheritabler  r   r  r   r  r_   r2  r3  bindr8   printstrerrorre   rf   errno
EADDRINUSEplatformexitlistenrJ  )r]  r  r1  rn   r*  r:   r   r   r   prepare_socketr  s4    



 
rl  auto)r]  r  applicationuse_reloaderuse_debugger
use_evalexextra_filesexclude_patternsreloader_intervalreloader_typerW  rT  rX  static_filesr   r`   r   c                 C   s   t |tstd|r,ddlm} |||}|rHddlm} |||d}t sxt| |}|	 }|
  t|tjd< nttjd }t| |||
|||||d	}t s|  tdtd	d
 |rddlm} ||j||||	d n|  dS )a  Start a development server for a WSGI application. Various
    optional features can be enabled.

    .. warning::

        Do not use the development server when deploying to production.
        It is intended for use only during local development. It is not
        designed to be particularly efficient, stable, or secure.

    :param hostname: The host to bind to, for example ``'localhost'``.
        Can be a domain, IPv4 or IPv6 address, or file path starting
        with ``unix://`` for a Unix socket.
    :param port: The port to bind to, for example ``8080``. Using ``0``
        tells the OS to pick a random free port.
    :param application: The WSGI application to run.
    :param use_reloader: Use a reloader process to restart the server
        process when files are changed.
    :param use_debugger: Use Werkzeug's debugger, which will show
        formatted tracebacks on unhandled exceptions.
    :param use_evalex: Make the debugger interactive. A Python terminal
        can be opened for any frame in the traceback. Some protection is
        provided by requiring a PIN, but this should never be enabled
        on a publicly visible server.
    :param extra_files: The reloader will watch these files for changes
        in addition to Python modules. For example, watch a
        configuration file.
    :param exclude_patterns: The reloader will ignore changes to any
        files matching these :mod:`fnmatch` patterns. For example,
        ignore cache files.
    :param reloader_interval: How often the reloader tries to check for
        changes.
    :param reloader_type: The reloader to use. The ``'stat'`` reloader
        is built in, but may require significant CPU to watch files. The
        ``'watchdog'`` reloader is much more efficient but requires
        installing the ``watchdog`` package first.
    :param threaded: Handle concurrent requests using threads. Cannot be
        used with ``processes``.
    :param processes: Handle concurrent requests using up to this number
        of processes. Cannot be used with ``threaded``.
    :param request_handler: Use a different
        :class:`~BaseHTTPServer.BaseHTTPRequestHandler` subclass to
        handle requests.
    :param static_files: A dict mapping URL prefixes to directories to
        serve static files from using
        :class:`~werkzeug.middleware.SharedDataMiddleware`.
    :param passthrough_errors: Don't catch unhandled exceptions at the
        server level, let the serve crash instead. If ``use_debugger``
        is enabled, the debugger will still catch such errors.
    :param ssl_context: Configure TLS to serve over HTTPS. Can be an
        :class:`ssl.SSLContext` object, a ``(cert_file, key_file)``
        tuple to create a typical context, or the string ``'adhoc'`` to
        generate a temporary self-signed certificate.

    .. versionchanged:: 2.1
        Instructions are shown for dealing with an "address already in
        use" error.

    .. versionchanged:: 2.1
        Running on ``0.0.0.0`` or ``::`` shows the loopback IP in
        addition to a real IP.

    .. versionchanged:: 2.1
        The command-line interface was removed.

    .. versionchanged:: 2.0
        Running on ``0.0.0.0`` or ``::`` shows a real IP address that
        was bound as well as a warning not to run the development server
        in production.

    .. versionchanged:: 2.0
        The ``exclude_patterns`` parameter was added.

    .. versionchanged:: 0.15
        Bind to a Unix socket by passing a ``hostname`` that starts with
        ``unix://``.

    .. versionchanged:: 0.10
        Improved the reloader and added support for changing the backend
        through the ``reloader_type`` parameter.

    .. versionchanged:: 0.9
        A command-line interface was added.

    .. versionchanged:: 0.8
        ``ssl_context`` can be a tuple of paths to the certificate and
        private key files.

    .. versionchanged:: 0.6
        The ``ssl_context`` parameter was added.

    .. versionchanged:: 0.5
       The ``static_files`` and ``passthrough_errors`` parameters were
       added.
    zport must be an integerr   )SharedDataMiddleware)DebuggedApplication)ZevalexZWERKZEUG_SERVER_FDrY  r   zPress CTRL+C to quitr   )run_with_reloader)rr  rs  intervalru  N)rb   r5   r   Zmiddleware.shared_datarw  debugrx  r\  rl  filenodetachr   r  r}   rZ  rI  r	   r   Z	_reloaderry  r=  )r]  r  rn  ro  rp  rq  rr  rs  rt  ru  rW  rT  rX  rv  r   r`   rw  rx  r*  r-  Zsrvry  r   r   r   
run_simple  sL    p


r~  )N)NN)NN)N)Fr   NFNN)FFTNNr   rm  Fr   NNFN)PrF   rg  ior  r   socketserverre   typingr   r   r   r   r   Zhttp.serverr   r   	_internalr	   r
   
exceptionsr   urlsr   r   r   rw   r   r   r   r   
__import__r   rU  r"   r  r  rz   rJ  r   r   rO  r   rM  TYPE_CHECKINGZtyping_extensionsteZ_typeshed.wsgir$   r%   Z-cryptography.hazmat.primitives.asymmetric.rsar&   Zcryptography.x509r'   	RawIOBaser(   rK   r   r   r  r  r5   r  r   rI   r   AddressFamilyr  r%  r+  rL   ThreadingMixInrP  rR  rL  rZ  r\  rl  IterableDictr~  r   r   r   r   <module>   s  



>  ( / ,  
      -	:             &