U
    (Q^8                     @   s  d 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ae
 Zeddd ZdddddddhZejej d dZdddddZeededdD ]Zde d eee< qed!Zed"Zd#Zejd$ej d%Z!G d&d' d'e"Z#e# Z$d(d) Z%d*d+ Z&d,d- Z'd.d/ Z(d0d1 Z)G d2d3 d3e"Z*d4d5 Z+d6d7 Z,d8d9 Z-d:d; Z.d<d= Z/d>d? Z0dBd@dAZ1dS )Cz
    werkzeug._internal
    ~~~~~~~~~~~~~~~~~~

    This module provides internally used helpers and constants.

    :copyright: 2007 Pallets
    :license: BSD-3-Clause
    N)date)datetime)chain)WeakKeyDictionary   )int_to_byte)integer_types)
iter_bytes)
range_type)	text_typei  s   expiress   paths   comments   max-ages   secures   httponlys   versionz/=!#$%&'*+-.^_`|~:asciis   \054s   \073s   \"s   \\)   ,   ;   "   \          z\%03olatin1s   \\[0-3][0-7][0-7]s   [\\].s/   [\w\d!#%&\'~_`><@,:/\$\*\+\-\.\^\|\)\(\?\}\{\=]s   
    (?P<key>[^=;]+)
    (?:\s*=\s*
        (?P<val>
            "(?:[^\\"]|\\.)*" |
             (?:.*?)
        )
    )?
    \s*;
)flagsc                   @   s   e Zd Zdd Zdd ZdS )_Missingc                 C   s   dS )Nzno value selfr   r   8/tmp/pip-install-bd4o36v9/Werkzeug/werkzeug/_internal.py__repr__B   s    z_Missing.__repr__c                 C   s   dS )N_missingr   r   r   r   r   
__reduce__E   s    z_Missing.__reduce__N)__name__
__module____qualname__r   r   r   r   r   r   r   A   s   r   c                 C   s,   t | d| }t|ts(tdt| j |S )Nenvironz/%r is not a WSGI environment (has to be a dict))getattr
isinstancedictAssertionErrortyper   )objenvr   r   r   _get_environL   s
    r)   c                    s@   |    | }|r<t fdd|jD r,dS |js4q<|j}qdS )znCheck if there is a handler in the logging chain that will handle
    the given logger's effective level.
    c                 3   s   | ]}|j  kV  qd S Nlevel).0handlerr+   r   r   	<genexpr>\   s     z%_has_level_handler.<locals>.<genexpr>TF)getEffectiveLevelanyhandlers	propagateparent)loggercurrentr   r+   r   _has_level_handlerT   s    r7   c                 O   s^   t dkr@tda t jtjkr*t tj tt s@t t	  t
t | | f|| dS )a  Log a message to the 'werkzeug' logger.

    The logger is created the first time it is needed. If there is no
    level set, it is set to :data:`logging.INFO`. If there is no handler
    for the logger's effective level, a :class:`logging.StreamHandler`
    is added.
    NZwerkzeug)_loggerlogging	getLoggerr,   NOTSETsetLevelINFOr7   
addHandlerStreamHandlerr"   rstrip)r&   messageargskwargsr   r   r   _logg   s    

