
    RhE                         d 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      Z G d de      Zy)zcEmail address parsing code.

Lifted directly from rfc822.py.  This should eventually be rewritten.
)	mktime_tz	parsedateparsedate_tzquote    N  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                 H    t        |       }|sy|d   d|d<   t        |      S )zQConvert a date string to a time tuple.

    Accounts for military timezones.
    N	   r   )_parsedate_tztuple)dataress     '/usr/lib/python3.12/email/_parseaddr.pyr   r   -   s0    
 
C
1v~A:    c           
         | sy| j                         } | sy| d   j                  d      s| d   j                         t        v r| d= n'| d   j	                  d      }|dk\  r| d   |dz   d | d<   t        |       dk(  r*| d   j                  d      }t        |      dk(  r|| dd z   } t        |       dk(  rP| d   }|j                  d      }|d	k(  r|j                  d      }|dkD  r|d| ||d g| dd n| j                  d
       t        |       dk  ry| dd } | \  }}}}}|r|r|sy|j                         }|t        vr||j                         }}|t        vryt        j                  |      dz   }|dkD  r|dz  }|d	   dk(  r|dd	 }|j                  d      }|dkD  r||}}|d	   dk(  r|dd	 }|sy|d   j                         s||}}|d	   dk(  r|dd	 }|j                  d      }t        |      dk(  r|\  }	}
d}nkt        |      dk(  r|\  }	}
}nVt        |      dk(  rGd|d   v r@|d   j                  d      }t        |      dk(  r|\  }	}
d}nt        |      dk(  r|\  }	}
}nyy	 t        |      }t        |      }t        |	      }	t        |
      }
