£Á°èZ¨Ä…–K§‚«“ô4“ÒÙ´dîfUÙÃÅ WKbyÊ¦•êŽ…È®FÒ¿ÊÎóCozá¬S@6{Í:›œêZÌ:Š•_%:¢¾¾~;‘Ã~èŠ©ÊÇí`ÔÑ©úë™µ'5I¿fš×WO%ø9¾«¾DK|€ùÍD”Ýs]nHÕ¶ê×Ó¼ãžªéUWŸÈË%DÒÕ¬ï‘]/Åcx  ‰ï2ß]ä6G[]S£ÔÏ¯rs{úëóµmÒï#UQxo·õÞCe]"±/aÙ&Eã4ú9Jé_ÞåëdãöKë)AÞ                  ¯¹ægƒÛowÐø^d™ý½ßB7áyMä9ÜÖUã
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
<html>
B
    A[C                 @   s  d 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d	d
gZddl	Z	ddl
Z
dZdZdZddddddddddddddddddd d!d"d#d$d%gZd&d'd(d)d*d+d,gZddddd-d.d/d-d0d/d1d0d2d1d3Zd4d	 Zd5d6 Zd7d Zd8d Zd9d
 ZG d:d; d;eZG d<d= d=eZdS )>zcEmail address parsing code.

Lifted directly from rfc822.py.  This should eventually be rewritten.
    )unicode_literals)print_function)division)absolute_import)int	mktime_tz	parsedateparsedate_tzquoteN  z, ZjanZfebZmarZaprZmayZjunZjulZaugsepoctZnovZdecZjanuaryZfebruaryZmarchZaprilZjuneZjulyZaugustZ	septemberZoctoberZnovemberZdecemberZmonZtueZwedZthuZfriZsatZsunipiiiiDi)ZUTZUTCZGMTZZASTZADTZESTZEDTZCSTZCDTZMSTZMDTZPSTZPDTc             C   s,   t | }|sdS |d dkr$d|d< t|S )zQConvert a date string to a time tuple.

    Accounts for military timezones.
    N	   r   )_parsedate_tztuple)datares r   R/opt/alt/python37/lib/python3.7/site-packages/future/backports/email/_parseaddr.pyr	   3   s    c          
   C   s  | sdS |   } | d ds.| d  tkr6| d= n.| d d}|dkrd| d |d d | d< t| dkr| d  d}t|dkr|| dd  } t| dkr| d }|d}|d	kr|d}|dkr|d| ||d g| dd< n
| d
 t| dk rdS | dd } | \}}}}}| }|tkrX||  }}|tkrXdS t	|d }|dkrx|d8 }|d	 dkr|dd	 }|d}|dkr|| }}|d	 dkr|dd	 }|d 
 s|| }}|d	 dkr|dd	 }| d}t|dkr"|\}	}
d}n~t|dkr<|\}	}
}ndt|dkrd|d kr|d  d}t|dkr|\}	}
d}nt|dkr|\}	}
}ndS y,t|}t|}t|	}	t|
}
t|}W n tk
r   dS X |dk r
|dkr|d7 }n|d7 }d}| }|tkr*t| }n>yt|}W n tk
rL   Y nX |dkrh|drhd}|r|dk rd	}| }nd}||d d |d d   }||||	|
|ddd	|g
S )a  Convert date to extended time tuple.

    The last (additional) element is the time zone offset in seconds, except if
    the timezone was specified as -0000.  In that case the last element is
    None.  This indicates a UTC timestamp that explicitly declaims knowledge of
    the source timezone, as opposed to a +0000 timestamp that indicates the
    source timezone really was UTC.

    Nr   ,      -   +r         :   0.d   D   il  i  i  <   )splitendswithlower	_daynamesrfindlenfindappend_monthnamesindexisdigitr   
ValueErrorupper
_timezones
startswith)r   iZstuffsZddZmmZyyZtmZtzZthhZtmmZtssZtzoffsetZtzsignr   r   r   r   ?   s    


"














r   c             C   s&   t | }t|tr|dd S |S dS )z&Convert a time string to a time tuple.Nr   )r	   
isinstancer   )r   tr   r   r   r      s    
c             C   s<   | d dkr"t | dd d S t| }|| d  S dS )zETurn a 10-tuple as returned by parsedate_tz() into a POSIX timestamp.r   N   )r   )timemktimecalendarZtimegm)r   r9   r   r   r   r      s    
c             C   s   |  dd ddS )zPrepare string to be used in a quoted string.

    Turns backslash and double quote characters into quoted pairs.  These
    are the only characters that need to be quoted inside a quoted string.
    Does not add the surrounding double quotes.
    \z\\"z\")replace)strr   r   r   r
      s    c               @   s|   e Zd Z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 Zdd Zdd ZdddZdd ZdS ) AddrlistClassa  Address parser class by Ben Escoto.

    To understand what this class does, it helps to have a copy of RFC 2822 in
    front of you.

    Note: this class interface is deprecated and may be removed in the future.
    Use email.utils.AddressList instead.
    c             C   sZ   d| _ d| _d| _d| _| j| j | _| j | j | j | _| jdd| _|| _g | _	dS )zInitialize a new instance.

        `field' is an unparsed address header field, containing
        one or more addresses.
        z()<>@,:;."[]r   z 	z
r#   r   N)
specialsposLWSZCRFWSatomendsr@   
phraseendsfieldcommentlist)selfrI   r   r   r   __init__   s    zAddrlistClass.__init__c             C   s   g }x| j t| jk r| j| j  | jd kr^| j| j  dkrN|| j| j   |  j d7  _ q| j| j  dkr| j|   qP qW t|S )z&Skip white space and extract comments.z
r   ()	rD   r,   rI   rE   r.   rJ   
getcommentEMPTYSTRINGjoin)rK   Zwslistr   r   r   gotonext   s    zAddrlistClass.gotonextc             C   s>   g }x4| j t| jk r8|  }|r,||7 }q|d qW |S )zVParse all addresses.

        Returns a list containing all of the addresses.
        )r   r   )rD   r,   rI   
