o
    0c`                     @   s   d dl Z d dlZd dlZddlmZ ejrd 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 dZejejejeef   e	d< dZ
ejejejeef   e	d< dZedZdd	d
Zdedejeje eje eje eje f fddZdS )_UserAgentParser))z cros chromeos)z
iphone|iosiphone)ipadr   )zdarwin\b|mac\b|os\s*xmacos)winwindows)androidr   )netbsdr   )openbsdr   )freebsdr   )	dragonflydragonflybsd)z(sun|i86)ossolaris)zx11\b|lin(\b|ux)?linux)znintendo\s+wiiwii)irixr   )zhp-?uxhpux)aixr   )zsco|unix_svsco)bsdr   )amigar   )zblackberry|playbook
blackberry)symbianr   platform_rules))	googlebotgoogle)msnbotmsn)yahoor"   )z
ask jeevesask)zaol|america\s+online\s+browseraol)z	opera|opropera)zedge|edgedge)zchrome|crioschrome)	seamonkeyr(   )z"firefox|firebird|phoenix|iceweaselfirefox)galeonr*   )zsafari|versionsafari)webkitr,   )caminor-   )	konquerorr.   )zk-meleonkmeleon)netscaper0   )z4msie|microsoft\s+internet\s+explorer|trident/.+? rv:msie)lynxr2   )linksr3   )Baiduspiderbaidu)bingbotbing)mozillar8   browser_rulesz&(?:{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*(?:\]|\)|;)returnNc                    s,   dd  j D  _ fdd jD  _d S )Nc                 S   s"   g | ]\}}|t |t jfqS  )recompileI.0abr;   r;   I/var/www/html/gps/gps/lib/python3.10/site-packages/werkzeug/useragents.py
<listcomp>D   s   " z-_UserAgentParser.__init__.<locals>.<listcomp>c                    s,   g | ]\}}|t  jj|d t jfqS ))pattern)r<   r=   _browser_version_reformatr>   r?   selfr;   rC   rD   E   s    )r   	platformsr9   browsersrH   r;   rH   rC   __init__C   s   
z_UserAgentParser.__init__
user_agentc           	      C   s   | j D ]\}}||}|d ur nqd }d}tdtj|s0d|v r0|d dkr0|d}| jD ]\}}|||d  }|d urK|d} nq3d  }}| j|}|d ure|dpc|d}nd }||||fS )Nr   ztrident/.+? rv:)r      )	rJ   searchr<   r=   r>   rindexrK   group_language_re)	rI   rM   platformregexmatchlast_closing_parenbrowserversionlanguager;   r;   rC   __call__J   s4   



z_UserAgentParser.__call__r:   N)__name__
__module____qualname__r   tClassVarIterableTuplestr__annotations__r9   rF   r<   r=   rT   rL   Optionalr\   r;   r;   r;   rC   r      s   
 ""
(r   c                       s"   e Zd ZdZd fddZ  ZS )UserAgentParserzA simple user agent parser.  Used by the `UserAgent`.

    .. deprecated:: 2.0
        Will be removed in Werkzeug 2.1. Use a dedicated parser library
        instead.
    r:   Nc                    s   t jdtdd t   d S )Nzl'UserAgentParser' is deprecated and will be removed in Werkzeug 2.1. Use a dedicated parser library instead.rP   
stacklevel)warningswarnDeprecationWarningsuperrL   rH   	__class__r;   rC   rL   {   s   zUserAgentParser.__init__r]   r^   r_   r`   __doc__rL   __classcell__r;   r;   ro   rC   rh   s   s    rh   c                       sT   e Zd Zdejdgejf ddf fddZdejdejdejf fd	d
Z  ZS )_deprecated_propertyfget
_UserAgentr:   Nc                    s    t  | 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.)rn   rL   r^   message)rI   ru   ro   r;   rC   rL      s
   z_deprecated_property.__init__argskwargsc                    s$   t j| jtdd t j|i |S )N   ri   )rk   rl   rw   rm   rn   __get__)rI   rx   ry   ro   r;   rC   r{      s   z_deprecated_property.__get__)	r^   r_   r`   ra   CallableAnyrL   r{   rs   r;   r;   ro   rC   rt      s    $(
rt   c                       s   e Zd Ze Zdeddf fddZedej	e fddZ
edej	e fdd	Zedej	e fd
dZedej	e fddZ  ZS )rv   stringr:   Nc                    s.   t  | | |}|\| _| _| _| _d S N)rn   rL   _parser	_platform_browser_version	_language)rI   r~   inforo   r;   rC   rL      s   
z_UserAgent.__init__c                 C      | j S r   )r   rH   r;   r;   rC   rU         z_UserAgent.platformc                 C   r   r   )r   rH   r;   r;   rC   rY      r   z_UserAgent.browserc                 C   r   r   )r   rH   r;   r;   rC   rZ      r   z_UserAgent.versionc                 C   r   r   )r   rH   r;   r;   rC   r[      r   z_UserAgent.language)r^   r_   r`   r   r   re   rL   rt   ra   rg   rU   rY   rZ   r[   rs   r;   r;   ro   rC   rv      s    rv   c                       s"   e Zd ZdZ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.
    environ_or_stringt.Union[str, WSGIEnvironment]r:   Nc                    sL   t |trtjdtdd |dd}n|}tjdtdd t | d S )NzzPassing an environ to 'UserAgent' is deprecated and will be removed in Werkzeug 2.1. Pass the header value string instead.rP   ri   HTTP_USER_AGENT zThe 'werkzeug.useragents' module is deprecated and will be removed in Werkzeug 2.1. The new base API is 'werkzeug.user_agent.UserAgent'.)
isinstancedictrk   rl   rm   getrn   rL   )rI   r   r~   ro   r;   rC   rL      s   
zUserAgent.__init__)r   r   r:   Nrq   r;   r;   ro   rC   r      s    r   )r<   typingra   rk   rM   r   _BaseUserAgentTYPE_CHECKING_typeshed.wsgir   r   rh   propertyrt   rv   r;   r;   r;   rC   <module>   s    h