t        |      }|dk  r|dkD  r|dz  }n|dz  }d}|j                         }|t        v r
t        |   }n$	 t        |      }|dk(  r|j                  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 # t        $ r Y yw xY w# t        $ r Y aw xY w)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isdigitint
ValueErrorupper
_timezones
startswith)r9   istuffsddmmyytmtzthhtmmtsstzoffsettzsigns                 r;   r7   r7   9   s    ::<D AwQ9 <GGMM#61gacdmDG
4yA~Qc"u:?48#D
4yA~GFF3K7sAq5"1qu~DHKKO
4y1}8DRRR2"	B	RXXZB[ 			2		"B	Bw
b	"v}W
A1uRB	"v}Wa5==?RB	"v}W	#B
2w!|
c	RAc3	RA#A,U[[r7a<JS#CW\ OS#sWW#h#h#h 
Cx7$JB $JBH	B	Zb>	2wH Q;2==-Ha<F yHFx}d2hnb5HHIBS#q!R::E  *  		s$   +7L. L= .	L:9L:=	M	M	c                 F    t        |       }t        |t              r|dd S |S )z&Convert a time string to a time tuple.Nr6   )r   
isinstancer8   r9   ts     r;   r   r      s&    TA!U!ur<   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.r6   N   )rD   )timemktimecalendartimegmrm   s     r;   r   r      sA    Aw{{48e+,,OOD!47{r<   c                 F    | j                  dd      j                  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8r<   c                   b    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y)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
                  j                  dd      | _        || _        g | _	        y)zInitialize a new instance.

        `field' is an unparsed address header field, containing
        one or more addresses.
        z()<>@,:;."[]r   z 	z
rJ   r   N)
specialsposLWSCRFWSatomendsrx   
phraseendsfieldcommentlistselfr   s     r;   __init__zAddrlistClass.__init__   sz     (88dgg%0477: --//R8
r<   c                 J   g }| j                   t        | j                        k  r| j                  | j                      | j                  dz   v rY| j                  | j                      dvr(|j	                  | j                  | j                             | xj                   dz  c_         nG| j                  | j                      dk(  r*| j
                  j	                  | j                                nn#| j                   t        | j                        k  rt        j                  |      S )z&Skip white space and extract comments.z
r?   ()	r~   rS   r   r   rU   r   
getcommentEMPTYSTRINGjoin)r   wslists     r;   gotonextzAddrlistClass.gotonext   s    hhTZZ(zz$((#txx&'88::dhh'v5MM$**TXX"67ADHH%,  ''(9: hhTZZ( ''r<   c                     g }| j                   t        | j                        k  rL| j                         }|r||z  }n|j	                  d       | j                   t        | j                        k  rL|S )zVParse all addresses.

        Returns a list containing all of the addresses.
        )r   r   )r~   rS   r   
getaddressrU   )r   resultads      r;   getaddrlistzAddrlistClass.getaddrlist   s^    
 hhTZZ("B"h' hhTZZ( r<   c                    g | _         | j                          | j                  }| j                   }| j                         }| j                          g }| j                  t	        | j
                        k\  r*|rft        j                  | j                         |d   fg}n?| j
                  | j                     dv rB|| _        || _         | j                         }t        j                  | j                         |fg}n| j
                  | j                     dk(  rg }t	        | j
                        }| xj                  dz  c_        | j                  t	        | j
                        k  rw| j                          | j                  |k  r3| j
                  | j                     dk(  r| xj                  dz  c_        n%|| j                         z   }| j                  t	        | j
                        k  rn| j
                  | j                     dk(  rp| j                         }| j                   r;t        j                  |      dz   dj                  | j                         z   d	z   |fg}n{t        j                  |      |fg}nb|r&t        j                  | j                         |d   fg}n:| j
                  | j                     | j                  v r| xj                  dz  c_        | j                          | j                  t	        | j
                        k  r1| j
                  | j                     d
k(  r| xj                  dz  c_        |S )zParse the next address.r   z.@rG   r?   ;<z (r   )r>   )r   r   r~   getphraselistrS   r   SPACEr   getaddrspecr   getrouteaddrr}   )r   oldposoldclplist
returnlistaddrspecfieldlen	routeaddrs           r;   r   zAddrlistClass.getaddress  s     ""$
88s4::&$zz$*:*:;U1XFG
ZZ!T) DH$D'')H ::d&6&67BCJZZ!S(J4::HHHMH((S_,88h&4::dhh+?3+FHHMH'$//*;;
 ((S_, ZZ!S())+I$zz%047"xx(8(89 :<? @AJL M
  %zz%0)<=
 $zz$*:*:;U1XFG
DHH%6A88c$**o%$**TXX*>#*EHHMHr<   c                    | j                   | j                     dk7  ryd}| xj                  dz  c_        | j                          d}| j                  t        | j                         k  r|r| j	                          d}n| j                   | j                     dk(  r| xj                  dz  c_        	 |S | j                   | j                     dk(  r| xj                  dz  c_        d}nZ| j                   | j                     d	k(  r| xj                  dz  c_        n(| j                         }| xj                  dz  c_        	 |S | j                          | j                  t        | j                         k  r|S )
zParse a route address (Return-path value).

        This method just skips all the route stuff and returns the addrspec.
        r   NFr?   r   >@TrG   )r   r~   r   rS   	getdomainr   )r   expectrouteadlists      r;   r   zAddrlistClass.getrouteaddrG  s&   
 ::dhh3&AhhTZZ( #DHH%,A  DHH%,A"DHH%,A))+A  MMO! hhTZZ($ r<   c                    g }| j                          | j                  t        | j                        k  rgd}| j                  | j                     dk(  rN|r#|d   j	                         s|j                          |j                  d       | xj                  dz  c_        d}n| j                  | j                     dk(  r,|j                  dt        | j                               z         nj| j                  | j                     | j                  v r&|r#|d   j	                         s|j                          nh|j                  | j                                | j                         }|r|r|j                  |       | j                  t        | j                        k  rg| j                  t        | j                        k\  s| j                  | j                     dk7  rt        j                  |      S |j                  d       | xj                  dz  c_        | j                          | j                         }|st        S t        j                  |      |z   S )	zParse an RFC 2822 addr-spec.TrJ   rD   r?   Frw   z"%s"r   )r   r~   rS   r   strippoprU   r   getquoter   getatomr   r   r   )r   aslistpreserve_wswsdomains        r;   r   zAddrlistClass.getaddrspecg  s   hhTZZ(Kzz$((#s*&*"2"2"4JJLc"A#DHH%,fuT]]_'==>DHH%6&*"2"2"4JJLdlln-Brb!% hhTZZ(( 88s4::&$**TXX*>#*E##F++cA! '&00r<   c                    g }| j                   t        | j                        k  r| j                  | j                      | j                  v r| xj                   dz  c_         n,| j                  | j                      dk(  r*| j                  j                  | j                                n| j                  | j                      dk(  r |j                  | j                                n| j                  | j                      dk(  r'| xj                   dz  c_         |j                  d       ng| j                  | j                      dk(  rt        S | j                  | j                      | j                  v rnC|j                  | j                                | j                   t        | j                        k  rt        j                  |      S )z-Get the complete domain name from an address.r?   r   [rJ   r   )r~   rS   r   r   r   rU   r   getdomainliteralr   r   r   r   )r   sdlists     r;   r   zAddrlistClass.getdomain  s=   hhTZZ(zz$((#txx/ADHH%,  ''(9:DHH%,d3356DHH%,Ac"DHH%, #"DHH%6dlln-# hhTZZ($ ''r<   c                    | j                   | j                     |k7  rydg}d}| xj                  dz  c_        | j                  t        | j                         k  r|r+|j                  | j                   | j                            d}n| j                   | j                     |v r| xj                  dz  c_        n|r<| j                   | j                     dk(  r |j                  | j	                                | j                   | j                     dk(  rd}n(|j                  | j                   | j                            | xj                  dz  c_        | j                  t        | j                         k  rt
        j                  |      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?   r   rv   T)r   r~   rS   rU   r   r   r   )r   	begincharendcharsallowcommentsslistr   s         r;   getdelimitedzAddrlistClass.getdelimited  s%    ::dhh9,AhhTZZ(TZZ12DHH%1A4::dhh#73#>T__./DHH%-TZZ12HHMH hhTZZ(  &&r<   c                 (    | j                  ddd      S )z1Get a quote-delimited fragment from self's field.rw   z"Fr   r   s    r;   r   zAddrlistClass.getquote  s      eU33r<   c                 (    | j                  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2r<   c                 .    d| j                  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<<<r<   Nc                    dg}|| j                   }| j                  t        | j                        k  r|| j                  | j                     |v rn`|j	                  | j                  | j                            | xj                  dz  c_        | j                  t        | j                        k  r|t
        j                  |      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   r?   )r   r~   rS   r   rU   r   r   )r   r   atomlists      r;   r   zAddrlistClass.getatom  s     4}}HhhTZZ(zz$((#x/

488 45HHMH hhTZZ( ))r<   c                    g }| j                   t        | j                        k  r3| j                  | j                      | j                  v r| xj                   dz  c_         n| j                  | j                      dk(  r |j	                  | j                                n| j                  | j                      dk(  r*| j                  j	                  | j                                nR| j                  | j                      | j                  v r	 |S |j	                  | j                  | j                               | j                   t        | j                        k  r3|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?   rw   r   )
r~   rS   r   r   rU   r   r   r   r   r   )r   r   s     r;   r   zAddrlistClass.getphraselist  s     hhTZZ(zz$((#txx/ADHH%,T]]_-DHH%,  ''(9:DHH%8  T\\$//:; hhTZZ( r<   )TN)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   r   r   r   r   r    r<   r;   r{   r{      sL    &(9v@$1L(.#'J43=*(r<   r{   c                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
AddressListz@An AddressList encapsulates a list of parsed RFC 2822 addresses.c                 n    t         j                  | |       |r| j                         | _        y g | _        y r   )r{   r   r   addresslistr   s     r;   r   zAddressList.__init__  s.    tU+#//1D!Dr<   c                 ,    t        | j                        S r   )rS   r   r   s    r;   __len__zAddressList.__len__	  s    4##$$r<   c                     t        d       }| j                  d d  |_        |j                  D ],  }|| j                  vs|j                  j                  |       . |S r   r   r   rU   r   othernewaddrxs       r;   __add__zAddressList.__add__  s]    d#"..q1"" 	.A(((##**1-	. r<   c                 |    |j                   D ],  }|| j                   vs| j                   j                  |       . | S r   )r   rU   r   r   r   s      r;   __iadd__zAddressList.__iadd__  s@    "" 	+A(((  ''*	+ r<   c                     t        d       }| j                  D ],  }||j                  vs|j                  j                  |       . |S r   r   r   s       r;   __sub__zAddressList.__sub__  sJ    d#!! 	.A)))##**1-	. r<   c                 |    |j                   D ],  }|| j                   v s| j                   j                  |       . | S r   )r   remover   s      r;   __isub__zAddressList.__isub__$  s@    "" 	+AD$$$  ''*	+ r<   c                      | j                   |   S r   )r   )r   rW   s     r;   __getitem__zAddressList.__getitem__+  s    &&r<   N)r   r   r   r   r   r   r   r   r   r   r   r   r<   r;   r   r      s(    J"%'r<   r   )r   __all__rq   rs   r   r   
COMMASPACErV   rQ   r\   r   r7   r   r   r   r{   r   r   r<   r;   <module>r      s   
 
I
 >	 AQA$$$$$

z;z9k kZ	-'- -'r<   