3
¥Yði`  ã               @   sˆ   d dl Z d dlZd dlZddlmZ ejr6d dlm	Z	 G dd„ dƒZ
G dd„ de
ƒZG d	d
„ d
eƒZG dd„ deƒZG dd„ deƒZdS )é    Né   )Ú	UserAgent)ÚWSGIEnvironmentc               @   sœ   e Zd ZU dcZejejejeef   d{Z	ejejejeef   	dEZ
ejdFƒZdGdHœdIdJ„Zeejeje eje eje eje f dKœdLdM„ZdGS )|Ú_UserAgentParserú cros Úchromeosú
iphone|iosÚiphoneÚipadúdarwin\b|mac\b|os\s*xÚmacosÚwinÚwindowsÚandroidÚnetbsdÚopenbsdÚfreebsdÚ	dragonflyÚdragonflybsdú(sun|i86)osÚsolarisúx11\b|lin(\b|ux)?Úlinuxúnintendo\s+wiiÚwiiÚirixúhp-?uxÚhpuxÚaixúsco|unix_svÚscoÚbsdÚamigaúblackberry|playbookÚ
blackberryÚsymbianÚ	googlebotÚgoogleÚmsnbotÚmsnÚyahooú
ask jeevesÚaskúaol|america\s+online\s+browserÚaolú	opera|oprÚoperaúedge|edgÚedgeúchrome|criosÚchromeÚ	seamonkeyú"firefox|firebird|phoenix|iceweaselÚfirefoxÚgaleonúsafari|versionÚsafariÚwebkitÚcaminoÚ	konquerorúk-meleonÚkmeleonÚnetscapeú4msie|microsoft\s+internet\s+explorer|trident/.+? rv:ÚmsieÚlynxÚlinksÚBaiduspiderÚbaiduÚbingbotÚbingÚmozillaz&(?:{pattern})[/\sa-z(]*(\d+[.\da-z]+)?za(?:;\s*|\s+)(\b\w{2}\b(?:-\b\w{2}\b)?)\s*;|(?:\(|\[|;)\s*(\b\w{2}\b(?:-\b\w{2}\b)?)\s*(?:\]|\)|;)N)Úreturnc                s,   dd„ ˆ j D ƒˆ _‡ fdd„ˆ jD ƒˆ _d S )Nc             S   s"   g | ]\}}|t j|t jƒf‘qS © )ÚreÚcompileÚI)Ú.0ÚaÚbrK   rK   ú7/tmp/pip-build-8om4l6ph/Werkzeug/werkzeug/useragents.pyú
<listcomp>D   s    z-_UserAgentParser.__init__.<locals>.<listcomp>c                s,   g | ]$\}}|t jˆ jj|d �t jƒf‘qS ))Úpattern)rL   rM   Ú_browser_version_reÚformatrN   )rO   rP   rQ   )ÚselfrK   rR   rS   F   s   )Úplatform_rulesÚ	platformsÚbrowser_rulesÚbrowsers)rW   rK   )rW   rR   Ú__init__C   s    
z_UserAgentParser.__init__)Ú
user_agentrJ   c       	      C   sà   x*| j D ]\}}|j|ƒ}|d k	rP qW d }d}tjdtjƒj|ƒ rdd|krd|d dkrd|jdƒ}x@| jD ].\}}|j||d … ƒ}|d k	rl|jdƒ}P qlW d  }}| jj|ƒ}|d k	rÐ|jdƒpÌ|jdƒ}nd }||||fS )Nr   ztrident/.+? rv:ú)r   é   éÿÿÿÿ)	rY   ÚsearchrL   rM   rN   Úrindexr[   ÚgroupÚ_language_re)	rW   r]   ÚplatformÚregexÚmatchZlast_closing_parenÚbrowserÚversionÚlanguagerK   rK   rR   Ú__call__J   s*    


z_UserAgentParser.__call__©r   r   ©r   r	   ©r
   r
   ©r   r   ©r   r   ©r   r   ©r   r   ©r   r   ©r   r   ©r   r   ©r   r   ©r   r   ©r   r   ©r   r   ©r   r   ©r   r   ©r   r    ©r!   r!   ©r"   r"   ©r#   r$   ©r%   r%   )rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   r~   r   r€   ©r&   r'   ©r(   r)   ©r*   r*   ©r+   r,   ©r-   r.   ©r/   r0   ©r1   r2   ©r3   r4   ©r5   r5   ©r6   r7   ©r8   r8   ©r9   r:   ©r;   r;   ©r<   r<   ©r=   r=   ©r>   r?   ©r@   r@   ©rA   rB   ©rC   rC   ©rD   rD   ©rE   rF   ©rG   rH   ©rI   rI   )r�   r‚   rƒ   r„   r…   r†   r‡   rˆ   r‰   rŠ   r‹   rŒ   r�   rŽ   r�   r�   r‘   r’   r“   r”   r•   r–   r—   )Ú__name__Ú
__module__Ú__qualname__rX   ÚtZClassVarÚIterableÚTupleÚstrrZ   rU   rL   rM   rd   r\   ÚOptionalrk   rK   rK   rK   rR   r      sd   
                                          r   c                   s&   e Zd ZdZddœ‡ fdd„Z‡  ZS )ÚUserAgentParserz¬A simple user agent parser.  Used by the `UserAgent`.

    .. deprecated:: 2.0
        Will be removed in Werkzeug 2.1. Use a dedicated parser library
        instead.
    N)rJ   c                s   t jdtdd� tƒ jƒ  d S )Nzl'UserAgentParser' is deprecated and will be removed in Werkzeug 2.1. Use a dedicated parser library instead.r_   )Ú
stacklevel)ÚwarningsÚwarnÚDeprecationWarningÚsuperr\   )rW   )Ú	__class__rK   rR   r\   {   s
    zUserAgentParser.__init__)r˜   r™   rš   Ú__doc__r\   Ú__classcell__rK   rK   )r¦   rR   r    s   s   r    c                   sN   e Zd Zejdgejf ddœ‡ fdd„Zejejejdœ‡ fdd„Z‡  ZS )	Ú_deprecated_propertyÚ
_UserAgentN)ÚfgetrJ   c                s    t ƒ j|ƒ d|j›d�| _d S )NzVThe built-in user agent parser is deprecated and will be removed in Werkzeug 2.1. The z€ property will be 'None'. Subclass 'werkzeug.user_agent.UserAgent' and set 'Request.user_agent_class' to use a different parser.)r¥   r\   r˜   Úmessage)rW   r«   )r¦   rK   rR   r\   †   s    z_deprecated_property.__init__)ÚargsÚkwargsrJ   c                s    t j| jtdd� tƒ j||ŽS )Né   )r¡   )r¢   r£   r¬   r¤   r¥   Ú__get__)rW   r­   r®   )r¦   rK   rR   r°   �   s    z_deprecated_property.__get__)	r˜   r™   rš   r›   ÚCallableZAnyr\   r°   r¨   rK   rK   )r¦   rR   r©   …   s   "
r©   c                   sŠ   e Zd Zeƒ Zeddœ‡ fdd„Zeej	e dœdd„ƒZ
eej	e dœdd	„ƒZeej	e dœd
d„ƒZeej	e dœdd„ƒZ‡  ZS )rª   N)ÚstringrJ   c                s.   t ƒ j|ƒ | j|ƒ}|\| _| _| _| _d S )N)r¥   r\   Ú_parserÚ	_platformÚ_browserÚ_versionÚ	_language)rW   r²   Úinfo)r¦   rK   rR   r\   š   s    
z_UserAgent.__init__)rJ   c             C   s   | j S )N)r´   )rW   rK   rK   rR   re   Ÿ   s    z_UserAgent.platformc             C   s   | j S )N)rµ   )rW   rK   rK   rR   rh   £   s    z_UserAgent.browserc             C   s   | j S )N)r¶   )rW   rK   rK   rR   ri   §   s    z_UserAgent.versionc             C   s   | j S )N)r·   )rW   rK   rK   rR   rj   «   s    z_UserAgent.language)r˜   r™   rš   r   r³   rž   r\   r©   r›   rŸ   re   rh   ri   rj   r¨   rK   rK   )r¦   rR   rª   —   s   rª   c                   s(   e Zd ZdZdddœ‡ fdd„Z‡  ZS )r   a  Represents a parsed user agent header value.

    This uses a basic parser to try to extract some information from the
    header.

    :param environ_or_string: The header value to parse, or a WSGI
        environ containing the header.

    .. deprecated:: 2.0
        Will be removed in Werkzeug 2.1. Subclass
        :class:`werkzeug.user_agent.UserAgent` (note the new module
        name) to use a dedicated parser instead.

    .. versionchanged:: 2.0
        Passing a WSGI environ is deprecated and will be removed in 2.1.
    zt.Union[str, WSGIEnvironment]N)Úenviron_or_stringrJ   c                sL   t |tƒr(tjdtdd� |jddƒ}n|}tjdtdd� tƒ j|ƒ d S )NzzPassing an environ to 'UserAgent' is deprecated and will be removed in Werkzeug 2.1. Pass the header value string instead.r_   )r¡   ZHTTP_USER_AGENTÚ zˆThe 'werkzeug.useragents' module is deprecated and will be removed in Werkzeug 2.1. The new base API is 'werkzeug.user_agent.UserAgent'.)Ú
isinstanceÚdictr¢   r£   r¤   Úgetr¥   r\   )rW   r¹   r²   )r¦   rK   rR   r\   Ã   s    
zUserAgent.__init__)r˜   r™   rš   r§   r\   r¨   rK   rK   )r¦   rR   r   ±   s   r   )rL   Útypingr›   r¢   r]   r   Z_BaseUserAgentZTYPE_CHECKINGZ_typeshed.wsgir   r   r    Úpropertyr©   rª   rK   rK   rK   rR   Ú<module>   s   h