eESr/SQrSSKrSrSrSr/SQr/SQrSSSSS S S S S S S S SS S.rSr Sr Sr Sr Sr "SS5r"SS\5rg)zcEmail address parsing code. Lifted directly from rfc822.py. This should eventually be rewritten. ) mktime_tz parsedate parsedate_tzquoteN z, )janfebmaraprmayjunjulaugsepoctnovdecjanuaryfebruarymarchaprilr junejulyaugust septemberoctobernovemberdecember)montuewedthufrisatsunipii iiDi)UTUTCGMTZASTADTESTEDTCSTCDTMSTMDTPSTPDTcT[U5nU(dgUScSUS'[U5$)zIConvert a date string to a time tuple. Accounts for military timezones. N r) _parsedate_tztuple)dataress 6/opt/imh/python3.13/lib/python3.13/email/_parseaddr.pyrr-s0  C  1v~A :c U(dgUR5nU(dgUSRS5(dUSR5[;aUS O(USR S5nUS:aUSUS-SUS'[ U5S:Xa*USRS5n[ U5S:XaX SS-n[ U5S:XaQUSnUR S5nUS :XaUR S5nUS:a USUX1S/USS&OURS 5 [ U5S :agUSS nUupEpgnU(aU(aU(dgUR5nU[;aXTR5pTU[;ag[RU5S-nUS :aUS -nUS S:XaUSS nUR S 5nUS:aXvpvUS S:Xa USS nU(dgUSR5(dXpUS S:XaUSS nURS 5n[ U5S:XaUupSn On[ U5S:XaUupn OY[ U5S:XaISUS;a@USRS5n[ U5S:XaUupSn O[ U5S:XaUupn Ogg[U5n[U5n[U 5n [U 5n [U 5n US:aUS:aUS- nOUS- nSn UR5nU[;a [Un O*[U5n U S:XaURS5(aSn U (a!U S:aS n U *n OSn XS-S-U S-S---n XeXIXSSS U / $![a gf=f![a Nkf=f)anConvert 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.dDilii<)splitendswithlower _daynamesrfindlenfindappend _monthnamesindexisdigitint ValueErrorupper _timezones startswith)r9istuffsddmmyytmtzthhtmmtsstzoffsettzsigns r;r7r79s  :: 2wH Q;2==--H a<F yHF}d2hnb5HHI BSq!R ::E *   s$7M- M=- M:9M:= N  N cP[U5n[U[5(aUSS$U$)z&Convert a time string to a time tuple.Nr6)r isinstancer8)r9ts r;rrs)TA!U!u r<c~USc[R"USSS-5$SSKnURU5nX S- $)zETurn a 10-tuple as returned by parsedate_tz() into a POSIX timestamp.r6N)rDr)timemktimecalendartimegm)r9rrrms r;rrsD Aw{{48e+,,  OOD !7{r<cFURSS5RSS5$)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;rrs" ;;tV $ , ,S% 88r<cn\rSrSrSrSrSrSrSrSr Sr S r SS jr S r S rS rSSjrSrSrg) AddrlistClasszAddress 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*SUlSUlSUlSUlURUR-UlURUR-UR-UlUR R SS5UlXl/Ul g)zkInitialize a new instance. `field' is an unparsed address header field, containing one or more addresses. z ()<>@,:;."[]rz z rJrN) specialsposLWSCRFWSatomendsrw phraseendsfield commentlistselfrs r;__init__AddrlistClass.__init__sx ( 88dgg% 0477: --//R8 r<cZ/nUR[UR5:aURURURS-;a[URURS;a(UR URUR5 U=RS- slOHURURS:Xa*UR R UR 55 OO%UR[UR5:aM[RU5$)z&Skip white space and extract comments.z r?() r~rSrrrUr getcomment EMPTYSTRINGjoin)rwslists r;gotonextAddrlistClass.gotonextshhTZZ(zz$((#txx&'88::dhh'v5MM$**TXX"67A DHH%,  ''(9:hhTZZ(''r<c/nUR[UR5:aRUR5nU(aX- nOUR S5 UR[UR5:aMRU$)zFParse all addresses. Returns a list containing all of the addresses. )rr)r~rSr getaddressrU)rresultads r; getaddrlistAddrlistClass.getaddrlists\ hhTZZ("B  h' hhTZZ(  r<c/UlUR5 URnURnUR5nUR5 /nUR[ UR 5:a.U(a%[ RUR5US4/nGOPUR URS;a@XlX lUR5n[ RUR5U4/nGOUR URS:Xa/n[ UR 5nU=RS- slUR[ UR 5:aUR5 URU:a4UR URS:XaU=RS- slGO3X@R5-nUR[ UR 5:aMOUR URS:XauUR5nUR(a;[ RU5S-SRUR5-S -U4/nO[ RU5U4/nOiU(a&[ RUR5US4/nO) rrr~ getphraselistrSrSPACEr getaddrspecr getrouteaddrr})roldposoldclplist returnlistaddrspecfieldlen routeaddrs r;rAddrlistClass.getaddresss   ""$  88s4:: &$zz$*:*:;U1XFG ZZ !T )H$ '')H ::d&6&67BCJ ZZ !S (J4::H HHMH((S_, 88h&4::dhh+?3+FHHMH'//*;; ((S_,ZZ !S ())+I$zz%047"xx(8(89 :#*E HHMHr<cURURS:wagSnU=RS- slUR5 SnUR[UR5:GaU(aUR 5 SnOURURS:XaU=RS- slU$URURS:XaU=RS- slSnO[URURS :XaU=RS- slO(UR 5nU=RS- slU$UR5 UR[UR5:aGMU$) zqParse a route address (Return-path value). This method just skips all the route stuff and returns the addrspec. rNFr?r>@TrG)rr~rrS getdomainr)r expectrouteadlists r;rAddrlistClass.getrouteaddrJs& ::dhh 3 &   A  hhTZZ( # DHH%,A  DHH%,A " DHH%,A ))+A   MMO!hhTZZ($ r<c/nUR5 UR[UR5:GaSnURURS:XaXU(a(USR 5(dUR 5 UR S5 U=RS- slSnOURURS:Xa,UR S[UR55-5 OvURURUR;a0U(a(USR 5(dUR 5 OtUR UR55 UR5nU(aU(aUR U5 UR[UR5:aGMUR[UR5:dURURS:wa[RU5$UR S5 U=RS- slUR5 UR5nU(d[$[RU5U-$) zParse an RFC 2822 addr-spec.TrJrDr?Frvz"%s"r)rr~rSrstrippoprUrgetquotergetatomrrr)raslist preserve_wswsdomains r;rAddrlistClass.getaddrspecjs hhTZZ(Kzz$((#s*&*"2"2"4"4JJL c"A # DHH%, fuT]]_'==>DHH%6&*"2"2"4"4JJL dlln-Br b!%hhTZZ(( 88s4:: &$**TXX*>#*E##F+ + c A  ! '&00r<c/nUR[UR5:GaURURUR;aU=RS- slGO2URURS:Xa*URR UR 55 OURURS:Xa UR UR55 OURURS:Xa'U=RS- slUR S5 OjURURS:Xa[$URURUR;aOEUR UR55 UR[UR5:aGM[RU5$)z-Get the complete domain name from an address.r?r[rJr) r~rSrrrrUrgetdomainliteralrrrr)rsdlists r;rAddrlistClass.getdomains=hhTZZ(zz$((#txx/A DHH%,  ''(9:DHH%, d3356DHH%,A  c"DHH%,#"DHH%6 dlln-#hhTZZ($''r<c>URURU:wagS/nSnU=RS- slUR[UR5:Ga-U(a+URURUR5 SnOURURU;aU=RS- slOU(a>URURS:Xa!URUR 55 MURURS:XaSnO(URURUR5 U=RS- slUR[UR5:aGM-[ R U5$)aParse 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. rFr?rruT)rr~rSrUrrr)r begincharendchars allowcommentsslistrs r; getdelimitedAddrlistClass.getdelimiteds% ::dhh 9 , A hhTZZ( TZZ12DHH%1A 4::dhh#73#> T__./DHH%- TZZ12 HHMHhhTZZ( &&r<c(URSSS5$)z1Get a quote-delimited fragment from self's field.rvz" Frrs r;rAddrlistClass.getquotes  eU33r<c(URSSS5$)z7Get a parenthesis-delimited fragment from self's field.rz) Trrs r;rAddrlistClass.getcomments  eT22r<c.SURSSS5-$)z!Parse an RFC 2822 domain-literal.z[%s]rz] Frrs r;rAddrlistClass.getdomainliterals))#ue<<rs      I > AQA$$$$$   z;z 9kkZ -'--'r<