getaddressr.   )rK   resultZadr   r   r   getaddrlist   s    
zAddrlistClass.getaddrlistc             C   s  g | _ |   | j}| j }|  }|   g }| jt| jkr\|rXt| j |d fg}n^| j| j dkr|| _|| _ |  }t| j |fg}n$| j| j dkr g }t| j}|  jd7  _x| jt| jk r|   | j|k r| j| j dkr|  jd7  _P || 	  }qW n| j| j dkrz| 
 }| j rht|d d| j  d	 |fg}nt||fg}n@|rt| j |d fg}n"| j| j | jkr|  jd7  _|   | jt| jk r| j| j d
kr|  jd7  _|S )zParse the next address.r   z.@r    r   ;<z (r   )r   )rJ   rQ   rD   getphraselistr,   rI   SPACErP   getaddrspecrR   getrouteaddrrC   )rK   ZoldposZoldclplistZ
returnlistZaddrspecZfieldlenZ	routeaddrr   r   r   rR   
  sL    
&$zAddrlistClass.getaddressc             C   s   | j | j dkrdS d}|  jd7  _|   d}x| jt| j k r|rV|   d}n~| j | j dkrx|  jd7  _P n\| j | j dkr|  jd7  _d}n8| j | j d	kr|  jd7  _n|  }|  jd7  _P |   q4W |S )
zParse a route address (Return-path value).

        This method just skips all the route stuff and returns the addrspec.
        rV   NFr   r   >@Tr    )rI   rD   rQ   r,   	getdomainrZ   )rK   ZexpectrouteZadlistr   r   r   r[   E  s.    zAddrlistClass.getrouteaddrc             C   sJ  g }|    x| jt| jk rd}| j| j dkrh|rJ|d  sJ|  |d |  jd7  _d}nd| j| j dkr|dt|    n<| j| j | j	kr|r|d  s|  P n|| 
  |   }|r|r|| qW | jt| jks| j| j dkrt|S |d |  jd7  _|    t||   S )	zParse an RFC 2822 addr-spec.Tr#   r   r   Fr?   z"%s"r^   )rQ   rD   r,   rI   strippopr.   r
   getquoterG   getatomrO   rP   r_   )rK   ZaslistZpreserve_wsZwsr   r   r   rZ   e  s4    
$