rD   c           	   	      s   t | dr| j} t| }|dk	r&|S t tdr<t| }n
t| }|dd \}}|p`d}t| g t|D ]^\}}t	|t
rtdz||   }W n tk
r   |ddf}Y nX |d|f}| qvt fd	d
}|t| < |S )z+Return a signature object for the function.im_funcNgetfullargspec   r   zCcannot parse functions that unpack tuples in the function signatureFTc           
         s   g }g }i }t D ]\}\}}}z|| |  W nX tk
r   z||| W n. tk
r   |rx|| n
|| Y nX Y qX ||kr||||< q|  d  }	d k	r||	 d}	|rd kr|| i }|||||	fS )Nr   )	enumerateappend
IndexErrorpopKeyErrorextendupdate)
rB   rC   Znew_argsmissingextraidxnameZhas_defaultdefaultZextra_positional	arg_count	argumentsZ	kwarg_varZ
vararg_varr   r   parse   s>    

z_parse_signature.<locals>.parse)hasattrrE   _signature_cachegetinspectrF   
getargspeclenrH   r#   list	TypeErrorrJ   rI   tuple)	funcrW   tup
positionaldefaultsrQ   rR   rS   paramr   rT   r   _parse_signature}   s6    





)rf   c                 C   s   t | tr|  } nt | ttf r,t| S | dd \}}}}}}t||d t | d }|d | }|d | }	|	d | }
|
S )z]Converts a timetuple, integer or datetime object into the seconds from
    epoch in utc.
    N   r      <   )	r#   r   utctimetupler   floatintr   	toordinal
_epoch_ord)argyearmonthdayhourminuteseconddayshoursminutessecondsr   r   r   _date_to_unix   s    

rz   c                   @   s@   e Zd ZdZdZdddZdddZdd	 Zd
d Zdd Z	dS )_DictAccessorPropertyz7Baseclass for `environ_property` and `header_property`.FNc                 C   s0   || _ || _|| _|| _|d k	r&|| _|| _d S r*   )rR   rS   	load_func	dump_func	read_only__doc__)r   rR   rS   r|   r}   r~   docr   r   r   __init__   s    	z_DictAccessorProperty.__init__c              	   C   sl   |d kr| S |  |}| j|kr&| jS || j }| jd k	rhz| |}W n ttfk
rf   | j}Y nX |S r*   )lookuprR   rS   r|   
ValueErrorr_   )r   r'   r&   Zstoragervr   r   r   __get__   s    



z_DictAccessorProperty.__get__c                 C   s6   | j rtd| jd k	r"| |}|| || j< d S Nzread only property)r~   AttributeErrorr}   r   rR   )r   r'   valuer   r   r   __set__   s
    

z_DictAccessorProperty.__set__c                 C   s&   | j rtd| || jd  d S r   )r~   r   r   rK   rR   )r   r'   r   r   r   
__delete__  s    z _DictAccessorProperty.__delete__c                 C   s   d| j j| jf S )Nz<%s %s>)	__class__r   rR   r   r   r   r   r     s    z_DictAccessorProperty.__repr__)NNNNN)N)
r   r   r    r   r~   r   r   r   r   r   r   r   r   r   r{      s        

r{   c                 C   s^   t  }d}tj}|j}t| D ]"}|tkr8d}|||}|| q|rNt|S td| d S )NTFr   )	bytearray_cookie_quoting_maprZ   rM   r	   _legal_cookie_charsbytes)bbufZ	all_legalZ_lookup_pushcharr   r   r   _cookie_quote  s    

r   c           	      C   sT  t | dk r| S | d d dks0| dd  dkr4| S | dd } d}t | }t }|j}d|  krn|k rLn nt| |}t| |}|s|s|| |d   qLd }}|r|d}|r|d}|r|r||k r|| ||  || |d |d   |d }qX|| ||  |t| |d |d  d |d }qXt	|S )N   r   r   r   rG      )
r]   r   rM   	_octal_research	_quote_restartrI   rl   r   )	r   inr   r   o_matchq_matchjkr   r   r   _cookie_unquote   s8     


 
r   c                 c   st   d}t | }||k rpt| d |}|s*qp|d }|dpDd}|d}| tkrt|t|fV  qdS )z8Lowlevel cookie parsing facility that operates on bytes.r   r   keyval    N)	r]   
_cookie_rer   groupstripendlower_cookie_paramsr   )r   r   r   matchr   r   r   r   r   _cookie_parse_implD  s    
r   c                 C   sn   t | ts| d | S z| dW S  tk
r8   Y nX | d}t|D ]\}}|d||< qLd|S )Nr   .idna   .)r#   r   decodeencodeUnicodeErrorsplitrH   joindomainpartsrQ   partr   r   r   _encode_idnaW  s    


r   c              	   C   s   t | tr2z| d} W n tk
r0   |  Y S X | d}t|D ]@\}}z|d||< W qD tk
r   |dd||< Y qDX qDd|S )Nr   r   r   ignorer   )r#   r   r   r   r   rH   r   r   r   r   r   r   _decode_idnaj  s    


r   c                 C   sD   | d krd S t | } d| kr,| ddd } d| kr8| S tdd S )N   :r   r   r   a'  Setting 'domain' for a cookie on a server running locally (ex: localhost) is not supported by complying browsers. You should have something like: '127.0.0.1 localhost dev.localhost' on your hosts file and then point your server to run on 'dev.localhost' and also set 'domain' for 'dev.localhost')r   r   r   )r   r   r   r   _make_cookie_domain  s    r   c                    s6   dd }d dd |d D  fdd}|S )	z0Like the name says.  But who knows how it works?c                 S   s&   dd l }dd l}||| dS )Nr   r   )base64zlib
decompress	b64decoder   )gyverr   r   r   r   r   bzzzzzzz  s    z_easteregg.<locals>.bzzzzzzz
c                 S   s    g | ]}|d t | d  qS )M    )r]   )r-   xr   r   r   
<listcomp>  s   z_easteregg.<locals>.<listcomp>s#	  
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
7f2zLkGNv8b191cD/3vs9Q833z8tc                    sJ   d	 fdd	}d k	r.|  ddkr.| |S |ddg d dgS )
Nc                    s   | d  | ||S )N)zX-Powered-ByZWerkzeug)rI   )statusheadersexc_infostart_responser   r   injecting_start_response  s    
zA_easteregg.<locals>.easteregged.<locals>.injecting_start_responseQUERY_STRINGZmacgybarchakkuz200 OK)zContent-Typez	text/htmla  
<!DOCTYPE html>
<html>
<head>
<title>About Werkzeug</title>
<style type="text/css">
  body { font: 15px Georgia, serif; text-align: center; }
  a { color: #333; text-decoration: none; }
  h1 { font-size: 30px; margin: 20px 0 10px 0; }
  p { margin: 0 0 30px 0; }
  pre { font: 11px 'Consolas', 'Monaco', monospace; line-height: 0.95; }
</style>
</head>
<body>
<h1><a href="http://werkzeug.pocoo.org/">Werkzeug</a></h1>
<p>the Swiss Army knife of Python web development.</p>
<pre>%s


</pre>
</body>
</html>r   )N)rZ   r   )r!   r   r   appr   r   r   easteregged  s    
z_easteregg.<locals>.easteregged)r   
splitlines)r   r   r   r   r   r   
_easteregg  s    (!r   )N)2r   r[   r9   restringr   r   	itertoolsr   weakrefr   _compatr   r   r	   r
   r   r8   rY   rm   rn   r   ascii_lettersdigitsr   r   r   Z_icompiler   r   Z_legal_cookie_chars_reVERBOSEr   objectr   r   r)   r7   rD   rf   rz   r{   r   r   r   r   r   r   r   r   r   r   r   <module>   sj   	



N4$