
    4pfC                         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 g dZddl	Z	ddl
Z
d	Zd
ZdZg dZg dZdddddddddddddddZd Zd Zd Zd Zd Z G d de          Z G 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, )janfebmaraprmayjunjulaugsepoctnovdecjanuaryfebruarymarchaprilr   junejulyaugust	septemberoctobernovemberdecember)montuewedthufrisatsunipiiiiDi)UTUTCGMTZASTADTESTEDTCSTCDTMSTMDTPSTPDTc                 `    t          |           }|sdS |d         d|d<   t          |          S )zQConvert a date string to a time tuple.

    Accounts for military timezones.
    N	   r   )_parsedate_tztuple)dataress     a/var/www/html/nettyfy-visnx/env/lib/python3.11/site-packages/future/backports/email/_parseaddr.pyr
   r
   3   s<    
 

C 
1v~A::    c           
      f   | sdS |                                  } | d                             d          s!| d                                         t          v r| d= n7| d                             d          }|dk    r| d         |dz   d         | d<   t          |           dk    r;| d                              d          }t          |          dk    r|| dd         z   } t          |           dk    rm| 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          vr!||                                }}|t          vrdS t          	                    |          dz   }|dk    r|dz  }|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}nt          |          dk    r|\  }	}
}not          |          dk    rZd|d         v rP|d                              d          }t          |          dk    r|\  }	}
d}nt          |          dk    r|\  }	}
}ndS 	 t          |          }t          |          }t          |	          }	t          |
          }
t          |          }n# t          $ r Y dS w xY w|dk     r|dk    r|dz  }n|dz  }d}|                                }|t          v rt          |         }n>	 t          |          }n# t          $ r Y nw xY w|dk    r|                    d          rd}|r"|dk     rd	}| }nd}||dz  dz  |dz  dz  z   z  }||||	|
|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>   istuffsddmmyytmtzthhtmmtsstzoffsettzsigns                 r@   r<   r<   ?   s     ::<<D Aw $Q9 < <GGGMM#661gacddmDG
4yyA~~Qc""u::??48#D
4yyA~~GFF3KK77sAq55"1"qu~DHHKKOOO
4yy1}}t8DRRR	B	RXXZZB[  4			2			"B	Bww
b	"v}}W
A1uuRB	"v}}Wa5==?? RB	"v}}W	#B
2ww!||
c	RAc33	RA#A,,U[[r77a<<JS#CCWW\\ OS#stWWWW#hh#hh#hh   tt 
Cxx77$JBB $JBH	B	Zb>	2wwHH 	 	 	D	Q;;2==--;H Ja<<F yHHFx}d2hnb5HHIBS#q!R::s%   $AM0 0
M>=M>O 
O#"O#c                 b    t          |           }t          |t                    r
|dd         S |S )z&Convert a time string to a time tuple.Nr;   )r
   
isinstancer=   r>   ts     r@   r	   r	      s3    TA!U !urA   c                     | d         t          j        | dd         dz             S t          j        |           }|| d         z
  S )zETurn a 10-tuple as returned by parsedate_tz() into a POSIX timestamp.r;   N   )rI   )timemktimecalendartimegmrq   s     r@   r   r      sE    Aw{48e+,,,OD!!47{rA   c                 V    |                      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)strs    r@   r   r      s(     ;;tV$$,,S%888rA   c                   d    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
dd
Zd Zd Zd ZddZ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                     d| _         d| _        d| _        d| _        | j        | j        z   | _        | j         | j        z   | j        z   | _        | 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
rO   r   N)
specialsposLWSCRFWSatomendsr|   
phraseendsfieldcommentlistselfr   s     r@   __init__zAddrlistClass.__init__   sw     (8dg%047: -//R88
rA   c                    g }| j         t          | j                  k     r| j        | j                  | j        dz   v rJ| j        | j                  dvr%|                    | j        | j                             | xj         dz  c_         nD| j        | j                  dk    r-| j                            |                                            nn| j         t          | j                  k     t                              |          S )z&Skip white space and extract comments.z
rD   ()	r   rX   r   r   rZ   r   
getcommentEMPTYSTRINGjoin)r   wslists     r@   gotonextzAddrlistClass.gotonext   s    hTZ((z$(#tx&'888:dh'v55MM$*TX"6777ADH%,, ''(9(9:::: hTZ(( '''rA   c                     g }| j         t          | j                  k     rN|                                 }|r||z  }n|                    d           | j         t          | j                  k     N|S )zVParse all addresses.

        Returns a list containing all of the addresses.
        )r   r   )r   rX   r   
getaddressrZ   )r   resultads      r@   getaddrlistzAddrlistClass.getaddrlist   sp    
 hTZ((""B ("h''' hTZ(( rA   c                    g | _         |                                  | j        }| j         }|                                 }|                                  g }| j        t	          | j                  k    r,|r(t                              | j                   |d         fg}n| j        | j                 dv rF|| _        || _         |                                 }t                              | j                   |fg}n| j        | j                 dk    rg }t	          | j                  }| xj        dz  c_        | j        t	          | j                  k     rz|                                  | j        |k     r'| j        | j                 dk    r| xj        dz  c_        n4|| 	                                z   }| j        t	          | j                  k     zn| j        | j                 dk    rx| 
                                }| j         r?t                              |          dz   d                    | j                   z   d	z   |fg}nrt                              |          |fg}nT|r)t                              | j                   |d         fg}n)| j        | j                 | j        v r| xj        dz  c_        |                                  | j        t	          | j                  k     r&| j        | j                 d
k    r| xj        dz  c_        |S )zParse the next address.r   z.@rL   rD   ;<z (r   )rC   )r   r   r   getphraselistrX   r   SPACEr   getaddrspecr   getrouteaddrr   )r   oldposoldclplist
returnlistaddrspecfieldlen	routeaddrs           r@   r   zAddrlistClass.getaddress
  s    ""$$
8s4:&& H$zz$*:;;U1XFG
Z!T)) DH$D''))H ::d&677BCJJZ!S((J4:HHHMHH(S__,,8h&&4:dh+?3+F+FHHMHH'$//*;*;;
 (S__,, Z!S(())++I >$zz%0047"xx(899 :<? @AJL M

  %zz%00)<=

  $zz$*:;;U1XFG

DH%66A8c$*oo%%$*TX*>#*E*EHHMHHrA   c                    | j         | j                 dk    rdS d}| xj        dz  c_        |                                  d}| j        t          | j                   k     r|r|                                  d}n| j         | j                 dk    r| xj        dz  c_        n| j         | j                 dk    r| xj        dz  c_        d}nL| j         | j                 d	k    r| xj        dz  c_        n%|                                 }| xj        dz  c_        n1|                                  | j        t          | j                   k     |S )
zParse a route address (Return-path value).

        This method just skips all the route stuff and returns the addrspec.
        r   NFrD   r   >@TrL   )r   r   r   rX   	getdomainr   )r   expectrouteadlists      r@   r   zAddrlistClass.getrouteaddrE  s:   
 :dh3&&FAhTZ((    #DH%,,ADH%,,A"DH%,,A))++AMMOOO! hTZ(($ rA   c                    g }|                                   | j        t          | j                  k     rzd}| j        | j                 dk    rX|r.|d                                         s|                                 |                    d           | xj        dz  c_        d}n| j        | j                 dk    r8|                    dt          |                                           z             nq| j        | j                 | j	        v r1|r.|d                                         s|                                 nr|                    | 
                                           |                                  }|r|r|                    |           | j        t          | j                  k     z| j        t          | j                  k    s| j        | j                 dk    rt                              |          S |                    d           | xj        dz  c_        |                                   t                              |          |                                 z   S )	zParse an RFC 2822 addr-spec.TrO   rI   rD   Fr{   z"%s"r   )r   r   rX   r   strippoprZ   r   getquoter   getatomr   r   r   )r   aslistpreserve_wswss       r@   r   zAddrlistClass.getaddrspece  s   hTZ((Kz$(#s** !&*"2"2"4"4 !JJLLLc"""A#DH%,,fuT]]__'='==>>>>DH%66 !&*"2"2"4"4 !JJLLLdllnn---B "r "b!!!% hTZ((( 8s4:&&$*TX*>#*E*E##F+++cA''$..*:*:::rA   c                    g }| j         t          | j                  k     rF| j        | j                  | j        v r| xj         dz  c_         n| j        | j                  dk    r-| j                            |                                            n| j        | j                  dk    r(|                    |                                            n}| j        | j                  dk    r&| xj         dz  c_         |                    d           nA| j        | j                  | j        v rnE|                    | 	                                           | j         t          | j                  k     Ft                              |          S )z-Get the complete domain name from an address.rD   r   [rO   )r   rX   r   r   r   rZ   r   getdomainliteralr   r   r   r   )r   sdlists     r@   r   zAddrlistClass.getdomain  sH   hTZ((z$(#tx//ADH%,, ''(9(9::::DH%,,d33556666DH%,,Ac""""DH%66dllnn--- hTZ(( '''rA   Tc                    | j         | j                 |k    rdS dg}d}| xj        dz  c_        | j        t          | j                   k     r|r(|                    | j         | j                            d}n| j         | j                 |v r| xj        dz  c_        n|r>| j         | j                 dk    r(|                    |                                            | j         | j                 dk    rd}n%|                    | j         | j                            | xj        dz  c_        | j        t          | j                   k     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   FrD   r   rz   T)r   r   rX   rZ   r   r   r   )r   	begincharendcharsallowcommentsslistr   s         r@   getdelimitedzAddrlistClass.getdelimited  sI    :dh9,,2AhTZ(( 3TZ1222DH%11A 34:dh#73#>#>T__..///DH%--TZ1222HHMHH hTZ((  &&&rA   c                 0    |                      ddd          S )z1Get a quote-delimited fragment from self's field.r{   z"Fr   r   s    r@   r   zAddrlistClass.getquote  s      eU333rA   c                 0    |                      ddd          S )z7Get a parenthesis-delimited fragment from self's field.r   z)Tr   r   s    r@   r   zAddrlistClass.getcomment  s      eT222rA   c                 6    d|                      ddd          z  S )z!Parse an RFC 2822 domain-literal.z[%s]r   z]Fr   r   s    r@   r   zAddrlistClass.getdomainliteral  s    ))#ue<<<<rA   Nc                 V   dg}|| j         }| j        t          | j                  k     rg| j        | j                 |v rnR|                    | j        | j                            | xj        dz  c_        | j        t          | j                  k     gt
                              |          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   NrD   )r   r   rX   r   rZ   r   r   )r   r   atomlists      r@   r   zAddrlistClass.getatom  s     4}HhTZ((z$(#x//
48 4555HHMHH hTZ(( )))rA   c                 f   g }| j         t          | j                  k     r| j        | j                  | j        v r| xj         dz  c_         n| j        | j                  dk    r(|                    |                                            n| j        | j                  dk    r-| j                            |                                            nG| j        | j                  | j        v rnK|                    | 	                    | j                             | j         t          | j                  k     |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.
        rD   r{   r   )
r   rX   r   r   rZ   r   r   r   r   r   )r   r   s     r@   r   zAddrlistClass.getphraselist  s    hTZ((z$(#tx//ADH%,,T]]__----DH%,, ''(9(9::::DH%88T\\$/::;;; hTZ(( rA   )TN)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   r   r   r   r   r    rA   r@   r   r      s           &( ( (  9 9 9v  @; ; ;B( ( (&#' #' #' #'J4 4 43 3 3= = =* * * *(    rA   r   c                   <    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	S )
AddressListz@An AddressList encapsulates a list of parsed RFC 2822 addresses.c                     t                               | |           |r|                                 | _        d S g | _        d S r   )r   r   r   addresslistr   s     r@   r   zAddressList.__init__  sH    tU+++ 	"#//11D!DrA   c                 *    t          | j                  S r   )rX   r   r   s    r@   __len__zAddressList.__len__  s    4#$$$rA   c                     t          d           }| j        d d          |_        |j        D ]%}|| j        vr|j                            |           &|S r   r   r   rZ   r   othernewaddrxs       r@   __add__zAddressList.__add__  s`    d##".qqq1" 	. 	.A(((#**1---rA   c                 `    |j         D ]%}|| j         vr| j                             |           &| S r   )r   rZ   r   r   r   s      r@   __iadd__zAddressList.__iadd__
  s?    " 	+ 	+A((( ''***rA   c                 ~    t          d           }| j        D ]%}||j        vr|j                            |           &|S r   r   r   s       r@   __sub__zAddressList.__sub__  sL    d##! 	. 	.A)))#**1---rA   c                 `    |j         D ]%}|| j         v r| j                             |           &| S r   )r   remover   s      r@   __isub__zAddressList.__isub__  s?    " 	+ 	+AD$$$ ''***rA   c                     | j         |         S r   )r   )r   r\   s     r@   __getitem__zAddressList.__getitem__   s    &&rA   N)r   r   r   r   r   r   r   r   r   r   r   r   rA   r@   r   r     s        JJ" " "% % %        ' ' ' ' 'rA   r   )r   
__future__r   r   r   r   future.builtinsr   __all__ru   rw   r   r   
COMMASPACEr[   rV   r`   r
   r<   r	   r   r   objectr   r   r   rA   r@   <module>r      s   
 ( ' ' ' ' ' % % % % % %       & & & & & &                
I I I
 >==	 AQA$$$$$ 

 
 
r; r; r;j    9 9 9b b b b bF b b bH	-' -' -' -' -'- -' -' -' -' -'rA   