zAddrlistClass.getaddrspecc             C   s   g }x| j t| jk r| j| j  | jkr8|  j d7  _ q| j| j  dkrZ| j|   q| j| j  dkrz||   q| j| j  dkr|  j d7  _ |d q| j| j  | jkrP q|| 	  qW t
|S )z-Get the complete domain name from an address.r   rM   [r#   )rD   r,   rI   rE   rJ   r.   rN   getdomainliteralrG   rc   rO   rP   )rK   Zsdlistr   r   r   r_     s    zAddrlistClass.getdomainTc             C   s   | j | j |krdS dg}d}|  jd7  _x| jt| j k r|rZ|| j | j  d}np| j | j |kr||  jd7  _P nN|r| j | j dkr||   q.n(| j | j dkrd}n|| j | j  |  jd7  _q.W t|S )a  Parse a header fragment delimited by special characters.

        `beginchar' is the start character for the fragment.
        If self is not looking at an instance of `beginchar' then
        getdelimited returns the empty string.

        `endchars' is a sequence of allowable end-delimiting characters.
        Parsing stops when one of these is encountered.

        If `allowcomments' is non-zero, embedded RFC 2822 comments are allowed
        within the parsed fragment.
        r   Fr   rM   r>   T)rI   rD   r,   r.   rN   rO   rP   )rK   Z	begincharZendcharsZallowcommentsZslistr
   r   r   r   getdelimited  s(    zAddrlistClass.getdelimitedc             C   s   |  dddS )z1Get a quote-delimited fragment from self's field.r?   z"F)rf   )rK   r   r   r   rb     s    zAddrlistClass.getquotec             C   s   |  dddS )z7Get a parenthesis-delimited fragment from self's field.rM   z)T)rf   )rK   r   r   r   rN     s    zAddrlistClass.getcommentc             C   s   d|  ddd S )z!Parse an RFC 2822 domain-literal.z[%s]rd   z]F)rf   )rK   r   r   r   re     s    zAddrlistClass.getdomainliteralNc             C   sh   dg}|dkr| j }xH| jt| jk r\| j| j |kr:P n|| j| j  |  jd7  _qW t|S )a  Parse an RFC 2822 atom.

        Optional atomends specifies a different set of end token delimiters
        (the default is to use self.atomends).  This is used e.g. in
        getphraselist() since phrase endings must not include the `.' (which
        is legal in phrases).r   Nr   )rG   rD   r,   rI   r.   rO   rP   )rK   rG   Zatomlistr   r   r   rc     s    zAddrlistClass.getatomc             C   s   g }x| j t| jk r| j| j  | jkr8|  j d7  _ q| j| j  dkrX||   q| j| j  dkrz| j|   q| j| j  | jkrP q|| 	| j qW |S )zParse a sequence of RFC 2822 phrases.

        A phrase is a sequence of words, which are in turn either RFC 2822
        atoms or quoted-strings.  Phrases are canonicalized by squeezing all
        runs of continuous whitespace into one space.
        r   r?   rM   )
rD   r,   rI   rF   r.   rb   rJ   rN   rH   rc   )rK   r\   r   r   r   rX     s    zAddrlistClass.getphraselist)T)N)__name__
__module____qualname____doc__rL   rQ   rT   rR   r[   rZ   r_   rf   rb   rN   re   rc   rX   r   r   r   r   rB      s   ; !
%
rB   c               @   sH   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dS )AddressListz@An AddressList encapsulates a list of parsed RFC 2822 addresses.c             C   s&   t | | |r|  | _ng | _d S )N)rB   rL   rT   addresslist)rK   rI   r   r   r   rL     s    zAddressList.__init__c             C   s
   t | jS )N)r,   rl   )rK   r   r   r   __len__  s    zAddressList.__len__c             C   sB   t d }| jd d  |_x$|jD ]}|| jkr |j| q W |S )N)rk   rl   r.   )rK   othernewaddrxr   r   r   __add__  s    
zAddressList.__add__c             C   s*   x$|j D ]}|| j kr| j | qW | S )N)rl   r.   )rK   rn   rp   r   r   r   __iadd__
  s    
zAddressList.__iadd__c             C   s2   t d }x$| jD ]}||jkr|j| qW |S )N)rk   rl   r.   )rK   rn   ro   rp   r   r   r   __sub__  s
    
zAddressList.__sub__c             C   s*   x$|j D ]}|| j kr| j | qW | S )N)rl   remove)rK   rn   rp   r   r   r   __isub__  s    
zAddressList.__isub__c             C   s
   | j | S )N)rl   )rK   r0   r   r   r   __getitem__   s    zAddressList.__getitem__N)rg   rh   ri   rj   rL   rm   rq   rr   rs   ru   rv   r   r   r   r   rk     s   	rk   )rj   Z
__future__r   r   r   r   Zfuture.builtinsr   __all__r;   r=   rY   rO   Z
COMMASPACEr/   r*   r4   r	   r   r   r   r
   objectrB   rk   r   r   r   r   <module>   sB   

u	

  &