§ !A?hM¨ã ó& —dZddlZddlZddlZddlmZddlmZddlm Z ddlm Z ddlm Z e d¦«Zee d ¦«zZe d ¦«ZeezZee d ¦«z Zee d ¦«z Zee d ¦«ze d ¦«z ZeezZee d¦«zZeezZee d¦«z ZddhZeezZd„Zd„Zejdejejz¦«Z Gd„de!¦«Z"Gd„de"¦«Z#Gd„de"¦«Z$Gd„de"¦«Z%Gd„de"¦«Z&Gd„d e#¦«Z'Gd!„d"e"¦«Z(Gd#„d$e"¦«Z)Gd%„d&e"¦«Z*Gd'„d(e"¦«Z+Gd)„d*e+¦«Z,Gd+„d,e#¦«Z-Gd-„d.e"¦«Z.Gd/„d0e"¦«Z/Gd1„d2e"¦«Z0Gd3„d4e"¦«Z1Gd5„d6e"¦«Z2Gd7„d8e"¦«Z3Gd9„d:e"¦«Z4Gd;„de"¦«Z6Gd?„d@e"¦«Z7GdA„dBe"¦«Z8GdC„dDe"¦«Z9GdE„dFe"¦«Z:GdG„dHe"¦«Z;GdI„dJe"¦«Z<GdK„dLe"¦«Z=GdM„dNe%¦«Z>GdO„dPe"¦«Z?GdQ„dRe"¦«Z@GdS„dTe"¦«ZAGdU„dVe"¦«ZBGdW„dXeB¦«ZCGdY„dZe"¦«ZDGd[„d\e"¦«ZEGd]„d^e"¦«ZFGd_„d`e"¦«ZGGda„dbe"¦«ZHGdc„ddeH¦«ZIGde„dfeH¦«ZJGdg„dhe"¦«ZKGdi„dje"¦«ZLGdk„dle"¦«ZMGdm„dneM¦«ZNGdo„dpeN¦«ZOGdq„dre"¦«ZPGds„dteQ¦«ZRGdu„dveR¦«ZSGdw„dxeR¦«ZTGdy„dzeS¦«ZUGd{„d|e jV¦«ZWeTd d}¦«ZXeTd~d¦«ZYd€eY_Zd€eY_[eTd�d‚¦«Z\ejdƒ ]d„ ^e¦«¦«¦«j_Z`ejd… ]ejad„ ^e¦«¦«¦«¦«jbZcejd†¦«jdZeejd… ]ejad„ ^e¦«¦«¦«¦«jbZfejd… ]ejad„ ^e¦«¦«¦«¦«jbZgejd… ]ejad„ ^e¦«¦«¦«¦«jbZhd‡„Zidˆ„Zjd‰„ZkdÂd‹„ZldŒ„Zmd�„ZndŽ„Zod�„Zpd�„Zqd‘„Zrd’„Zsd“„Ztd”„Zud•„Zvd–„Zwd—„Zxd˜„Zyd™„Zzdš„Z{d›„Z|dœ„Z}d�„Z~dž„ZdŸ„Z€d „Z�d¡„Z‚d¢„Zƒd£„Z„d¤„Z…d¥„Z†d¦„Z‡d§„Zˆd¨„Z‰d©„ZŠdª„Z‹d«„ZŒd¬„Z�d­„ZŽd®„Z�d¯„Z�d°„Z‘d±„Z’d²„Z“d³„Z”d´„Z•dµ„Z–d¶„Z—d·„Z˜d¸„Z™d¹„Zšdº„Z›d»„Zœd¼„Z�d½„Zžd¾„ZŸd¿„Z dÀ„Z¡dÁ„Z¢dS)ÃalHeader value parser implementing various email-related RFC parsing rules. The parsing methods defined in this module implement various email related parsing rules. Principal among them is RFC 5322, which is the followon to RFC 2822 and primarily a clarification of the former. It also implements RFC 2047 encoded word decoding. RFC 5322 goes to considerable trouble to maintain backward compatibility with RFC 822 in the parse phase, while cleaning up the structure on the generation phase. This parser supports correct RFC 5322 generation by tagging white space as folding white space only when folding is allowed in the non-obsolete rule sets. Actually, the parser is even more generous when accepting input than RFC 5322 mandates, following the spirit of Postel's Law, which RFC 5322 encourages. Where possible deviations from the standard are annotated on the 'defects' attribute of tokens that deviate. The general structure of the parser follows RFC 5322, and uses its terminology where there is a direct correspondence. Where the implementation requires a somewhat different structure than that used by the formal grammar, new terms that mimic the closest existing terms are used. Thus, it really helps to have a copy of RFC 5322 handy when studying this code. Input to the parser is a string that has already been unfolded according to RFC 5322 rules. According to the RFC this unfolding is the very first step, and this parser leaves the unfolding step to a higher level message parser, which will have already detected the line breaks that need unfolding while determining the beginning and end of each header. The output of the parser is a TokenList object, which is a list subclass. A TokenList is a recursive data structure. The terminal nodes of the structure are Terminal objects, which are subclasses of str. These do not correspond directly to terminal objects in the formal grammar, but are instead more practical higher level combinations of true terminals. All TokenList and Terminal objects have a 'value' attribute, which produces the semantically meaningful value of that part of the parse subtree. The value of all whitespace tokens (no matter how many sub-tokens they may contain) is a single space, as per the RFC rules. This includes 'CFWS', which is herein included in the general class of whitespace tokens. There is one exception to the rule that whitespace tokens are collapsed into single spaces in values: in the value of a 'bare-quoted-string' (a quoted-string with no leading or trailing whitespace), any whitespace that appeared between the quotation marks is preserved in the returned value. Note that in all Terminal strings quoted pairs are turned into their unquoted values. All TokenList and Terminal objects also have a string value, which attempts to be a "canonical" representation of the RFC-compliant form of the substring that produced the parsed subtree, including minimal use of quoted pair quoting. Whitespace runs are not collapsed. Comment tokens also have a 'content' attribute providing the string found between the parens (including any nested comments) with whitespace preserved. All TokenList and Terminal objects have a 'defects' attribute which is a possibly empty list all of the defects found while creating the token. Defects may appear on any token in the tree, and a composite list of all defects in the subtree is available through the 'all_defects' attribute of any node. (For Terminal notes x.defects == x.all_defects.) Each object in a parse tree is called a 'token', and each has a 'token_type' attribute that gives the name from the RFC 5322 grammar that it represents. Not all RFC 5322 nodes are produced, and there is one non-RFC 5322 node that may be produced: 'ptext'. A 'ptext' is a string of printable ascii characters. It is returned in place of lists of (ctext/quoted-pair) and (qtext/quoted-pair). XXX: provide complete list of token types. éN)Ú hexdigits)Ú itemgetter)Ú_encoded_words)Úerrors)Úutilsz ú(z ()<>@,:;.\"[]ú.z."(z/?=z*'%ú%ú ú cóp—t|¦« dd¦« dd¦«S)z;Escape dquote and backslash for use within a quoted-string.ú\ú\\ú"z\")ÚstrÚreplace©Úvalues úG/opt/alt/python-internal/lib64/python3.11/email/_header_value_parser.pyÚmake_quoted_pairsrcs.€å ˆu‰:Œ:× Ò ˜d FÑ +Ô +× 3Ò 3°C¸Ñ ?Ô ?Ð?ócó,—t|¦«}d|›d�S)Nr)r)rÚescapeds rÚ quote_stringrhs€Ý Ñ&Ô&€GØ ˆwˆ>ˆ>ˆ>Ðrzñ =\? # literal =? [^?]* # charset \? # literal ? [qQbB] # literal 'q' or 'b', case insensitive \? # literal ? .*? # encoded word \?= # literal ?= c󶇗eZdZdZdZdZˆfd„Zd„Zˆfd„Ze d„¦«Z e d„¦«Z d„Z e d „¦«Z e d „¦«Zd „Zdd „Zdd„Zdd„ZˆxZS)Ú TokenListNTcóH•—t¦«j|i|¤Žg|_dS©N)ÚsuperÚ__init__Údefects)ÚselfÚargsÚkwÚ __class__s €rr zTokenList.__init__ƒs*ø€Ø�‰ŒÔ˜$Ð% "Ð%Ð%Ð%؈Œ ˆ ˆ rcó@—d d„|D¦«¦«S)NÚc3ó4K—|]}t|¦«V—ŒdSr©r©Ú.0Úxs rú z$TokenList.__str__..ˆó(èè€Ð,Ð, !•s˜1‘v”vÐ,Ð,Ð,Ð,Ð,Ð,r©Újoin©r"s rÚ__str__zTokenList.__str__‡s#€Ø�wŠwÐ,Ð, tÐ,Ñ,Ô,Ñ,Ô,Ð,rc󀕗d |jjt¦« ¦«¦«S©Nz{}({})©Úformatr%Ú__name__rÚ__repr__©r"r%s €rr8zTokenList.__repr__Šs3ø€Ø�Š˜tœ~Ô6Ý"™WœW×-Ò-Ñ/Ô/ñ1ô1ð 1rcó@—d d„|D¦«¦«S)Nr'c3ó2K—|]}|j¯ |jV—ŒdSrrr*s rr-z"TokenList.value..�s+èè€Ð8Ð8 1°´Ð8�q”wÐ8Ð8Ð8Ð8Ð8Ð8rr/r1s rrzTokenList.valueŽs#€à�wŠwÐ8Ð8¨Ð8Ñ8Ô8Ñ8Ô8Ð8rcó@—td„|D¦«|j¦«S)Nc3ó$K—|] }|jV—Œ dSr)Ú all_defectsr*s rr-z(TokenList.all_defects..”s$èè€Ð0Ð0 a�A”MÐ0Ð0Ð0Ð0Ð0Ð0r)Úsumr!r1s rr>zTokenList.all_defects’s#€åÐ0Ð0¨4Ð0Ñ0Ô0°$´,Ñ?Ô?Ð?rcó6—|d ¦«S©Nr)Ústartswith_fwsr1s rrBzTokenList.startswith_fws–s€Ø�AŒw×%Ò%Ñ'Ô'Ð'rcó4—td„|D¦«¦«S)zATrue if all top level tokens of this part may be RFC2047 encoded.c3ó$K—|] }|jV—Œ dSr)Ú as_ew_allowed)r+Úparts rr-z*TokenList.as_ew_allowed..œs%èè€Ð7Ð7¨$�4Ô%Ð7Ð7Ð7Ð7Ð7Ð7r)Úallr1s rrEzTokenList.as_ew_allowed™s!€õÐ7Ð7°$Ð7Ñ7Ô7Ñ7Ô7Ð7rcóH—g}|D]}| |j¦«Œ|Sr)ÚextendÚcomments)r"rJÚtokens rrJzTokenList.commentsžs2€àˆØð ,ð ,ˆEØ �OŠO˜EœNÑ +Ô +Ð +Ð +؈rcó$—t||¬¦«S)N©Úpolicy)Ú_refold_parse_tree©r"rNs rÚfoldzTokenList.fold¥s€Ý! $¨vÐ6Ñ6Ô6Ð6rr'cóL—t| |¬¦«¦«dS)N©Úindent)ÚprintÚppstr©r"rTs rÚpprintzTokenList.pprint¨s$€Ý ˆd�jŠj ˆjÑ'Ô'Ñ(Ô(Ð(Ð(Ð(rcóT—d | |¬¦«¦«S)Nr rS)r0Ú_pprWs rrVzTokenList.ppstr«s"€Ø�yŠy˜Ÿš¨˜Ñ0Ô0Ñ1Ô1Ð1rc#ónK—d ||jj|j¦«V—|D]K}t |d¦«s|d |¦«zV—Œ-| |dz¦«Ed{V—†ŒL|jrd |j¦«}nd}d ||¦«V—dS)Nz{}{}/{}(rZz* !! invalid element in token list: {!r}z z Defects: {}r'z{}){})r6r%r7Ú token_typeÚhasattrrZr!)r"rTrKÚextras rrZz TokenList._pp®sÿèè€Ø×ÒØ Ø ŒNÔ #Ø ŒOñôð ð ð ðð 4ð 4ˆEݘ5 %Ñ(Ô(ð 4Øð!5ß5;²V¸E±]´]ñCðDðDðDðDð!Ÿ9š9 V¨F¡]Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ø Œ<ð Ø"×)Ò)¨$¬,Ñ7Ô7ˆEˆEàˆEØ�nŠn˜V UÑ+Ô+Ð+Ð+Ð+Ð+Ð+r©r')r7Ú __module__Ú __qualname__r\Úsyntactic_breakÚew_combine_allowedr r2r8Úpropertyrr>rBrErJrQrXrVrZÚ __classcell__©r%s@rrr}s9ø€€€€€à€JØ€OØÐðððððð-ð-ð-ð1ð1ð1ð1ð1ðð9ð9ñ„Xð9ðð@ð@ñ„Xð@ð(ð(ð(ðð8ð8ñ„Xð8ðððñ„Xðð 7ð7ð7ð)ð)ð)ð)ð2ð2ð2ð2ð,ð,ð,ð,ð,ð,ð,ð,rrcó:—eZdZed„¦«Zed„¦«ZdS)ÚWhiteSpaceTokenListcó—dS©Nú ©r1s rrzWhiteSpaceTokenList.valueÂó€àˆsrcó—d„|D¦«S)Ncó2—g|]}|jdk¯ |j‘ŒS)Úcomment)r\Úcontentr*s rú z0WhiteSpaceTokenList.comments..Ès&€ÐCÐCÐC˜a¨1¬<¸Ò+BÐ+B�” Ð+BÐ+BÐ+Brrlr1s rrJzWhiteSpaceTokenList.commentsÆs€àCÐC 4ÐCÑCÔCÐCrN)r7r`rardrrJrlrrrhrhÀsM€€€€€à ððñ„XðððDðDñ„XðDðDðDrrhcó—eZdZdZdS)ÚUnstructuredTokenListÚ unstructuredN©r7r`rar\rlrrrtrtËs€€€€€Ø€J€J€Jrrtcó—eZdZdZdS)ÚPhraseÚphraseNrvrlrrrxrxÏó€€€€€Ø€J€J€Jrrxcó—eZdZdZdS)ÚWordÚwordNrvrlrrr|r|Òó€€€€€Ø€J€J€Jrr|có—eZdZdZdS)ÚCFWSListÚcfwsNrvrlrrr€r€Ör~rr€có—eZdZdZdS)ÚAtomÚatomNrvrlrrrƒrƒÚr~rrƒcó—eZdZdZdZdS)ÚTokenrKFN)r7r`rar\Ú encode_as_ewrlrrr†r†Þs€€€€€Ø€JØ€L€L€Lrr†có—eZdZdZdZdZdZdS)Ú EncodedWordú encoded-wordN)r7r`rar\ÚcteÚcharsetÚlangrlrrr‰r‰ãs"€€€€€Ø€JØ €CØ€GØ €D€D€Drr‰cóT—eZdZdZed„¦«Zed„¦«Zed„¦«ZdS)Ú QuotedStringú quoted-stringcó8—|D]}|jdkr |jcSŒdS©Núbare-quoted-string©r\r©r"r,s rrqzQuotedString.contentîs9€àð ð ˆAØŒ|Ð3Ò3Ð3Ø”w���ð4ð ð rcóÊ—g}|D]J}|jdkr#| t|¦«¦«Œ0| |j¦«ŒKd |¦«S)Nr“r')r\Úappendrrr0)r"Úresr,s rÚ quoted_valuezQuotedString.quoted_valueôsf€àˆØð $ð $ˆAØŒ|Ð3Ò3Ð3Ø— ’ �3˜q™6œ6Ñ"Ô"Ð"Ð"à— ’ ˜1œ7Ñ#Ô#Ð#Ð#Ø�wŠw�s‰|Œ|Ðrcó8—|D]}|jdkr |jcSŒdSr’r”©r"rKs rÚstripped_valuezQuotedString.stripped_valueþs=€àð #ð #ˆEØÔÐ#7Ò7Ð7Ø”{Ð"Ð"Ð"ð8ð #ð #rN)r7r`rar\rdrqr™rœrlrrr�r�êsh€€€€€à €Jà ððñ„Xðð ððñ„Xððð#ð#ñ„Xð#ð#ð#rr�có.—eZdZdZd„Zed„¦«ZdS)ÚBareQuotedStringr“cóZ—td d„|D¦«¦«¦«S)Nr'c3ó4K—|]}t|¦«V—ŒdSrr)r*s rr-z+BareQuotedString.__str__.. s(èè€Ð#9Ð#9¨q¥C¨¡F¤FÐ#9Ð#9Ð#9Ð#9Ð#9Ð#9r)rr0r1s rr2zBareQuotedString.__str__ s+€Ý˜BŸGšGÐ#9Ð#9°DÐ#9Ñ#9Ô#9Ñ9Ô9Ñ:Ô:Ð:rcó@—d d„|D¦«¦«S)Nr'c3ó4K—|]}t|¦«V—ŒdSrr)r*s rr-z)BareQuotedString.value..r.rr/r1s rrzBareQuotedString.value ó#€à�wŠwÐ,Ð, tÐ,Ñ,Ô,Ñ,Ô,Ð,rN)r7r`rar\r2rdrrlrrržržsC€€€€€à%€Jð;ð;ð;ðð-ð-ñ„Xð-ð-ð-rržcóJ—eZdZdZd„Zd„Zed„¦«Zed„¦«ZdS)ÚCommentrpcól‡—d tdgˆfd„‰D¦«dggg¦«¦«S)Nr'rcó:•—g|]}‰ |¦«‘ŒSrl)Úquote)r+r,r"s €rrrz#Comment.__str__..s#ø€Ð9Ð9Ð9¨q˜TŸZšZ¨™]œ]Ð9Ð9Ð9rú))r0r?r1s`rr2zComment.__str__sPø€Ø�wŠw•sØ ˜EØ9Ð9Ð9Ð9°DÐ9Ñ9Ô9Ø ˜Eðð "ñ #ô#ñ$ô$ð $rcóÌ—|jdkrt|¦«St|¦« dd¦« dd¦« dd¦«S)Nrprrrz\(r©z\))r\rr)r"rs rr¨z Comment.quotesc€Ø Ô ˜yÒ (Ð (Ý�u‘:”:Ð Ý�5‰zŒz×!Ò! $¨Ñ/Ô/×7Ò7Ø"% uñ.ô.ß.5ªgØ"% uñ/.ô/.ð .rcó@—d d„|D¦«¦«S)Nr'c3ó4K—|]}t|¦«V—ŒdSrr)r*s rr-z"Comment.content..%r.rr/r1s rrqzComment.content#r£rcó—|jgSr)rqr1s rrJzComment.comments's €à” ˆ~ÐrN) r7r`rar\r2r¨rdrqrJrlrrr¥r¥sm€€€€€à€Jð$ð$ð$ð.ð.ð.ðð-ð-ñ„Xð-ðððñ„Xðððrr¥cóT—eZdZdZed„¦«Zed„¦«Zed„¦«ZdS)Ú AddressListz address-listcó—d„|D¦«S)Ncó(—g|]}|jdk¯ |‘ŒS)Úaddress©r\r*s rrrz)AddressList.addresses..1ó$€Ð;Ð;Ð;�a 1¤<°Ò#:Ð#:�Ð#:Ð#:Ð#:rrlr1s rÚ addresseszAddressList.addresses/ó€à;Ð;˜4Ð;Ñ;Ô;Ð;rcó6—td„|D¦«g¦«S)Nc3ó:K—|]}|jdk¯ |jV—ŒdS©r²N©r\Ú mailboxesr*s rr-z(AddressList.mailboxes..5s<èè€ð>ð>Ø Q¤\°9Ò%<Ð%<ð”KØ%<Ð%<Ð%<Ð%<ð>ð>r©r?r1s rr»zAddressList.mailboxes3ó6€åð>ð>Ø!ð>ñ>ô>Ø?AñCôCð Crcó6—td„|D¦«g¦«S)Nc3ó:K—|]}|jdk¯ |jV—ŒdSr¹©r\Ú all_mailboxesr*s rr-z,AddressList.all_mailboxes..:s<èè€ð>ð>Ø Q¤\°9Ò%<Ð%<ð”OØ%<Ð%<Ð%<Ð%<ð>ð>rr¼r1s rrÁzAddressList.all_mailboxes8r½rN)r7r`rar\rdrµr»rÁrlrrr¯r¯+sp€€€€€à€Jà ð<ð<ñ„Xð<ððCðCñ„XðCððCðCñ„XðCðCðCrr¯cóT—eZdZdZed„¦«Zed„¦«Zed„¦«ZdS)ÚAddressr²cóB—|djdkr |djSdS)NrÚgroup©r\Ú display_namer1s rrÇzAddress.display_nameBs)€à �Œ7Ô  Ò (Ð (ؘ”7Ô'Ð 'ð )Ð (rcóv—|djdkr |dgS|djdkrgS|djS©NrÚmailboxúinvalid-mailboxrºr1s rr»zAddress.mailboxesGsE€à �Œ7Ô  Ò *Ð *ؘ”G�9Ð Ø �!ŒWÔ Ð#4Ò 4Ð 4؈IØ�AŒwÔ Ð rcó„—|djdkr |dgS|djdkr |dgS|djSrÉrÀr1s rrÁzAddress.all_mailboxesOsL€à �Œ7Ô  Ò *Ð *ؘ”G�9Ð Ø �!ŒWÔ Ð#4Ò 4Ð 4ؘ”G�9Ð Ø�AŒwÔ$Ð$rN)r7r`rar\rdrÇr»rÁrlrrrÃrÃ>sh€€€€€à€Jà ð(ð(ñ„Xð(ðð!ð!ñ„Xð!ðð%ð%ñ„Xð%ð%ð%rrÃcó>—eZdZdZed„¦«Zed„¦«ZdS)Ú MailboxListú mailbox-listcó—d„|D¦«S)Ncó(—g|]}|jdk¯ |‘ŒS)rÊr³r*s rrrz)MailboxList.mailboxes..]r´rrlr1s rr»zMailboxList.mailboxes[r¶rcó—d„|D¦«S)Ncó$—g|] }|jdv¯ |‘ŒS))rÊrËr³r*s rrrz-MailboxList.all_mailboxes..as/€ð?ð?ð?�aØŒ|Ð=Ð=Ð=ðØ=Ð=Ð=rrlr1s rrÁzMailboxList.all_mailboxes_s"€ð?ð?˜4ð?ñ?ô?ð ?rN©r7r`rar\rdr»rÁrlrrrÎrÎWsM€€€€€à€Jà ð<ð<ñ„Xð<ðð?ð?ñ„Xð?ð?ð?rrÎcó>—eZdZdZed„¦«Zed„¦«ZdS)Ú GroupListú group-listcóF—|r|djdkrgS|djS©NrrÏrºr1s rr»zGroupList.mailboxesis-€àð �t˜A”wÔ)¨^Ò;Ð;؈IØ�AŒwÔ Ð rcóF—|r|djdkrgS|djSrÙrÀr1s rrÁzGroupList.all_mailboxesos-€àð �t˜A”wÔ)¨^Ò;Ð;؈IØ�AŒwÔ$Ð$rNrÔrlrrrÖrÖesM€€€€€à€Jà ð!ð!ñ„Xð!ð ð%ð%ñ„Xð%ð%ð%rrÖcóT—eZdZdZed„¦«Zed„¦«Zed„¦«ZdS)ÚGrouprÅcóB—|djdkrgS|djS©Nér×rºr1s rr»zGroup.mailboxeszs&€à �Œ7Ô  Ò -Ð -؈IØ�AŒwÔ Ð rcóB—|djdkrgS|djSrÞrÀr1s rrÁzGroup.all_mailboxes€s&€à �Œ7Ô  Ò -Ð -؈IØ�AŒwÔ$Ð$rcó—|djSrA)rÇr1s rrÇzGroup.display_name†s€à�AŒwÔ#Ð#rN)r7r`rar\rdr»rÁrÇrlrrrÜrÜvsh€€€€€à€Jà ð!ð!ñ„Xð!ð ð%ð%ñ„Xð%ð ð$ð$ñ„Xð$ð$ð$rrÜcó€—eZdZdZed„¦«Zed„¦«Zed„¦«Zed„¦«Zed„¦«Z dS)ÚNameAddrú name-addrcóF—t|¦«dkrdS|djS©Nér)ÚlenrÇr1s rrÇzNameAddr.display_name�s#€å ˆt‰9Œ9˜Š>ˆ>Ø�4Ø�AŒwÔ#Ð#rcó—|djS©Néÿÿÿÿ©Ú local_partr1s rrízNameAddr.local_part•s€à�BŒxÔ"Ð"rcó—|djSrê©Údomainr1s rrðzNameAddr.domain™s€à�BŒxŒÐrcó—|djSrê)Úrouter1s rròzNameAddr.route�s€à�BŒxŒ~Ðrcó—|djSrê©Ú addr_specr1s rrõzNameAddr.addr_spec¡s€à�BŒxÔ!Ð!rN© r7r`rar\rdrÇrírðròrõrlrrrãrã‹sž€€€€€à€Jà ð$ð$ñ„Xð$ð ð#ð#ñ„Xð#ðððñ„Xððððñ„Xððð"ð"ñ„Xð"ð"ð"rrãcój—eZdZdZed„¦«Zed„¦«Zed„¦«Zed„¦«ZdS)Ú AngleAddrz angle-addrcó8—|D]}|jdkr |jcSŒdS©Nú addr-spec)r\rír•s rrízAngleAddr.local_partªs;€àð $ð $ˆAØŒ|˜{Ò*Ð*Ø”|Ð#Ð#Ð#ð+ð $ð $rcó8—|D]}|jdkr |jcSŒdSrú©r\rðr•s rrðzAngleAddr.domain°s8€àð ð ˆAØŒ|˜{Ò*Ð*Ø”x���ð+ð ð rcó8—|D]}|jdkr |jcSŒdS)Nú obs-route)r\Údomainsr•s rròzAngleAddr.route¶s;€àð !ð !ˆAØŒ|˜{Ò*Ð*Ø”yÐ Ð Ð ð+ð !ð !rcó‚—|D];}|jdkr.|jr |jcSt|j¦«|jzcSŒ)r\rírõrr•s rrõzAngleAddr.addr_spec¼s`€àð ð ˆAØŒ|˜{Ò*Ð*Ø”<ðDØœ;Ð&Ð&Ð&å'¨¬ Ñ5Ô5¸¼ ÑCÐCÐCÐCð +ð �4rN) r7r`rar\rdrírðròrõrlrrrørø¦sƒ€€€€€à€Jà ð$ð$ñ„Xð$ð ð ð ñ„Xð ð ð!ð!ñ„Xð!ð ððñ„Xðððrrøcó(—eZdZdZed„¦«ZdS)ÚObsRouterÿcó—d„|D¦«S)Ncó2—g|]}|jdk¯ |j‘ŒSrïrýr*s rrrz$ObsRoute.domains..Îs&€ÐCÐCÐC˜Q¨!¬,¸(Ò*BÐ*B�”Ð*BÐ*BÐ*Brrlr1s rrzObsRoute.domainsÌs€àCÐC $ÐCÑCÔCÐCrN)r7r`rar\rdrrlrrrrÈs7€€€€€à€Jà ðDðDñ„XðDðDðDrrcó€—eZdZdZed„¦«Zed„¦«Zed„¦«Zed„¦«Zed„¦«Z dS)ÚMailboxrÊcóB—|djdkr |djSdS©NrrärÆr1s rrÇzMailbox.display_nameÕs)€à �Œ7Ô  Ò ,Ð ,ؘ”7Ô'Ð 'ð -Ð ,rcó—|djSrArìr1s rrízMailbox.local_partÚó€à�AŒwÔ!Ð!rcó—|djSrArïr1s rrðzMailbox.domainÞs€à�AŒwŒ~ÐrcóB—|djdkr |djSdSr )r\ròr1s rròz Mailbox.routeâs(€à �Œ7Ô  Ò ,Ð ,ؘ”7”=Ð ð -Ð ,rcó—|djSrArôr1s rrõzMailbox.addr_specçs€à�AŒwÔ Ð rNrörlrrrrÑsž€€€€€à€Jà ð(ð(ñ„Xð(ðð"ð"ñ„Xð"ðððñ„Xððð!ð!ñ„Xð!ðð!ð!ñ„Xð!ð!ð!rrcó8—eZdZdZed„¦«ZexZxZxZZ dS)ÚInvalidMailboxrËcó—dSrrlr1s rrÇzInvalidMailbox.display_nameðó€àˆtrNrörlrrrrìsB€€€€€à"€Jà ððñ„Xðð/;Ð:€JÐ:�Ð:˜% ) ) )rrcó6‡—eZdZdZdZeˆfd„¦«ZˆxZS)ÚDomainrðFcót•—d t¦«j ¦«¦«S©Nr'©r0rrÚsplitr9s €rrðz Domain.domainüó'ø€à�wŠw•u‘w”w”}×*Ò*Ñ,Ô,Ñ-Ô-Ð-r)r7r`rar\rErdrðrerfs@rrr÷sLø€€€€€à€JØ€Mà ð.ð.ð.ð.ñ„Xð.ð.ð.ð.ð.rrcó—eZdZdZdS)ÚDotAtomúdot-atomNrvrlrrrrs€€€€€Ø€J€J€Jrrcó—eZdZdZdZdS)Ú DotAtomTextz dot-atom-textTN©r7r`rar\rErlrrrrs€€€€€Ø €JØ€M€M€Mrrcó—eZdZdZdZdS)Ú NoFoldLiteralzno-fold-literalFNrrlrrr!r! s€€€€€Ø"€JØ€M€M€Mrr!cón—eZdZdZdZed„¦«Zed„¦«Zed„¦«Zed„¦«Z dS)ÚAddrSpecrûFcó—|djSrArìr1s rrízAddrSpec.local_partr rcóF—t|¦«dkrdS|djS)Nérë)rèrðr1s rrðzAddrSpec.domains"€å ˆt‰9Œ9�qŠ=ˆ=Ø�4Ø�BŒxŒÐrcóÜ—t|¦«dkr |djS|dj ¦«|djz|dj ¦«zS)Nr&rrçrß)rèrÚrstripÚlstripr1s rrzAddrSpec.valuesW€å ˆt‰9Œ9�qŠ=ˆ=ؘ”7”=Ð Ø�AŒwŒ}×#Ò#Ñ%Ô% d¨1¤g¤mÑ3°D¸´G´M×4HÒ4HÑ4JÔ4JÑJÐJrcóÞ—t|j¦«}t|¦«t|tz ¦«krt |j¦«}n|j}|j� |dz|jzS|S)Nú@)ÚsetrírèÚ DOT_ATOM_ENDSrrð)r"ÚnamesetÚlps rrõzAddrSpec.addr_spec$se€å�d”oÑ&Ô&ˆÝ ˆw‰<Œ<�#˜g¥mÑ3Ñ4Ô4Ò 4Ð 4ݘdœoÑ.Ô.ˆBˆBà”ˆBØ Œ;Ð "ؘ‘8˜dœkÑ)Ð )؈ rN) r7r`rar\rErdrírðrrõrlrrr#r#s‹€€€€€à€JØ€Mà ð"ð"ñ„Xð"ðððñ„Xðð ðKðKñ„XðKð ððñ„Xðððrr#có—eZdZdZdZdS)Ú ObsLocalPartzobs-local-partFNrrlrrr1r10s€€€€€à!€JØ€M€M€Mrr1cóL‡—eZdZdZdZed„¦«Zeˆfd„¦«ZˆxZS)Ú DisplayNamez display-nameFcóØ—t|¦«}t|¦«dkr|jS|djdkr| d¦«n7|ddjdkr t|ddd…¦«|d<|djdkr| ¦«n7|ddjdkr t|ddd…¦«|d<|jS)Nrr�rçrë)rrèrr\Úpop)r"r˜s rrÇzDisplayName.display_name;sր嘉oŒoˆÝ ˆs‰8Œ8�qŠ=ˆ=Ø”9Ð Ø ˆqŒ6Ô  Ò &Ð &Ø �GŠG�A‰JŒJˆJˆJà�1Œv�aŒyÔ# vÒ-Ð-Ý" 3 q¤6¨!¨"¨"¤:Ñ.Ô.��A‘Ø ˆrŒ7Ô  Ò 'Ð 'Ø �GŠG‰IŒIˆIˆIà�2Œw�rŒ{Ô%¨Ò/Ð/Ý# C¨¤G¨C¨R¨C¤LÑ1Ô1��B‘ØŒyÐrcót•—d}|jrd}n|D]}|jdkrd}Œt|¦«dkrt|rrdx}}|djdks|ddjdkrd}|djdks|ddjdkrd}|t|j¦«z|zSt ¦«jS) NFTr�rr'r�rkrë)r!r\rèrrÇrr)r"r¨r,ÚpreÚpostr%s €rrzDisplayName.valueLsÖø€àˆØ Œ<ð !؈EˆEàð !ð !�Ø”< ?Ò2Ð2Ø �EøÝ ˆt‰9Œ9˜Š>ˆ>˜eˆ>؈OˆC�$Ø�AŒwÔ! 6Ò)Ð)¨T°!¬W°Q¬ZÔ-BÀFÒ-JÐ-JØ�Ø�BŒxÔ" FÒ*Ð*¨d°2¬h°r¬lÔ.EÀvÒ.MÐ.MØ�Ø•| DÔ$5Ñ6Ô6Ñ6°tÑ;Ð ;å‘7”7”=Ð r) r7r`rar\rcrdrÇrrerfs@rr3r36shø€€€€€à€JØÐà ððñ„Xðð ð!ð!ð!ð!ñ„Xð!ð!ð!ð!ð!rr3cóB—eZdZdZdZed„¦«Zed„¦«ZdS)Ú LocalPartz local-partFcóX—|djdkr |djS|djS)Nrr�)r\r™rr1s rrzLocalPart.valuees-€à �Œ7Ô  Ò 0Ð 0ؘ”7Ô'Ð 'à˜”7”=Ð rcó —tg}t}d}|dtgzD]Ã}|jdkrŒ|r6|jdkr+|djdkrt|dd…¦«|d<t|t¦«}|rG|jdkr<|djdkr+| t|dd…¦«¦«n| |¦«|d}|}ŒÄt|dd…¦«}|jS)NFrr�Údotrërç)ÚDOTr\rÚ isinstancer—r)r"r˜ÚlastÚ last_is_tlÚtokÚis_tls rrízLocalPart.local_partls€õˆeˆÝˆØˆ ؘ”7�c˜U‘?ð ð ˆCØŒ~ Ò'Ð'ØØð /˜sœ~°Ò6Ð6ؘ”HÔ'¨6Ò1Ð1Ý# D¨¨"¨¤IÑ.Ô.��B‘ݘs¥IÑ.Ô.ˆEØð ˜$œ/¨UÒ2Ð2ؘ”FÔ%¨Ò/Ð/Ø— ’ �9 S¨¨¨¤WÑ-Ô-Ñ.Ô.Ð.Ð.à— ’ ˜3‘”�Ø�r”7ˆD؈JˆJݘ˜A˜b˜Dœ Ñ"Ô"ˆØŒyÐrN)r7r`rar\rErdrrírlrrr:r:`sR€€€€€à€JØ€Mà ð!ð!ñ„Xð!ð ððñ„Xðððrr:cóL‡—eZdZdZdZeˆfd„¦«Zed„¦«ZˆxZS)Ú DomainLiteralzdomain-literalFcót•—d t¦«j ¦«¦«Srrr9s €rrðzDomainLiteral.domain‰rrcó8—|D]}|jdkr |jcSŒdS)NÚptextr”r•s rÚipzDomainLiteral.ip�s8€àð ð ˆAØŒ|˜wÒ&Ð&Ø”w���ð'ð ð r) r7r`rar\rErdrðrIrerfs@rrErE„sgø€€€€€à!€JØ€Mà ð.ð.ð.ð.ñ„Xð.ðððñ„XðððððrrEcó—eZdZdZdZdZdS)Ú MIMEVersionz mime-versionN)r7r`rar\ÚmajorÚminorrlrrrKrK”s€€€€€à€JØ €EØ €E€E€ErrKcóJ—eZdZdZdZdZdZed„¦«Zed„¦«Z dS)Ú ParameterÚ parameterFúus-asciicó.—|jr |djndSræ)Ú sectionedÚnumberr1s rÚsection_numberzParameter.section_number¢s€ð"&¤Ð6ˆt�AŒwŒ~ˆ~°QÐ6rcó¨—|D]N}|jdkr |jcS|jdkr-|D]*}|jdkr|D]}|jdkr |jcccSŒŒ+ŒOdS)Nrr�r“r')r\rœr›s rÚ param_valuezParameter.param_value¨s €ðð <ð <ˆEØÔ 7Ò*Ð*ØÔ+Ð+Ð+Ð+ØÔ ?Ò2Ð2Ø"ð<ð<�EØÔ'Ð+?Ò?Ð?Ø%*ð<ð<˜EØ$Ô/°7Ò:Ð:Ø',Ô';Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;ð ;øøàˆrrN) r7r`rar\rSÚextendedrŒrdrUrWrlrrrOrO›s\€€€€€à€JØ€IØ€HØ€Gà ð7ð7ñ„Xð7ð ð ð ñ„Xð ð ð rrOcó—eZdZdZdS)ÚInvalidParameterúinvalid-parameterNrvrlrrrZrZ·s€€€€€à$€J€J€JrrZcó(—eZdZdZed„¦«ZdS)Ú AttributeÚ attributecóV—|D]%}|j d¦«r |jcSŒ&dS)NÚattrtext)r\Úendswithrr›s rrœzAttribute.stripped_valueÀsG€àð #ð #ˆEØÔ×(Ò(¨Ñ4Ô4ð #Ø”{Ð"Ð"Ð"ð #ð #ð #rN©r7r`rar\rdrœrlrrr]r]¼s2€€€€€à€Jà ð#ð#ñ„Xð#ð#ð#rr]có—eZdZdZdZdS)ÚSectionÚsectionN)r7r`rar\rTrlrrrdrdÆs€€€€€à€JØ €F€F€Frrdcó(—eZdZdZed„¦«ZdS)ÚValuercóˆ—|d}|jdkr|d}|j d¦«r|jS|jS)Nrr�rç)r�r^zextended-attribute)r\rarœrr›s rrœzValue.stripped_valueÐsS€à�Q”ˆØ Ô ˜vÒ %Ð %ؘ”GˆEØ Ô × $Ò $ØDñ Fô Fð (àÔ'Ð 'ØŒzÐrNrbrlrrrgrgÌs2€€€€€à€Jà ððñ„Xðððrrgcó2—eZdZdZdZed„¦«Zd„ZdS)ÚMimeParametersúmime-parametersFc#óšK—i}|D]y}|j d¦«sŒ|djdkrŒ/|dj ¦«}||vrg||<|| |j|f¦«Œz| ¦«D�]4\}}t|td¦«¬¦«}|dd}|j }|j sgt|¦«dkrT|dddkrB|ddj  tjd¦«¦«|dd…}g}d}|D�]j\} } | |kr`| j s-| j  tjd¦«¦«Œ@| j  tjd¦«¦«|dz }| j} | j rÖ t j | ¦«} |  |d ¦«} n-#t(t*f$r|  d d ¦«} YnwxYwt-j| ¦«r+| j  tj¦«¦«n1#t*$r$t j | d ¬ ¦«} YnwxYw| | ¦«�Œld  |¦«} || fV—�Œ6dS)NrPrr^)Úkeyrçz.duplicate parameter name; duplicate(s) ignoredz+duplicate parameter name; duplicate ignoredz(inconsistent RFC2231 parameter numberingÚsurrogateescaperQzlatin-1)Úencodingr')r\rarÚstripr—rUÚitemsÚsortedrrŒrXrèr!rÚInvalidHeaderDefectrWÚurllibÚparseÚunquote_to_bytesÚdecodeÚ LookupErrorÚUnicodeEncodeErrorrÚ_has_surrogatesÚUndecodableBytesDefectÚunquoter0) r"ÚparamsrKÚnameÚpartsÚ first_paramrŒÚ value_partsÚirUÚparamrs rr}zMimeParameters.paramsàsFèè€ðˆØð ?ð ?ˆEØÔ#×,Ò,¨[Ñ9Ô9ð ØØ�QŒxÔ" kÒ1Ð1ØØ˜”8”>×'Ò'Ñ)Ô)ˆDؘ6Ð!Ð!Ø!��t‘ Ø �4ŒL× Ò  Ô!5°uÐ =Ñ >Ô >Ð >Ð >Ø!Ÿ<š<™>œ>ð3 ñ3 ‰KˆD�%ݘ5¥j°¡m¤mÐ4Ñ4Ô4ˆEØ œ( 1œ+ˆKØ!Ô)ˆGðÔ'ð &­C°©J¬J¸ªN¨Nؘ”8˜A”; !Ò#Ð#ؘ!”H˜Q”KÔ'×.Ò.­vÔ/IØHñ0Jô0JñKôKðKà! " 1 "œI�EðˆK؈AØ).ð! *ñ! *Ñ%� Ø! QÒ&Ð&ð!œ>ðIØœ ×,Ò,­VÔ-GØIñ.Kô.KñLôLðLà àœ ×,Ò,­VÔ-GØFñ.Hô.HñIôIðIà�Q‘�ØÔ)�Ø”>ðRðRÝ &¤ × =Ò =¸eÑ DÔ D˜ðPØ$)§L¢L°Ð:KÑ$LÔ$L˜E˜EøÝ +Õ-?Ð@ðPðPðPð %*§L¢L°Ð=NÑ$OÔ$O˜E˜E˜Eð Pøøøõ !Ô0°Ñ7Ô7ðRØ!œM×0Ò0µÔ1NÑ1PÔ1PÑQÔQÐQøøõ.ðPðPðPõ!'¤ × 4Ò 4°UÀYÐ 4Ñ OÔ O˜˜˜ð Pøøøð ×"Ò" 5Ñ)Ô)Ð)Ñ)Ø—G’G˜KÑ(Ô(ˆEؘ�+Ð Ð Ð Ñ ðg3 ð3 s$ÇI&Ç"G9Ç9'H#È"H#É&+JÊJc óø—g}|jD]S\}}|r7| d |t|¦«¦«¦«Œ>| |¦«ŒTd |¦«}|rd|zndS)Nú{}={}z; rkr')r}r—r6rr0)r"r}r~rs rr2zMimeParameters.__str__&sˆ€ØˆØœ;ð $ð $‰KˆD�%Øð $Ø— ’ ˜gŸnšn¨Tµ<ÀÑ3FÔ3FÑGÔGÑHÔHÐHÐHà— ’ ˜dÑ#Ô#Ð#Ð#Ø—’˜6Ñ"Ô"ˆØ%Ð-ˆs�V‰|ˆ|¨2Ð-rN)r7r`rar\rbrdr}r2rlrrrjrjÛsJ€€€€€à"€JØ€Oà ðCðCñ„XðCðJ.ð.ð.ð.ð.rrjcó(—eZdZdZed„¦«ZdS)ÚParameterizedHeaderValueFcóR—t|¦«D]}|jdkr |jcSŒiS)Nrk)Úreversedr\r}r›s rr}zParameterizedHeaderValue.params7s>€å˜d‘^”^ð $ð $ˆEØÔÐ#4Ò4Ð4Ø”|Ð#Ð#Ð#ð5àˆ rN)r7r`rarbrdr}rlrrr‡r‡1s4€€€€€ð€Oà ððñ„Xðððrr‡có—eZdZdZdZdZdZdS)Ú ContentTypez content-typeFÚtextÚplainN)r7r`rar\rEÚmaintypeÚsubtyperlrrr‹r‹?s"€€€€€Ø€JØ€MØ€HØ€G€G€Grr‹có—eZdZdZdZdZdS)ÚContentDispositionzcontent-dispositionFN)r7r`rar\rEÚcontent_dispositionrlrrr‘r‘Fs €€€€€Ø&€JØ€MØÐÐÐrr‘có—eZdZdZdZdZdS)ÚContentTransferEncodingzcontent-transfer-encodingFÚ7bitN)r7r`rar\rEr‹rlrrr”r”Ls€€€€€Ø,€JØ€MØ €C€C€Crr”có—eZdZdZdZdS)Ú HeaderLabelz header-labelFNrrlrrr—r—Rs€€€€€Ø€JØ€M€M€Mrr—có—eZdZdZdZd„ZdS)ÚMsgIDzmsg-idFcó0—t|¦«|jzSr)rÚlineseprPs rrQz MsgID.fold[s€å�4‰yŒy˜6œ>Ñ)Ð)rN)r7r`rar\rErQrlrrr™r™Ws-€€€€€Ø€JØ€Mð*ð*ð*ð*ð*rr™có—eZdZdZdS)Ú MessageIDz message-idNrvrlrrr�r�`s€€€€€Ø€J€J€Jrr�có—eZdZdZdS)ÚInvalidMessageIDzinvalid-message-idNrvrlrrrŸrŸds€€€€€Ø%€J€J€JrrŸcó—eZdZdZdS)ÚHeaderÚheaderNrvrlrrr¡r¡hrzrr¡có~‡—eZdZdZdZdZˆfd„Zˆfd„Zd„Ze d„¦«Z d ˆfd„ Z d„Z e d „¦«Z d „ZˆxZS) ÚTerminalTcóh•—t¦« ||¦«}||_g|_|Sr)rÚ__new__r\r!)Úclsrr\r"r%s €rr¦zTerminal.__new__vs-ø€Ý‰wŒw�Š˜s EÑ*Ô*ˆØ$ˆŒØˆŒ ؈ rc󀕗d |jjt¦« ¦«¦«Sr4r5r9s €rr8zTerminal.__repr__|s,ø€Ø�Š˜tœ~Ô6½¹¼×8HÒ8HÑ8JÔ8JÑKÔKÐKrcóN—t|jjdz|jz¦«dS)Nú/)rUr%r7r\r1s rrXzTerminal.pprints'€Ý ˆdŒnÔ%¨Ñ+¨d¬oÑ=Ñ>Ô>Ð>Ð>Ð>rcó*—t|j¦«Sr)Úlistr!r1s rr>zTerminal.all_defects‚s€å�D”LÑ!Ô!Ð!rr'c óÔ•—d ||jj|jt ¦« ¦«|jsdnd |j¦«¦«gS)Nz {}{}/{}({}){}r'z {})r6r%r7r\rr8r!)r"rTr%s €rrZz Terminal._pp†s_ø€Ø×&Ò&Ø Ø ŒNÔ #Ø ŒOÝ ‰GŒG× Ò Ñ Ô Ø”lÐ BˆBˆB¨¯ ª °T´\Ñ(BÔ(Bñ ôðð rcó—dSrrlr1s rÚpop_trailing_wszTerminal.pop_trailing_ws�rrcó—gSrrlr1s rrJzTerminal.comments“s€àˆ rcó.—t|¦«|jfSr)rr\r1s rÚ__getnewargs__zTerminal.__getnewargs__—s€Ý�4‰yŒy˜$œ/Ð*Ð*rr_)r7r`rarErcrbr¦r8rXrdr>rZr¯rJr²rerfs@rr¤r¤psçø€€€€€à€MØÐØ€Oðððððð LðLðLðLðLð?ð?ð?ðð"ð"ñ„Xð"ððððððððððððñ„Xðð+ð+ð+ð+ð+ð+ð+rr¤có*—eZdZed„¦«Zd„ZdS)ÚWhiteSpaceTerminalcó—dSrjrlr1s rrzWhiteSpaceTerminal.value�rmrcó—dS)NTrlr1s rrBz!WhiteSpaceTerminal.startswith_fws¡s€ØˆtrN©r7r`rardrrBrlrrr´r´›s<€€€€€à ððñ„Xððððððrr´có*—eZdZed„¦«Zd„ZdS)Ú ValueTerminalcó—|Srrlr1s rrzValueTerminal.value§s€àˆ rcó—dS)NFrlr1s rrBzValueTerminal.startswith_fws«s€ØˆurNr·rlrrr¹r¹¥s<€€€€€à ððñ„Xððððððrr¹có*—eZdZed„¦«Zd„ZdS)ÚEWWhiteSpaceTerminalcó—dSrrlr1s rrzEWWhiteSpaceTerminal.value±s€àˆrrcó—dSrrlr1s rr2zEWWhiteSpaceTerminal.__str__µs€ØˆrrN)r7r`rardrr2rlrrr½r½¯s<€€€€€à ððñ„Xððððððrr½có—eZdZdZdS)Ú_InvalidEwErrorz1Invalid encoded word found while parsing headers.N)r7r`raÚ__doc__rlrrrÁrÁ¹s€€€€€Ø;Ð;Ð;Ð;rrÁr=ú,zlist-separatorFr+zroute-component-markerz([{}]+)r'z[^{}]+z[\x00-\x20\x7F]có—t|¦«}|r,|j tj|¦«¦«t j|¦«r.|j tjd¦«¦«dSdS)z@If input token contains ASCII non-printables, register a defect.z*Non-ASCII characters found in header tokenN)Ú_non_printable_finderr!r—rÚNonPrintableDefectrrzr{)ÚxtextÚnon_printabless rÚ_validate_xtextrÉæsŽ€õ+¨5Ñ1Ô1€NØðHØ Œ ×Ò�VÔ6°~ÑFÔFÑGÔGÐGÝ Ô˜UÑ#Ô#ð;Ø Œ ×Ò�VÔ:Ø 8ñ:ô:ñ ;ô ;ð ;ð ;ð ;ð;ð;rcól—t|d¦«^}}g}d}d}tt|¦«¦«D]D}||dkr |rd}d}nd}Œ|rd}n |||vrn!| ||¦«ŒE|dz}d |¦«d ||d…g|z¦«|fS)akScan printables/quoted-pairs until endchars and return unquoted ptext. This function turns a run of qcontent, ccontent-without-comments, or dtext-with-quoted-printables into a single string by unquoting any quoted printables. It returns the string, the remaining value, and a flag that is True iff there were any quoted printables decoded. rçFrTr'N)Ú _wsp_splitterÚrangerèr—r0)rÚendcharsÚfragmentÚ remainderÚvcharsÚescapeÚhad_qpÚposs rÚ_get_ptext_to_endcharsrÔðsç€õ)¨°Ñ2Ô2ЀHˆyØ €FØ €FØ €FÝ•S˜‘]”]Ñ#Ô#ððˆØ �CŒ=˜DÒ Ð Øð Ø�Ø��à�ØØ ð ØˆFˆFØ �cŒ]˜hÐ &Ð &Ø ˆEØ� Š �h˜s”mÑ$Ô$Ð$Ð$à�A‰gˆØ �7Š7�6‰?Œ?˜BŸGšG X¨c¨d¨d¤^Ð$4°yÑ$@ÑAÔAÀ6Ð IÐIrcóœ—| ¦«}t|dt|¦«t|¦«z …d¦«}||fS)zãFWS = 1*WSP This isn't the RFC definition. We're using fws to represent tokens where folding can be done, but when we are parsing the *un*folding has already been done so we don't need to watch out for CRLF. NÚfws)r)r´rè)rÚnewvaluerÖs rÚget_fwsrØsF€ð�|Š|‰~Œ~€HÝ ˜UÐ#<¥C¨¡J¤J­s°8©}¬}Ñ$<Ð#<Ô=¸uÑ EÔ E€CØ �ˆ=ÐrÚvtextcóЗt¦«}| d¦«s'tjd |¦«¦«‚|dd… dd¦«^}}||dd…kr'tjd |¦«¦«‚d |¦«}t|¦«dkrW|dtvrH|dtvr9|  d ¦«dkr | dd¦«^}}|dz|z}t| ¦«¦«dkr,|j   tj d ¦«¦«||_ d |¦«} tjd|zdz¦«\}}} } n<#t t"f$r(t%d  |j ¦«¦«‚wxYw||_| |_|j  | ¦«|r”|dt,vr(t/|¦«\} }|  | ¦«Œ9t1|d¦«^} }t3| |¦«} t5| ¦«|  | ¦«d |¦«}|°”|r;|dt,vr,|j   tj d ¦«¦«||fS) zE encoded-word = "=?" charset "?" encoding "?" encoded-text "?=" ú=?z"expected encoded word but found {}rßNz?=rçr'rú?zwhitespace inside encoded wordz!encoded word format invalid: '{}'z.missing trailing whitespace after encoded-word)r‰Ú startswithrÚHeaderParseErrorr6rr0rèrÚcountr!r—rsr‹Ú_ewrwÚ ValueErrorÚKeyErrorrÁrŒr�rIÚWSPrØrËr¹rÉ)rÚ terminal_typeÚewrBrÏÚremstrÚrestrŒrŒr�r!rKÚcharsrÙs rÚget_encoded_wordrés€õ ‰Œ€BØ × Ò ˜DÑ !Ô !ð@ÝÔ%Ø 0× 7Ò 7¸Ñ >Ô >ñ@ô@ð @à˜A˜B˜B”i—o’o d¨AÑ.Ô.€O€Cˆ)Ø ˆe�A�B�BŒiÒÐÝÔ%Ø 0× 7Ò 7¸Ñ >Ô >ñ@ô@ð @à �WŠW�YÑ Ô €FÝ ˆF‰ Œ �aŠˆØˆqŒ •YÐÐØˆqŒ •YÐÐØ � Š �#‰Œ˜ÒÐà!Ÿ<š<¨¨aÑ0Ô0ЈˆyØ�D‰j˜4ÑˆÝ ˆ3�9Š9‰;Œ;ÑÔ˜!ÒÐØ Œ ×Ò�&Ô4Ø ,ñ.ô.ñ /ô /ð /à €B„FØ �GŠG�IÑ Ô €Eð@Ý'*¤z°$¸±*¸tÑ2CÑ'DÔ'DÑ$ˆˆg�t˜W˜WøÝ �Ð !ð@ð@ð@ÝØ /× 6Ò 6°r´vÑ >Ô >ñ@ô@ð @ð@øøøð€B„JØ€B„GØ„J×Ò�gÑÔÐØ ð "Ø �Œ7•cˆ>ˆ>Ý! $™-œ-‰KˆE�4Ø �IŠI�eÑ Ô Ð Ø Ý)¨$°Ñ2Ô2Ј� ݘe ]Ñ3Ô3ˆÝ˜ÑÔÐØ � Š �%ÑÔÐØ�wŠw�yÑ!Ô!ˆð ð "ð ð?��q”¥Ð$Ð$Ø Œ ×Ò�&Ô4Ø <ñ>ô>ñ ?ô ?ð ?à ˆuˆ9Ðs Æ F-Æ-9G&có¦—t¦«}|�r¿|dtvr(t|¦«\}}| |¦«Œ:d}| d¦«rà t |d¦«\}}d}t |¦«dkr?|djdkr.|j tj d¦«¦«d}|r=t |¦«d kr*|d jd krt|dd¦«|d<| |¦«�Œ#t$rd}Yntj $rYnwxYwt|d ¦«^}}|r1t |¦«r| d¦«^}}t%|d¦«}t'|¦«| |¦«d  |¦«}|�°¿|S) aOunstructured = (*([FWS] vchar) *WSP) / obs-unstruct obs-unstruct = *((*LF *CR *(obs-utext) *LF *CR)) / FWS) obs-utext = %d0 / obs-NO-WS-CTL / LF / CR obs-NO-WS-CTL is control characters except WSP/CR/LF. So, basically, we have printable runs, plus control characters or nulls in the obsolete syntax, separated by whitespace. Since RFC 2047 uses the obsolete syntax in its specification, but requires whitespace on either side of the encoded words, I can see no reason to need to separate the non-printable-non-whitespace from the printable runs if they occur, so we parse this into xtext tokens separated by WSP tokens. Because an 'unstructured' value must by definition constitute the entire value, this 'get' routine does not return a remaining value, only the parsed TokenList. rTrÛÚutextrërÖz&missing whitespace before encoded wordFrçéþÿÿÿrŠr')rtrãrØr—rÝrérèr\r!rrsr½rÁrÞrËÚrfc2047_matcherÚsearchÚ partitionr¹rÉr0)rrurKÚvalid_ewÚhave_wsrBrÏrÙs rÚget_unstructuredròKs$€õ.)Ñ*Ô*€LØ ñ(#Ø �Œ8•sˆ?ˆ?Ý" 5™>œ>‰LˆE�5Ø × Ò  Ñ &Ô &Ð &Ø ØˆØ × Ò ˜DÑ !Ô !ð ð Ý/°°wÑ?Ô?‘ ��uð�Ý�|Ñ$Ô$ qÒ(Ð(Ø# BÔ'Ô2°eÒ;Ð;Ø$Ô,×3Ò3µFÔ4NØDñ5Fô5FñGôGðGà"'˜Øð5�s <Ñ0Ô0°1Ò4Ð4Ø# BÔ'Ô2°nÒDÐDÝ+?Ø(¨Ô,¨eñ,5ô,5˜  RÑ(à×#Ò# EÑ*Ô*Ð*Ùøõ%#ð !ð !ð !Ø ���ÝÔ*ð ð ð ð�ð øøøõ"(¨¨qÑ1Ô1ˆˆˆið ð 4�×.Ò.¨sÑ3Ô3ð 4Ø#Ÿošo¨dÑ3Ô3ˆOˆC�)ݘc 7Ñ+Ô+ˆÝ˜ÑÔÐØ×Ò˜EÑ"Ô"Ð"Ø—’˜ Ñ"Ô"ˆðQ ñ(#ðR ÐsÁ!DÄ D=Ä,D=Ä<D=cóp—t|d¦«\}}}t|d¦«}t|¦«||fS)actext = This is not the RFC ctext, since we are handling nested comments in comment and unquoting quoted-pairs here. We allow anything except the '()' characters, but if we find any ASCII other than the RFC defined printable ASCII, a NonPrintableDefect is added to the token's defects list. Since quoted pairs are converted to their unquoted values, what is returned is a 'ptext' token. In this case it is a WhiteSpaceTerminal, so it's value is ' '. z()rH)rÔr´rÉ©rrHÚ_s rÚ get_qp_ctextröŽs@€õ-¨U°DÑ9Ô9�O€Eˆ5�!Ý ˜u gÑ .Ô .€EÝ�EÑÔÐØ �%ˆ<Ðrcóp—t|d¦«\}}}t|d¦«}t|¦«||fS)aoqcontent = qtext / quoted-pair We allow anything except the DQUOTE character, but if we find any ASCII other than the RFC defined printable ASCII, a NonPrintableDefect is added to the token's defects list. Any quoted pairs are converted to their unquoted values, so what is returned is a 'ptext' token. In this case it is a ValueTerminal. rrH)rÔr¹rÉrôs rÚ get_qcontentrøŸs@€õ-¨U°CÑ8Ô8�O€Eˆ5�!Ý ˜% Ñ )Ô )€EÝ�EÑÔÐØ �%ˆ<Ðrcó—t|¦«}|s'tjd |¦«¦«‚| ¦«}|t |¦«d…}t |d¦«}t|¦«||fS)z®atext = We allow any non-ATOM_ENDS in atext, but add an InvalidATextDefect to the token's defects list if we find non-atext characters. zexpected atext but found '{}'NÚatext)Ú_non_atom_end_matcherrrÞr6rÅrèr¹rÉ)rÚmrús rÚ get_atextrý®s‡€õ ˜eÑ$Ô$€AØ ð;ÝÔ%Ø +× 2Ò 2°5Ñ 9Ô 9ñ;ô;ð ;à �GŠG‰IŒI€EØ •#�e‘*”*�+�+Ô €EÝ ˜% Ñ )Ô )€EÝ�EÑÔÐØ �%ˆ<Ðrcóâ—|ddkr'tjd |¦«¦«‚t¦«}|dd…}|r3|ddkr't |¦«\}}| |¦«|�r/|ddk�r"|dt vrt|¦«\}}nÜ|dd…dkr¼d} t|¦«\}}|j  tj d ¦«¦«d }n'#tj$rt |¦«\}}YnwxYw|rNt|¦«dkr;|d j d kr*|d j dkrt|d d ¦«|d <nt |¦«\}}| |¦«|r |ddk�°"|s0|j  tj d¦«¦«||fS||dd…fS)zíbare-quoted-string = DQUOTE *([FWS] qcontent) [FWS] DQUOTE A quoted-string without the leading or trailing white space. Its value is the text between the quote marks, with whitespace preserved and quoted pairs decoded. rrzexpected '"' but found '{}'rçNrßrÛFz!encoded word inside quoted stringTrërÖrìrŠz"end of header inside quoted string)rrÞr6ržrør—rãrØrér!rsrèr\r½)rÚbare_quoted_stringrKrðs rÚget_bare_quoted_stringr¾sE€ð ˆQ„x�3‚€ÝÔ%Ø *× 1Ò 1°%Ñ 8Ô 8ñ:ô:ð :å)Ñ+Ô+ÐØ �!�"�"ŒI€EØ ð)��q”˜S’�Ý# EÑ*Ô*‰ ˆˆuØ×!Ò! %Ñ(Ô(Ð(Ø ñ)�E˜!”H ’O‘OØ �Œ8•sˆ?ˆ?Ý" 5™>œ>‰LˆE�5�5Ø �2�A�2ŒY˜$Ò Ð ØˆHð 3Ý/°Ñ6Ô6‘ ��uØ"Ô*×1Ò1µ&Ô2LØ7ñ39ô39ñ:ô:ð:à��øÝÔ*ð 3ð 3ð 3Ý+¨EÑ2Ô2‘ ��u�u�uð 3øøøðð 7�CÐ 2Ñ3Ô3°aÒ7Ð7Ø& rÔ*Ô5¸Ò>Ð>Ø*¨2Ô.Ô9¸^ÒKÐKÝ-AØ*¨2Ô.°ñ.7ô.7Ð& rÑ*øõ(¨Ñ.Ô.‰LˆE�5Ø×!Ò! %Ñ(Ô(Ð(ð+ ð)�E˜!”H ’O‘Oð, ð)ØÔ"×)Ò)­&Ô*DØ 0ñ+2ô+2ñ 3ô 3ð 3à! 5Ð(Ð(Ø ˜u Q R RœyÐ (Ð(sÃADÄ!D)Ä(D)có —|r3|ddkr'tjd |¦«¦«‚t¦«}|dd…}|r‚|ddkrv|dtvrt |¦«\}}n1|ddkrt |¦«\}}nt|¦«\}}| |¦«|r |ddk°v|s0|j  tj d¦«¦«||fS||dd…fS)z¬comment = "(" *([FWS] ccontent) [FWS] ")" ccontent = ctext / quoted-pair / comment We handle nested comments here, and quoted-pair in our qp-ctext routine. rrzexpected '(' but found '{}'rçNr©zend of header inside comment) rrÞr6r¥rãrØÚ get_commentrör—r!rs)rrprKs rrrés2€ð  ð9��q”˜S’�ÝÔ%Ø )× 0Ò 0°Ñ 7Ô 7ñ9ô9ð 9å‰iŒi€GØ �!�"�"ŒI€EØ ð�E˜!”H ’O�OØ �Œ8•sˆ?ˆ?Ý" 5™>œ>‰LˆE�5�5Ø �1ŒX˜Š_ˆ_Ý& uÑ-Ô-‰LˆE�5�5å'¨Ñ.Ô.‰LˆE�5Ø�Š�uÑÔÐð ð�E˜!”H ’O�Oð ðØŒ×Ò�vÔ9Ø *ñ ,ô ,ñ -ô -ð -à˜ˆ~ÐØ �E˜!˜"˜"”IÐ Ðrcóü—t¦«}|ri|dtvrZ|dtvrt|¦«\}}nt |¦«\}}| |¦«|r|dtv°Z||fS)z,CFWS = (1*([FWS] comment) [FWS]) / FWS r)r€Ú CFWS_LEADERrãrØrr—)rr�rKs rÚget_cfwsrsˆ€õ ‰:Œ:€DØ ð�E˜!”H¥ Ð+Ð+Ø �Œ8•sˆ?ˆ?Ý" 5™>œ>‰LˆE�5�5å& uÑ-Ô-‰LˆE�5Ø � Š �EÑÔÐð ð�E˜!”H¥ Ð+Ð+ð �ˆ;ÐrcóT—t¦«}|r6|dtvr't|¦«\}}| |¦«t |¦«\}}| |¦«|r6|dtvr't|¦«\}}| |¦«||fS)zÙquoted-string = [CFWS] [CFWS] 'bare-quoted-string' is an intermediate class defined by this parser and not by the RFC grammar. It is the quoted string without any attached CFWS. r)r�rrr—r)rÚ quoted_stringrKs rÚget_quoted_stringrs¯€õ!‘N”N€MØ ð$��q”�[Ð(Ð(Ý ‘”‰ ˆˆuØ×Ò˜UÑ#Ô#Ð#Ý)¨%Ñ0Ô0�L€Eˆ5Ø×Ò˜ÑÔÐØ ð$��q”�[Ð(Ð(Ý ‘”‰ ˆˆuØ×Ò˜UÑ#Ô#Ð#Ø ˜%Ð Ðrcód—t¦«}|r6|dtvr't|¦«\}}| |¦«|r6|dtvr't jd |¦«¦«‚| d¦«r; t|¦«\}}n9#t j$rt|¦«\}}YnwxYwt|¦«\}}| |¦«|r6|dtvr't|¦«\}}| |¦«||fS)zPatom = [CFWS] 1*atext [CFWS] An atom could be an rfc2047 encoded word. rzexpected atom but found '{}'rÛ) rƒrrr—Ú ATOM_ENDSrrÞr6rÝrérý)rr„rKs rÚget_atomr !sI€õ ‰6Œ6€DØ ð��q”�[Ð(Ð(Ý ‘”‰ ˆˆuØ � Š �EÑÔÐØ ð:��q”�YÐ&Ð&ÝÔ%Ø *× 1Ò 1°%Ñ 8Ô 8ñ:ô:ð :à ×Ò˜ÑÔð(ð ,Ý+¨EÑ2Ô2‰LˆE�5�5øÝÔ&ð ,ð ,ð ,õ% UÑ+Ô+‰LˆE�5�5�5ð ,øøøõ ! Ñ'Ô'‰ ˆˆu؇K‚K�ÑÔÐØ ð��q”�[Ð(Ð(Ý ‘”‰ ˆˆuØ � Š �EÑÔÐØ �ˆ;ÐsÂB(Â(!C à C cóþ—t¦«}|r|dtvr'tjd |¦«¦«‚|ry|dtvrjt |¦«\}}| |¦«|r0|ddkr$| t¦«|dd…}|r|dtv°j|dtur*tjd d|z¦«¦«‚||fS)z( dot-text = 1*atext *("." 1*atext) rz8expected atom at a start of dot-atom-text but found '{}'r rçNrëz4expected atom at end of dot-atom-text but found '{}')rr rrÞr6rýr—r>)rÚ dot_atom_textrKs rÚget_dot_atom_textr<s€õ ‘M”M€MØ ð:�E˜!”H¥ Ð)Ð)ÝÔ%ð'+ß+1ª6°%©=¬=ñ:ô:ð :à ð�E˜!”H¥IÐ-Ð-Ý  Ñ'Ô'‰ ˆˆuØ×Ò˜UÑ#Ô#Ð#Ø ð �U˜1”X ’_�_Ø × Ò ¥Ñ %Ô %Ð %ؘ!˜"˜"”IˆEð ð�E˜!”H¥IÐ-Ð-ð �RÔ�CÐÐÝÔ%ð'ß#šV C¨¡IÑ.Ô.ñ0ô0ð 0à ˜%Ð Ðrcóð—t¦«}|dtvr't|¦«\}}| |¦«| d¦«r; t |¦«\}}n9#t j$rt|¦«\}}YnwxYwt|¦«\}}| |¦«|r6|dtvr't|¦«\}}| |¦«||fS)z† dot-atom = [CFWS] dot-atom-text [CFWS] Any place we can have a dot atom, we could instead have an rfc2047 encoded word. rrÛ) rrrr—rÝrérrÞr)rÚdot_atomrKs rÚ get_dot_atomrOs€õ ‰yŒy€HØ ˆQ„x•;ÐÐÝ ‘”‰ ˆˆuØ�Š˜ÑÔÐØ ×Ò˜ÑÔð0ð 4Ý+¨EÑ2Ô2‰LˆE�5�5øÝÔ&ð 4ð 4ð 4õ-¨UÑ3Ô3‰LˆE�5�5�5ð 4øøøõ )¨Ñ/Ô/‰ ˆˆuØ ‡O‚O�EÑÔÐØ ð��q”�[Ð(Ð(Ý ‘”‰ ˆˆuØ�Š˜ÑÔÐØ �Uˆ?ÐsÁA.Á.!BÂBcó`—|dtvrt|¦«\}}nd}|stjd¦«‚|ddkrt |¦«\}}nH|dt vr'tjd |¦«¦«‚t|¦«\}}|�|g|dd…<||fS)aˆword = atom / quoted-string Either atom or quoted-string may start with CFWS. We have to peel off this CFWS first to determine which type of word to parse. Afterward we splice the leading CFWS, if any, into the parsed sub-token. If neither an atom or a quoted-string is found before the next special, a HeaderParseError is raised. The token returned is either an Atom or a QuotedString, as appropriate. This means the 'word' level of the formal grammar is not represented in the parse tree; this is because having that extra layer when manipulating the parse tree is more confusing than it is helpful. rNz5Expected 'atom' or 'quoted-string' but found nothing.rz1Expected 'atom' or 'quoted-string' but found '{}')rrrrÞrÚSPECIALSr6r )rÚleaderrKs rÚget_wordrhsÔ€ð  ˆQ„x•;ÐÐÝ  ™œ‰ ˆ��àˆØ ðEÝÔ%Ø CñEôEð Eà ˆQ„x�‚}€}Ý(¨Ñ/Ô/‰ ˆˆuˆuØ ˆqŒ•XÐ Ð ÝÔ%ð'7ß7=²v¸e±}´}ñFôFð Fõ  ‘”‰ ˆˆuØ ÐØ�Hˆˆbˆqˆb‰ Ø �%ˆ<Ðrcó—t¦«} t|¦«\}}| |¦«nA#tj$r/|j tjd¦«¦«YnwxYw|�r |dtvrû|ddkrQ| t¦«|j tj d¦«¦«|dd…}n� t|¦«\}}nd#tj$rR|dtvr?t|¦«\}}|j tj d¦«¦«n‚YnwxYw| |¦«|r|dtv°û||fS)a÷ phrase = 1*word / obs-phrase obs-phrase = word *(word / "." / CFWS) This means a phrase can be a sequence of words, periods, and CFWS in any order as long as it starts with at least one word. If anything other than words is detected, an ObsoleteHeaderDefect is added to the token's defect list. We also accept a phrase that starts with CFWS followed by a dot; this is registered as an InvalidHeaderDefect, since it is not supported by even the obsolete grammar. zphrase does not start with wordrr zperiod in 'phrase'rçNzcomment found without atom) rxrr—rrÞr!rsÚ PHRASE_ENDSr>ÚObsoleteHeaderDefectrr)rryrKs rÚ get_phraserŠsÆ€õ‰XŒX€Fð0Ý ‘”‰ ˆˆuØ� Š �eÑÔÐÐøÝ Ô "ð0ð0ð0ØŒ×Ò�fÔ8Ø -ñ/ô/ñ 0ô 0ð 0ð 0ð 0ð0øøøð ñ!�E˜!”H¥KÐ/Ð/Ø �Œ8�SŠ=ˆ=Ø �MŠM�#Ñ Ô Ð Ø ŒN× !Ò !¥&Ô"=Ø$ñ#&ô#&ñ 'ô 'ð 'à˜!˜"˜"”IˆEˆEð Ý'¨™œ‘ ��u�uøÝÔ*ð ð ð Ø˜”8�{Ð*Ð*Ý#+¨E¡?¤?‘L�E˜5Ø”N×)Ò)­&Ô*EØ4ñ+6ô+6ñ7ô7ð7ð7ðð7ð7ð øøøð �MŠM˜%Ñ Ô Ð ð! ð!�E˜!”H¥KÐ/Ð/ð" �5ˆ=Ðs"�'8¸;A6Á5A6Ã)C<ÃÔ >ñ@ô@ð @ð Ý# EÑ*Ô*‰ ˆˆuˆuøÝ Ô "ð ð ð ð Ý# E™?œ?‰LˆE�5�5øÝÔ&ð ð ð Ø�QŒx˜4ÒРE¨!¤Hµ Ð$;Ð$;ØÝ‘K”KˆEˆEˆEð øøøøøð øøøðÐØ�Hˆˆbˆqˆb‰ Ø×Ò�eÑÔÐØ ð'�%˜”(˜D’.�. E¨!¤HµKÐ$?Ð$?Ý 2µ3°z±?´?ÀUÑ3JÑ KÔ Kш˜Ø Ô $Ð(@Ò @Ð @Ø Ô × %Ò %¥fÔ&@ØNñ'Pô'Pñ Qô Qð Qð Qð Ô × %Ò %¥fÔ&AØ>ñ'@ô'@ñ Aô Að Aà&ˆ �1‰ ð>ØÔ×Ò Ñ(Ô(Ð(Ð(øÝ ð>ð>ð>ØÔ×!Ò!¥&Ô"@Ø;ñ#=ô#=ñ >ô >ð >ð >ð >ð>øøøð �uÐ ÐsHÁA/Á/CÁ?BÂCÂ9Cà Cà CÃCÃCÆF:Æ:6G3Ç2G3có—t¦«}d}|�r«|ddks|dtv�r�|ddkrU|r,|j t jd¦«¦«| t ¦«d}|dd…}Œ€|ddkrb| t|dd ¦«¦«|dd…}|j t jd ¦«¦«d}Œî|r=|d jd kr,|j t jd ¦«¦« t|¦«\}}d}n7#tj $r%|dtvr‚t|¦«\}}YnwxYw| |¦«|r|ddk�°|dtv�°�|djd ks"|djdkr=|djd kr,|j t jd¦«¦«|d jd ks"|d jdkr=|djd kr,|j t jd¦«¦«|jrd|_||fS)z' obs-local-part = word *("." word) Frrr zinvalid repeated '.'TrçNúmisplaced-specialz/'\' character outside of quoted-string/ccontentrër=zmissing '.' between wordsr�z!Invalid leading '.' in local partrìz"Invalid trailing '.' in local partr) r1rr!r—rrsr>r¹r\rrÞrr)rr Úlast_non_ws_was_dotrKs rrr×sõ€õ"‘^”^€NØÐØ ñ%�U˜1”X˜t’^�^ u¨Q¤xµ{Ð'BÑ'BØ �Œ8�sŠ?ˆ?Ø"ð -ØÔ&×-Ò-­fÔ.HØ*ñ/,ô/,ñ-ô-ð-à × !Ò !¥#Ñ &Ô &Ð &Ø"&Рؘ!˜"˜"”IˆEØ Ø �1ŒX�tŠ^ˆ^Ø × !Ò !¥-°°a´Ø0Cñ#Eô#Eñ Fô Fð Fà˜!˜"˜"”IˆEØ Ô "× )Ò )­&Ô*DØBñ+Dô+Dñ Eô Eð Eà"'Ð Ø Ø ð .˜n¨RÔ0Ô;¸uÒDÐDØ Ô "× )Ò )­&Ô*DØ+ñ+-ô+-ñ .ô .ð .ð +Ý# E™?œ?‰LˆE�5Ø"'Ð Ð øÝÔ&ð +ð +ð +Ø�QŒx�{Ð*Ð*ØÝ# E™?œ?‰LˆE�5�5�5ð +øøøð ×Ò˜eÑ$Ô$Ð$ð7 ð%�U˜1”X˜t’^‘^ u¨Q¤xµ{Ð'BÑ'Bð8 �qÔÔ$¨Ò-Ð-Ø ˜1Ô Ô (¨&Ò 0Ð 0Ø ˜1Ô Ô (¨%Ò /Ð /ØÔ×%Ò%¥fÔ&@Ø /ñ'1ô'1ñ 2ô 2ð 2à�rÔÔ%¨Ò.Ð.Ø ˜2Ô Ô )¨6Ò 1Ð 1Ø ˜2Ô Ô )¨5Ò 0Ð 0ØÔ×%Ò%¥fÔ&@Ø 0ñ'2ô'2ñ 3ô 3ð 3àÔð=Ø$<ˆÔ!Ø ˜5Ð Ð sÄ?EÅ1FÆFcóÌ—t|d¦«\}}}t|d¦«}|r,|j t jd¦«¦«t |¦«||fS)a dtext = / obs-dtext obs-dtext = obs-NO-WS-CTL / quoted-pair We allow anything except the excluded characters, but if we find any ASCII other than the RFC defined printable ASCII, a NonPrintableDefect is added to the token's defects list. Quoted pairs are converted to their unquoted values, so what is returned is a ptext token, in this case a ValueTerminal. If there were quoted-printables, an ObsoleteHeaderDefect is added to the returned token's defect list. z[]rHz(quoted printable found in domain-literal)rÔr¹r!r—rrrÉ)rrHrÒs rÚ get_dtextr&su€õ2°%¸Ñ>Ô>Ñ€Eˆ5�&Ý ˜% Ñ )Ô )€EØ ð9Ø Œ ×Ò�VÔ8Ø 6ñ8ô8ñ 9ô 9ð 9å�EÑÔÐØ �%ˆ<Ðrcó¢—|rdS| tjd¦«¦«| tdd¦«¦«dS)NFz"end of input inside domain-literalú]údomain-literal-endT)r—rrsr¹)rÚdomain_literals rÚ_check_for_early_dl_endr+s]€Ø ð؈uØ×Ò�&Ô4Ø,ñ.ô.ñ/ô/ð/à×Ò�-¨Ð-AÑBÔBÑCÔCÐCØ ˆ4rcóL—t¦«}|dtvr't|¦«\}}| |¦«|st jd¦«‚|ddkr't jd |¦«¦«‚|dd…}t||¦«r||fS| tdd¦«¦«|dtvr't|¦«\}}| |¦«t|¦«\}}| |¦«t||¦«r||fS|dtvr't|¦«\}}| |¦«t||¦«r||fS|ddkr't jd  |¦«¦«‚| tdd ¦«¦«|dd…}|r6|dtvr't|¦«\}}| |¦«||fS) zB domain-literal = [CFWS] "[" *([FWS] dtext) [FWS] "]" [CFWS] rzexpected domain-literalú[z6expected '[' at start of domain-literal but found '{}'rçNzdomain-literal-startr(z4expected ']' at end of domain-literal but found '{}'r)) rErrr—rrÞr6r+r¹rãrØr&)rr*rKs rÚget_domain_literalr."s6€õ#‘_”_€NØ ˆQ„x•;ÐÐÝ ‘”‰ ˆˆuØ×Ò˜eÑ$Ô$Ð$Ø ðAÝÔ%Ð&?Ñ@Ô@Ð@Ø ˆQ„x�3‚€ÝÔ%ð'!ß!'¢¨¡¤ñ0ô0ð 0à �!�"�"ŒI€Eݘu nÑ5Ô5ð%ؘuÐ$Ð$Ø×Ò�-¨Ð-CÑDÔDÑEÔEÐEØ ˆQ„x•3€€Ý˜u‘~”~‰ ˆˆuØ×Ò˜eÑ$Ô$Ð$ݘUÑ#Ô#�L€Eˆ5Ø×Ò˜%Ñ Ô Ð Ý˜u nÑ5Ô5ð%ؘuÐ$Ð$Ø ˆQ„x•3€€Ý˜u‘~”~‰ ˆˆuØ×Ò˜eÑ$Ô$Ð$ݘu nÑ5Ô5ð%ؘuÐ$Ð$Ø ˆQ„x�3‚€ÝÔ%ð'!ß!'¢¨¡¤ñ0ô0ð 0à×Ò�-¨Ð-AÑBÔBÑCÔCÐCØ �!�"�"ŒI€EØ ð%��q”�[Ð(Ð(Ý ‘”‰ ˆˆuØ×Ò˜eÑ$Ô$Ð$Ø ˜5Ð Ð rcó²—t¦«}d}|dtvrt|¦«\}}|s'tjd |¦«¦«‚|ddkr5t |¦«\}}|�|g|dd…<| |¦«||fS t|¦«\}}n'#tj$rt|¦«\}}YnwxYw|r |ddkrtjd¦«‚|�|g|dd…<| |¦«|r»|ddkr¯|j  tj d¦«¦«|dj d kr |d|dd…<|rc|ddkrW| t¦«t|d d…¦«\}}| |¦«|r |ddk°W||fS) z] domain = dot-atom / domain-literal / obs-domain obs-domain = atom *("." atom)) Nrzexpected domain but found '{}'r-r+zInvalid Domainr z(domain is not a dot-atom (contains CFWS)rrç)rrrrrÞr6r.r—rr r!rr\r>)rrðrrKs rÚ get_domainr0Is€õ ‰XŒX€FØ €FØ ˆQ„x•;ÐÐÝ  ™œ‰ ˆ�Ø ð<ÝÔ%Ø ,× 3Ò 3°EÑ :Ô :ñ<ô<ð <à ˆQ„x�3‚€Ý)¨%Ñ0Ô0‰ ˆˆuØ Ð Ø˜ˆE�"�1�"‰IØ� Š �eÑÔÐØ�uˆ}Ðð'Ý# EÑ*Ô*‰ ˆˆuˆuøÝ Ô "ð'ð'ð'Ý ‘”‰ ˆˆuˆuˆuð'øøøà ð8��q”˜S’�ÝÔ%Ð&6Ñ7Ô7Ð7Ø ÐØ�Hˆˆbˆqˆb‰ Ø ‡M‚M�%ÑÔÐØ ð!��q”˜S’�ØŒ×Ò�fÔ9Ø 6ñ8ô8ñ 9ô 9ð 9à �!Œ9Ô  :Ò -Ð -ؘqœ ˆF�1�1�1‰IØð !˜˜aœ Cš˜Ø �MŠM�#Ñ Ô Ð Ý# E¨!¨"¨"¤IÑ.Ô.‰LˆE�5Ø �MŠM˜%Ñ Ô Ð ðð !˜˜aœ Cš˜ð �5ˆ=ÐsÂB0Â0!CÃCcó”—t¦«}t|¦«\}}| |¦«|r |ddkr0|j t jd¦«¦«||fS| t dd¦«¦«t|dd…¦«\}}| |¦«||fS)z( addr-spec = local-part "@" domain rr+z#addr-spec local part with no domainúaddress-at-symbolrçN)r#r!r—r!rrsr¹r0)rrõrKs rÚ get_addr_specr3osÕ€õ‘ ” €IÝ! %Ñ(Ô(�L€Eˆ5Ø ×Ò�UÑÔÐØ ð �E˜!”H ’O�OØÔ× Ò ¥Ô!;Ø 1ñ"3ô"3ñ 4ô 4ð 4à˜%ÐÐØ ×Ò•] 3Ð(;Ñ<Ô<Ñ=Ô=Ð=ݘe A B BœiÑ(Ô(�L€Eˆ5Ø ×Ò�UÑÔÐØ �eÐ Ðrcóè—t¦«}|rŸ|ddks|dtvr„|dtvr(t|¦«\}}| |¦«n0|ddkr$| t¦«|dd…}|r|ddk°u|dtv°„|r |ddkr't jd |¦«¦«‚| t¦«t|dd…¦«\}}| |¦«|rÌ|ddkrÀ| t¦«|dd…}|sn™|dtvr't|¦«\}}| |¦«|ddkrI| t¦«t|dd…¦«\}}| |¦«|r |ddk°À|st jd¦«‚|ddkr't jd  |¦«¦«‚| tdd ¦«¦«||dd…fS) zù obs-route = obs-domain-list ":" obs-domain-list = *(CFWS / ",") "@" domain *("," [CFWS] ["@" domain]) Returns an obs-route token with the appropriate sub-tokens (that is, there is no obs-domain-list in the parse tree). rrÃrçNr+z(expected obs-route domain but found '{}'z%end of header while parsing obs-routeú:z4expected ':' marking end of obs-route but found '{}'zend-of-obs-route-marker) rrrr—Ú ListSeparatorrrÞr6ÚRouteComponentMarkerr0r¹)rÚ obs_routerKs rÚ get_obs_router9s�€õ‘ ” €IØ ð�U˜1”X˜s’]�] e¨A¤hµ+Ð&=Ð&=Ø �Œ8•{Ð "Ð "Ý# E™?œ?‰LˆE�5Ø × Ò ˜UÑ #Ô #Ð #Ð #Ø �1ŒX˜Š_ˆ_Ø × Ò �]Ñ +Ô +Ð +ؘ!˜"˜"”IˆEð ð�U˜1”X˜s’]�] e¨A¤hµ+Ð&=Ð&=ð ðF�E˜!”H ’O�OÝÔ%Ø 6× =Ò =¸eÑ DÔ DñFôFð Fà ×ÒÕ)Ñ*Ô*Ð*ݘe A B BœiÑ(Ô(�L€Eˆ5Ø ×Ò�UÑÔÐØ ð $�E˜!”H˜c’M�MØ×Ò�Ñ'Ô'Ð'Ø�a�b�b” ˆØð Ø Ø �Œ8•{Ð "Ð "Ý# E™?œ?‰LˆE�5Ø × Ò ˜UÑ #Ô #Ð #Ø �Œ8�sŠ?ˆ?Ø × Ò Õ1Ñ 2Ô 2Ð 2Ý% e¨A¨B¨B¤iÑ0Ô0‰LˆE�5Ø × Ò ˜UÑ #Ô #Ð #ð ð $�E˜!”H˜c’M�Mð ðOÝÔ%Ð&MÑNÔNÐNØ ˆQ„x�3‚€ÝÔ%ð('ß'-¢v¨e¡}¤}ñ6ô6ð 6à ×Ò•] 3Ð(AÑBÔBÑCÔCÐCØ �e˜A˜B˜B”iÐ Ðrcó&—t¦«}|dtvr't|¦«\}}| |¦«|r |ddkr't jd |¦«¦«‚| tdd¦«¦«|dd…}|ddkr]| tdd¦«¦«|j t j d ¦«¦«|dd…}||fS t|¦«\}}n¶#tj$r¤ t|¦«\}}|j t j d ¦«¦«n:#tj$r(t jd  |¦«¦«‚wxYw| |¦«t|¦«\}}YnwxYw| |¦«|r|ddkr |dd…}n,|j t j d ¦«¦«| tdd¦«¦«|r6|dtvr't|¦«\}}| |¦«||fS) z‡ angle-addr = [CFWS] "<" addr-spec ">" [CFWS] / obs-angle-addr obs-angle-addr = [CFWS] "<" obs-route addr-spec ">" [CFWS] rúzangle-addr-endznull addr-spec in angle-addrz*obsolete route specification in angle-addrz.expected addr-spec or obs-route but found '{}'z"missing trailing '>' on angle-addr) rørrr—rrÞr6r¹r!rsr3r9r)rÚ angle_addrrKs rÚget_angle_addrr>¨sÚ€õ ‘”€JØ ˆQ„x•;ÐÐÝ ‘”‰ ˆˆuØ×Ò˜%Ñ Ô Ð Ø ð@�E˜!”H ’O�OÝÔ%Ø 0× 7Ò 7¸Ñ >Ô >ñ@ô@ð @à×Ò•m CÐ);Ñ<Ô<Ñ=Ô=Ð=Ø �!�"�"ŒI€Eð ˆQ„x�3‚€Ø×Ò�-¨Ð-=Ñ>Ô>Ñ?Ô?Ð?ØÔ×!Ò!¥&Ô"<Ø *ñ#,ô#,ñ -ô -ð -à�a�b�b” ˆØ˜5Ð Ð ð ,Ý$ UÑ+Ô+‰ ˆˆuˆuøÝ Ô "ð ,ð ,ð ,ð PÝ(¨Ñ/Ô/‰LˆE�5Ø Ô × %Ò %¥fÔ&AØ<ñ'>ô'>ñ ?ô ?ð ?ð ?øåÔ&ð Pð Pð PÝÔ)Ø@×GÒGÈÑNÔNñPôPð Pð Pøøøð ×Ò˜%Ñ Ô Ð Ý$ UÑ+Ô+‰ ˆˆuˆuˆuð ,øøøð×Ò�eÑÔÐØ ð3��q”˜S’�Ø�a�b�b” ˆˆàÔ×!Ò!¥&Ô"<Ø 0ñ#2ô#2ñ 3ô 3ð 3à×Ò•m CÐ)9Ñ:Ô:Ñ;Ô;Ð;Ø ð!��q”�[Ð(Ð(Ý ‘”‰ ˆˆuØ×Ò˜%Ñ Ô Ð Ø �uÐ Ðs*ÄD$Ä$GÄ4>E3Å2GÅ37F*Æ**GÇGcó¬—t¦«}t|¦«\}}| |dd…¦«|jdd…|_||fS)zÇ display-name = phrase Because this is simply a name-rule, we don't return a display-name token containing a phrase, but rather a display-name token with the content of the phrase. N)r3rrIr!)rrÇrKs rÚget_display_namer@ÖsX€õ‘=”=€LݘeÑ$Ô$�L€Eˆ5Ø×Ò˜˜a˜a˜aœÑ!Ô!Ð!Ø œ=¨¨¨Ô+€LÔØ ˜Ð Ðrcóh—t¦«}d}|dtvr;t|¦«\}}|s'tjd |¦«¦«‚|ddkr˜|dt vr'tjd |¦«¦«‚t|¦«\}}|s'tjd |¦«¦«‚|�|g|ddd…<d}| |¦«t|¦«\}}|�|g|dd…<| |¦«||fS)z, name-addr = [display-name] angle-addr Nrz!expected name-addr but found '{}'r;) rãrrrrÞr6rr@r—r>)rÚ name_addrrrKs rÚ get_name_addrrCåsa€õ‘ ” €Ià €FØ ˆQ„x•;ÐÐÝ  ™œ‰ ˆ�Øð DÝÔ)Ø3×:Ò:¸6ÑBÔBñDôDð Dà ˆQ„x�3‚€Ø �Œ8•{Ð "Ð "ÝÔ)Ø3×:Ò:¸5ÑAÔAñCôCð Cå'¨Ñ.Ô.‰ ˆˆuØð CÝÔ)Ø3×:Ò:¸5ÑAÔAñCôCð Cà Ð Ø"˜8ˆE�!ŒH�R�a�R‰L؈FØ×Ò˜ÑÔÐÝ! %Ñ(Ô(�L€Eˆ5Ø ÐØ�Hˆˆbˆqˆb‰ Ø ×Ò�UÑÔÐØ �eÐ Ðrcóˆ—t¦«} t|¦«\}}nc#tj$rQ t |¦«\}}n:#tj$r(tjd |¦«¦«‚wxYwYnwxYwt d„|jD¦«¦«rd|_|  |¦«||fS)z& mailbox = name-addr / addr-spec zexpected mailbox but found '{}'c3óJK—|]}t|tj¦«V—ŒdSr)r?rrsr*s rr-zget_mailbox..sCèè€ð 3ð 3Øõ �a�Ô3Ñ 4Ô 4ð 3ð 3ð 3ð 3ð 3ð 3rrË) rrCrrÞr3r6Úanyr>r\r—)rrÊrKs rÚ get_mailboxrGs €õ ‰iŒi€GðAÝ$ UÑ+Ô+‰ ˆˆuˆuøÝ Ô "ðAðAðAð AÝ(¨Ñ/Ô/‰LˆE�5�5øÝÔ&ð Að Að AÝÔ)Ø1×8Ò8¸Ñ?Ô?ñAôAð Að Aøøøð�5ðAøøøõ  ð 3ð 3Ø %Ô 1ð 3ñ 3ô 3ñ3ô3ð/à.ˆÔØ ‡N‚N�5ÑÔÐØ �Eˆ>Ðó&�#£B³AÁBÁ7A=Á=BÂBcó*—t¦«}|r€|d|vrv|dtvr4| t|dd¦«¦«|dd…}n't |¦«\}}| |¦«|r |d|v°v||fS)zÍ Read everything up to one of the chars in endchars. This is outside the formal grammar. The InvalidMailbox TokenList that is returned acts like a Mailbox, but the data attributes are None. rr#rçN)rrr—r¹r)rrÍÚinvalid_mailboxrKs rÚget_invalid_mailboxrKs¿€õ%Ñ&Ô&€OØ ð*�E˜!”H HÐ,Ð,Ø �Œ8•{Ð "Ð "Ø × "Ò "¥=°°q´Ø1Dñ$Fô$Fñ Gô Gð Gà˜!˜"˜"”IˆEˆEå% eÑ,Ô,‰LˆE�5Ø × "Ò " 5Ñ )Ô )Ð )ð ð*�E˜!”H HÐ,Ð,ð ˜EÐ !Ð!rcóô—t¦«}|�rd|ddk�rW t|¦«\}}| |¦«�n}#tj$�rjd}|dt vr¿t |¦«\}}|r |ddvrB| |¦«|j tjd¦«¦«nöt|d¦«\}}|�|g|dd…<| |¦«|j tj d¦«¦«n—|ddkr-|j tjd¦«¦«n^t|d¦«\}}|�|g|dd…<| |¦«|j tj d¦«¦«YnwxYw|rm|ddvrc|d}d |_ t|d¦«\}}|  |¦«|j tj d¦«¦«|r0|ddkr$| t¦«|d d…}|r |ddk�°W||fS) aJ mailbox-list = (mailbox *("," mailbox)) / obs-mbox-list obs-mbox-list = *([CFWS] ",") mailbox *("," [mailbox / CFWS]) For this routine we go outside the formal grammar in order to improve error handling. We recognize the end of the mailbox list only at the end of the value or at a ';' (the group terminator). This is so that we can turn invalid mailboxes into InvalidMailbox tokens and continue parsing any remaining valid mailboxes. We also allow all mailbox entries to be null, and this condition is handled appropriately at a higher level. rú;Nz,;zempty element in mailbox-listzinvalid mailbox in mailbox-listrÃrërËrç)rÎrGr—rrÞrrr!rrKrsr\rIr6)rÚ mailbox_listrKrrÊs rÚget_mailbox_listrO*s߀õ‘=”=€LØ ñ(�E˜!”H ’O‘Oð 8Ý& uÑ-Ô-‰LˆE�5Ø × Ò  Ñ &Ô &Ð &Ñ &øÝÔ&ð 8ñ 8ð 8؈FØ�QŒx�;Ð&Ð&Ý (¨¡¤‘ �˜Øð <  a¤¨DÐ 0Ð 0Ø ×'Ò'¨Ñ/Ô/Ð/Ø Ô(×/Ò/µÔ0KØ7ñ19ô19ñ:ô:ð:ð:õ$7°u¸dÑ#CÔ#C‘L�E˜5ØÐ)Ø%+ H˜˜b˜q˜b™ Ø ×'Ò'¨Ñ.Ô.Ð.Ø Ô(×/Ò/µÔ0JØ9ñ1;ô1;ñ<ô<ð<ð<à�q”˜S’�ØÔ$×+Ò+­FÔ,GØ3ñ-5ô-5ñ6ô6ð6ð6õ 3°5¸$Ñ?Ô?‘ ��uØÐ%Ø!' �E˜"˜1˜"‘IØ×#Ò# EÑ*Ô*Ð*ØÔ$×+Ò+­FÔ,FØ5ñ-7ô-7ñ8ô8ð8øøð/ 8øøøð2 ð 4�U˜1”X TÐ)Ð)ð# 2Ô&ˆGØ!2ˆGÔ Ý.¨u°dÑ;Ô;‰LˆE�5Ø �NŠN˜5Ñ !Ô !Ð !Ø Ô × 'Ò '­Ô(BØ1ñ)3ô)3ñ 4ô 4ð 4à ð �U˜1”X ’_�_Ø × Ò ¥ Ñ .Ô .Ð .ؘ!˜"˜"”IˆEðQ ð(�E˜!”H ’O‘OðR ˜Ð Ðs 'A Á E7GÇGcóö—t¦«}|s0|j tjd¦«¦«||fSd}|r�|dt vr~t |¦«\}}|sE|j tjd¦«¦«| |¦«||fS|ddkr| |¦«||fSt|¦«\}}t|j ¦«dkr\|�| |¦«|  |¦«|j tj d¦«¦«||fS|�|g|dd…<| |¦«||fS)zg group-list = mailbox-list / CFWS / obs-group-list obs-group-list = 1*([CFWS] ",") [CFWS] zend of header before group-listNrzend of header in group-listrMzgroup-list with empty entries) rÖr!r—rrsrrrOrèrÁrIr)rÚ group_listrrKs rÚget_group_listrRcsº€õ ‘”€JØ ð!ØÔ×!Ò!¥&Ô"<Ø -ñ#/ô#/ñ 0ô 0ð 0à˜5Ð Ð Ø €FØ ð %��q”�[Ð(Ð(Ý  ™œ‰ ˆ�Øð %ð Ô × %Ò %¥fÔ&@Ø-ñ'/ô'/ñ 0ô 0ð 0à × Ò ˜fÑ %Ô %Ð %ؘuÐ$Ð $Ø �Œ8�sŠ?ˆ?Ø × Ò ˜fÑ %Ô %Ð %ؘuÐ$Ð $Ý# EÑ*Ô*�L€Eˆ5Ý ˆ5Ô ÑÔ Ò"Ð"Ø Ð Ø × Ò ˜fÑ %Ô %Ð %Ø×Ò˜%Ñ Ô Ð ØÔ×!Ò!¥&Ô"=Ø +ñ#-ô#-ñ .ô .ð .à˜5Ð Ð Ø ÐØ�Hˆˆbˆqˆb‰ Ø×Ò�eÑÔÐØ �uÐ ÐrcóŽ—t¦«}t|¦«\}}|r |ddkr'tjd |¦«¦«‚| |¦«| t dd¦«¦«|dd…}|r;|ddkr/| t dd¦«¦«||dd…fSt|¦«\}}| |¦«|s-|j tj d ¦«¦«n3|ddkr'tjd  |¦«¦«‚| t dd¦«¦«|dd…}|r6|dtvr't|¦«\}}| |¦«||fS) z7 group = display-name ":" [group-list] ";" [CFWS] rr5z8expected ':' at end of group display name but found '{}'zgroup-display-name-terminatorrçNrMzgroup-terminatorzend of header in groupz)expected ';' at end of group but found {}) rÜr@rrÞr6r—r¹rRr!rsrr)rrÅrKs rÚ get_grouprTˆsÕ€õ ‰GŒG€EÝ# EÑ*Ô*�L€Eˆ5Ø ð9�E˜!”H ’O�OÝÔ%ð'*ß*0ª&°©-¬-ñ9ô9ð 9à ‡L‚L�ÑÔÐØ ‡L‚L•˜sÐ$CÑDÔDÑEÔEÐEØ �!�"�"ŒI€EØ ð ��q”˜S’�Ø � Š •] 3Ð(:Ñ;Ô;Ñ<Ô<Ð<Ø�e˜A˜B˜B”iÐÐÝ! %Ñ(Ô(�L€Eˆ5Ø ‡L‚L�ÑÔÐØ ðGØ Œ ×Ò�VÔ7Ø $ñ&ô&ñ 'ô 'ð 'ð 'à ˆqŒ�SŠˆÝÔ%Ø 7× >Ò >¸uÑ EÔ EñGôGð Gà ‡L‚L•˜sÐ$6Ñ7Ô7Ñ8Ô8Ð8Ø �!�"�"ŒI€EØ ð��q”�[Ð(Ð(Ý ‘”‰ ˆˆuØ � Š �UÑÔÐØ �%ˆ<Ðrcó>—t¦«} t|¦«\}}nc#tj$rQ t |¦«\}}n:#tj$r(tjd |¦«¦«‚wxYwYnwxYw| |¦«||fS)aš address = mailbox / group Note that counter-intuitively, an address can be either a single address or a list of addresses (a group). This is why the returned Address object has a 'mailboxes' attribute which treats a single address as a list of length one. When you need to differentiate between to two cases, extract the single element, which is either a mailbox or a group token. zexpected address but found '{}')rÃrTrrÞrGr6r—)rr²rKs rÚ get_addressrV¦sÑ€õ"‰iŒi€GðAÝ  Ñ'Ô'‰ ˆˆuˆuøÝ Ô "ðAðAðAð AÝ& uÑ-Ô-‰LˆE�5�5øÝÔ&ð Að Að AÝÔ)Ø1×8Ò8¸Ñ?Ô?ñAôAð Að Aøøøð�5ðAøøøð  ‡N‚N�5ÑÔÐØ �Eˆ>ÐrHcó—t¦«}|�rm t|¦«\}}| |¦«�n£#tj$�r�}d}|dt vrÐt |¦«\}}|r |ddkrC| |¦«|j tjd¦«¦«�nt|d¦«\}}|�|g|dd…<| t|g¦«¦«|j tj d¦«¦«n¥|ddkr-|j tjd¦«¦«nlt|d¦«\}}|�|g|dd…<| t|g¦«¦«|j tj d¦«¦«Yd}~nd}~wwxYw|ru|ddkri|dd}d|_ t|d¦«\}}|  |¦«|j tj d¦«¦«|r$| t¦«|d d…}|�°m||fS) a� address_list = (address *("," address)) / obs-addr-list obs-addr-list = *([CFWS] ",") address *("," [address / CFWS]) We depart from the formal grammar here by continuing to parse until the end of the input, assuming the input to be entirely composed of an address-list. This is always true in email parsing, and allows us to skip invalid addresses to parse additional valid ones. NrrÃz"address-list entry with no contentzinvalid address in address-listzempty element in address-listrërËrç)r¯rVr—rrÞrrr!rrKrÃrsr\rIr6)rÚ address_listrKÚerrrrÊs rÚget_address_listrZÃs×€õ‘=”=€LØ ñ(ð 8Ý& uÑ-Ô-‰LˆE�5Ø × Ò  Ñ &Ô &Ð &Ñ &øÝÔ&ð 8ñ 8ð 8؈FØ�QŒx�;Ð&Ð&Ý (¨¡¤‘ �˜Øð <  a¤¨C¢ Ø ×'Ò'¨Ñ/Ô/Ð/Ø Ô(×/Ò/µÔ0KØ<ñ1>ô1>ñ?ô?ð?ñ?õ$7°u¸cÑ#BÔ#B‘L�E˜5ØÐ)Ø%+ H˜˜b˜q˜b™ Ø ×'Ò'­°°Ñ(8Ô(8Ñ9Ô9Ð9Ø Ô(×/Ò/µÔ0JØ9ñ1;ô1;ñ<ô<ð<ð<à�q”˜S’�ØÔ$×+Ò+­FÔ,GØ3ñ-5ô-5ñ6ô6ð6ð6õ 3°5¸#Ñ>Ô>‘ ��uØÐ%Ø!' �E˜"˜1˜"‘IØ×#Ò#¥G¨U¨GÑ$4Ô$4Ñ5Ô5Ð5ØÔ$×+Ò+­FÔ,FØ5ñ-7ô-7ñ8ô8ð8øøøøøøøøøð/ 8øøøð2 ð 4�U˜1”X ’_�_ð# 2Ô& qÔ)ˆGØ!2ˆGÔ Ý.¨u°cÑ:Ô:‰LˆE�5Ø �NŠN˜5Ñ !Ô !Ð !Ø Ô × 'Ò '­Ô(BØ1ñ)3ô)3ñ 4ô 4ð 4à ð Ø × Ò ¥ Ñ .Ô .Ð .ؘ!˜"˜"”IˆEðQ ñ(ðR ˜Ð Ðs“'<¼GÁ FGÇGcóF—t¦«}|s'tjd |¦«¦«‚|ddkr'tjd |¦«¦«‚| t dd¦«¦«|dd…}t |¦«\}}| |¦«|r |ddkr'tjd  |¦«¦«‚| t dd ¦«¦«||dd…fS) z& no-fold-literal = "[" *dtext "]" z'expected no-fold-literal but found '{}'rr-z;expected '[' at the start of no-fold-literal but found '{}'zno-fold-literal-startrçNr(z9expected ']' at the end of no-fold-literal but found '{}'zno-fold-literal-end)r!rrÞr6r—r¹r&)rÚno_fold_literalrKs rÚget_no_fold_literalr]ús1€õ$‘o”o€OØ ðEÝÔ%Ø 5× <Ò <¸UÑ CÔ CñEôEð Eà ˆQ„x�3‚€ÝÔ%ð ß#šV E™]œ]ñ,ô,ð ,ð×Ò�=¨Ð.EÑFÔFÑGÔGÐGØ �!�"�"ŒI€EݘUÑ#Ô#�L€Eˆ5Ø×Ò˜5Ñ!Ô!Ð!Ø ð,�E˜!”H ’O�OÝÔ%ð ß#šV E™]œ]ñ,ô,ð ,ð×Ò�=¨Ð.CÑDÔDÑEÔEÐEØ ˜E ! " "œIÐ %Ð%rcó&—t¦«}|r6|dtvr't|¦«\}}| |¦«|r |ddkr't jd |¦«¦«‚| tdd¦«¦«|dd…} t|¦«\}}n�#tj$r} t|¦«\}}|j  t j d¦«¦«n:#tj$r(t jd |¦«¦«‚wxYwYnwxYw| |¦«|r |dd krk|j  t j d ¦«¦«|r9|dd kr-| td d ¦«¦«|dd…}||fS| td d ¦«¦«|dd…} t|¦«\}}n¿#tj$r­ t|¦«\}}n–#tj$r„} t|¦«\}}|j  t j d¦«¦«n:#tj$r(t jd |¦«¦«‚wxYwYd}~nd}~wwxYwYnwxYw| |¦«|r|dd kr |dd…}n,|j  t j d¦«¦«| td d ¦«¦«|r6|dtvr't|¦«\}}| |¦«||fS)zÏmsg-id = [CFWS] "<" id-left '@' id-right ">" [CFWS] id-left = dot-atom-text / obs-id-left id-right = dot-atom-text / no-fold-literal / obs-id-right no-fold-literal = "[" *dtext "]" rr;zexpected msg-id but found '{}'z msg-id-startrçNzobsolete id-left in msg-idz4expected dot-atom-text or obs-id-left but found '{}'r+zmsg-id with no id-rightr<z msg-id-endr2zobsolete id-right in msg-idzFexpected dot-atom-text, no-fold-literal or obs-id-right but found '{}'zmissing trailing '>' on msg-id)r™rrr—rrÞr6r¹rrr!rrsr]r0)rÚmsg_idrKÚes rÚ get_msg_idras €õ ‰WŒW€FØ ð��q”�[Ð(Ð(Ý ‘”‰ ˆˆuØ� Š �eÑÔÐØ ð<�E˜!”H ’O�OÝÔ%Ø ,× 3Ò 3°EÑ :Ô :ñ<ô<ð <à ‡M‚M•-  ^Ñ4Ô4Ñ5Ô5Ð5Ø �!�"�"ŒI€Eð 1Ý(¨Ñ/Ô/‰ ˆˆuˆuøÝ Ô "ð 1ð 1ð 1ð 1å-¨eÑ4Ô4‰LˆE�5Ø ŒN× !Ò !¥&Ô"=Ø,ñ#.ô#.ñ /ô /ð /ð /øåÔ&ð 1ð 1ð 1ÝÔ)ð"ß"(¢&¨¡-¤-ñ1ô1ð 1ð 1øøøð /ð /ð 1øøøð ‡M‚M�%ÑÔÐØ ð �E˜!”H ’O�OØŒ×Ò�fÔ8Ø %ñ'ô'ñ (ô (ð (ð ð �U˜1”X ’_�_Ø �MŠM�-¨¨\Ñ:Ô:Ñ ;Ô ;Ð ;ؘ!˜"˜"”IˆEØ�uˆ}ÐØ ‡M‚M•- Ð%8Ñ9Ô9Ñ:Ô:Ð:Ø �!�"�"ŒI€Eð 5Ý(¨Ñ/Ô/‰ ˆˆuˆuøÝ Ô "ð 5ð 5ð 5ð 5Ý.¨uÑ5Ô5‰LˆE�5�5øÝÔ&ð 5ð 5ð 5ð 5Ý)¨%Ñ0Ô0‘ ��uØ”×%Ò%¥fÔ&AØ1ñ'3ô'3ñ4ô4ð4ð4øåÔ*ð 5ð 5ð 5ÝÔ-ð&ß&,¢f¨U¡m¤mñ5ô5ð5ð 5øøøð4ð4ð4ð4ð4øøøøð 5øøøøøð 5øøøð ‡M‚M�%ÑÔÐØ ð/��q”˜S’�Ø�a�b�b” ˆˆàŒ×Ò�fÔ8Ø ,ñ.ô.ñ /ô /ð /à ‡M‚M•-  \Ñ2Ô2Ñ3Ô3Ð3Ø ð��q”�[Ð(Ð(Ý ‘”‰ ˆˆuØ� Š �eÑÔÐØ �5ˆ=ÐsxÂ*B=Â=E à >D Ä E Ä 7EÅE ÅE ÈHÈKÈ+H>È=KÈ>KÉ>J Ê K Ê 7KËK ËKË KËKËKcóè—t¦«} t|¦«\}}| |¦«|r?|j t jd |¦«¦«¦«ny#tj$rg}t|¦«}t|¦«}|j t jd |¦«¦«¦«Yd}~nd}~wwxYw|S)z2message-id = "Message-ID:" msg-id CRLF zUnexpected {!r}zInvalid msg-id: {!r}N) r�rar—r!rrsr6rÞròrŸ)rÚ message_idrKÚexs rÚparse_message_idreUs €õ‘”€Jð 2Ý! %Ñ(Ô(‰ ˆˆuØ×Ò˜%Ñ Ô Ð ð ð 2Ø Ô × %Ò %¥fÔ&@Ø!×(Ò(¨Ñ/Ô/ñ'1ô'1ñ 2ô 2ð 2øøõ Ô "ðKðKðKÝ  Ñ'Ô'ˆÝ% eÑ,Ô,ˆ ØÔ×!Ò!Ý Ô &Ð'=×'DÒ'DÀRÑ'HÔ'HÑ IÔ Iñ Kô Kð Kð Kð Kð Kð Kð KøøøøðKøøøð Ðs�'A9Á9C/ÂAC*Ã*C/có —t¦«}|s.|j tjd¦«¦«|S|dt vrUt |¦«\}}| |¦«|s,|j tjd¦«¦«d}|rM|ddkrA|dt vr2||dz }|dd…}|r|ddkr|dt v°2| ¦«sc|j tjd  |¦«¦«¦«| t|d ¦«¦«n7t|¦«|_ | t|d ¦«¦«|r6|dt vr't |¦«\}}| |¦«|r |ddkrZ|j �,|j tjd ¦«¦«|r#| t|d ¦«¦«|S| tdd ¦«¦«|dd…}|r6|dt vr't |¦«\}}| |¦«|s5|j �,|j tjd ¦«¦«|Sd}|r5|dt vr&||dz }|dd…}|r|dt v°&| ¦«sc|j tjd   |¦«¦«¦«| t|d ¦«¦«n7t|¦«|_ | t|d ¦«¦«|r6|dt vr't |¦«\}}| |¦«|rO|j tjd¦«¦«| t|d ¦«¦«|S)zE mime-version = [CFWS] 1*digit [CFWS] "." [CFWS] 1*digit [CFWS] z%Missing MIME version number (eg: 1.0)rz0Expected MIME version number but found only CFWSr'r rçNz1Expected MIME major version number but found {!r}rÇÚdigitsz0Incomplete MIME version; found only major numberzversion-separatorz1Expected MIME minor version number but found {!r}z'Excess non-CFWS text after MIME version)rKr!r—rÚHeaderMissingRequiredValuerrÚisdigitrsr6r¹ÚintrLrM)rÚ mime_versionrKrgs rÚparse_mime_versionrlqsŸ€õ ‘=”=€LØ ðØÔ×#Ò#¥FÔ$EØ 3ñ%5ô%5ñ 6ô 6ð 6àÐØ ˆQ„x•;ÐÐÝ ‘”‰ ˆˆuØ×Ò˜EÑ"Ô"Ð"Øð EØ Ô × 'Ò '­Ô(IØBñ)Dô)Dñ Eô Eð Eà €FØ ð�E˜!”H ’O�O¨¨a¬½ Ð(CÐ(CØ�%˜”(шØ�a�b�b” ˆð ð�E˜!”H ’O�O¨¨a¬½ Ð(CÐ(Cð �>Š>Ñ Ô ð=ØÔ×#Ò#¥FÔ$>Ø ?× FÒ FÀvÑ NÔ Nñ%Pô%Pñ Qô Qð Qà×Ò�M¨&°'Ñ:Ô:Ñ;Ô;Ð;Ð;å  ™[œ[ˆ ÔØ×Ò�M¨&°(Ñ;Ô;Ñ<Ô<Ð<Ø ð#��q”�[Ð(Ð(Ý ‘”‰ ˆˆuØ×Ò˜EÑ"Ô"Ð"Ø ð�E˜!”H ’O�OØ Ô Ð )Ø Ô × 'Ò '­Ô(BØBñ)Dô)Dñ Eô Eð Eà ð ?Ø × Ò ¥ ¨e°WÑ =Ô =Ñ >Ô >Ð >ØÐØ×Ò�  cÐ+>Ñ?Ô?Ñ@Ô@Ð@Ø �!�"�"ŒI€EØ ð#��q”�[Ð(Ð(Ý ‘”‰ ˆˆuØ×Ò˜EÑ"Ô"Ð"Ø ðØ Ô Ð )Ø Ô × 'Ò '­Ô(BØBñ)Dô)Dñ Eô Eð EàÐØ €FØ ð�E˜!”H¥KÐ/Ð/Ø�%˜”(шØ�a�b�b” ˆð ð�E˜!”H¥KÐ/Ð/ð �>Š>Ñ Ô ð=ØÔ×#Ò#¥FÔ$>Ø ?× FÒ FÀvÑ NÔ Nñ%Pô%Pñ Qô Qð Qà×Ò�M¨&°'Ñ:Ô:Ñ;Ô;Ð;Ð;å  ™[œ[ˆ ÔØ×Ò�M¨&°(Ñ;Ô;Ñ<Ô<Ð<Ø ð#��q”�[Ð(Ð(Ý ‘”‰ ˆˆuØ×Ò˜EÑ"Ô"Ð"Ø ð;ØÔ×#Ò#¥FÔ$>Ø 5ñ%7ô%7ñ 8ô 8ð 8à×Ò�M¨%°Ñ9Ô9Ñ:Ô:Ð:Ø Ðrcó2—t¦«}|r„|ddkrx|dtvr4| t|dd¦«¦«|dd…}n't |¦«\}}| |¦«|r |ddk°x||fS)zÁ Read everything up to the next ';'. This is outside the formal grammar. The InvalidParameter TokenList that is returned acts like a Parameter, but the data attributes are None. rrMr#rçN)rZrr—r¹r)rÚinvalid_parameterrKs rÚget_invalid_parameterroµs¼€õ)Ñ*Ô*ÐØ ð,�E˜!”H ’O�OØ �Œ8•{Ð "Ð "Ø × $Ò $¥]°5¸´8Ø3Fñ&Hô&Hñ Iô Ið Ià˜!˜"˜"”IˆEˆEå% eÑ,Ô,‰LˆE�5Ø × $Ò $ UÑ +Ô +Ð +ð ð,�E˜!”H ’O�Oð ˜eÐ #Ð#rcó—t|¦«}|s'tjd |¦«¦«‚| ¦«}|t |¦«d…}t |d¦«}t|¦«||fS)a8ttext = We allow any non-TOKEN_ENDS in ttext, but add defects to the token's defects list if we find non-ttext characters. We also register defects for *any* non-printables even though the RFC doesn't exclude all of them, because we follow the spirit of RFC 5322. zexpected ttext but found '{}'NÚttext)Ú_non_token_end_matcherrrÞr6rÅrèr¹rÉ)rrürqs rÚ get_ttextrsÇs‡€õ ˜uÑ%Ô%€AØ ð;ÝÔ%Ø +× 2Ò 2°5Ñ 9Ô 9ñ;ô;ð ;à �GŠG‰IŒI€EØ •#�e‘*”*�+�+Ô €EÝ ˜% Ñ )Ô )€EÝ�EÑÔÐØ �%ˆ<ÐrcóÄ—t¦«}|r6|dtvr't|¦«\}}| |¦«|r6|dtvr't jd |¦«¦«‚t|¦«\}}| |¦«|r6|dtvr't|¦«\}}| |¦«||fS)zútoken = [CFWS] 1*ttext [CFWS] The RFC equivalent of ttext is any US-ASCII chars except space, ctls, or tspecials. We also exclude tabs even though the RFC doesn't. The RFC implies the CFWS but is not explicit about it in the BNF. rúexpected token but found '{}') r†rrr—Ú TOKEN_ENDSrrÞr6rs)rÚmtokenrKs rÚ get_tokenrxÚsä€õ‰WŒW€FØ ð��q”�[Ð(Ð(Ý ‘”‰ ˆˆuØ� Š �eÑÔÐØ ð;��q”�ZÐ'Ð'ÝÔ%Ø +× 2Ò 2°5Ñ 9Ô 9ñ;ô;ð ;å˜UÑ#Ô#�L€Eˆ5Ø ‡M‚M�%ÑÔÐØ ð��q”�[Ð(Ð(Ý ‘”‰ ˆˆuØ� Š �eÑÔÐØ �5ˆ=Ðrcó—t|¦«}|s'tjd |¦«¦«‚| ¦«}|t |¦«d…}t |d¦«}t|¦«||fS)aQattrtext = 1*(any non-ATTRIBUTE_ENDS character) We allow any non-ATTRIBUTE_ENDS in attrtext, but add defects to the token's defects list if we find non-attrtext characters. We also register defects for *any* non-printables even though the RFC doesn't exclude all of them, because we follow the spirit of RFC 5322. z expected attrtext but found {!r}Nr`)Ú_non_attribute_end_matcherrrÞr6rÅrèr¹rÉ©rrür`s rÚ get_attrtextr|ñs‡€õ # 5Ñ)Ô)€AØ ð>ÝÔ%Ø .× 5Ò 5°eÑ <Ô <ñ>ô>ð >à�wŠw‰yŒy€HØ •#�h‘-”-�.�.Ô !€EݘX zÑ2Ô2€HÝ�HÑÔÐØ �Uˆ?ÐrcóÄ—t¦«}|r6|dtvr't|¦«\}}| |¦«|r6|dtvr't jd |¦«¦«‚t|¦«\}}| |¦«|r6|dtvr't|¦«\}}| |¦«||fS)aH [CFWS] 1*attrtext [CFWS] This version of the BNF makes the CFWS explicit, and as usual we use a value terminal for the actual run of characters. The RFC equivalent of attrtext is the token characters, with the subtraction of '*', "'", and '%'. We include tab in the excluded set just as we do for token. rru) r]rrr—ÚATTRIBUTE_ENDSrrÞr6r|©rr^rKs rÚ get_attributer€ së€õ‘ ” €IØ ð ��q”�[Ð(Ð(Ý ‘”‰ ˆˆuØ×Ò˜ÑÔÐØ ð;��q”�^Ð+Ð+ÝÔ%Ø +× 2Ò 2°5Ñ 9Ô 9ñ;ô;ð ;å Ñ&Ô&�L€Eˆ5Ø ×Ò�UÑÔÐØ ð ��q”�[Ð(Ð(Ý ‘”‰ ˆˆuØ×Ò˜ÑÔÐØ �eÐ Ðrcó—t|¦«}|s'tjd |¦«¦«‚| ¦«}|t |¦«d…}t |d¦«}t|¦«||fS)zÛattrtext = 1*(any non-ATTRIBUTE_ENDS character plus '%') This is a special parsing routine so that we get a value that includes % escapes as a single string (which we decode as a single string later). z)expected extended attrtext but found {!r}Núextended-attrtext)Ú#_non_extended_attribute_end_matcherrrÞr6rÅrèr¹rÉr{s rÚget_extended_attrtextr„ sŒ€õ ,¨EÑ2Ô2€AØ ðGÝÔ%Ø 7× >Ò >¸uÑ EÔ EñGôGð Gà�wŠw‰yŒy€HØ •#�h‘-”-�.�.Ô !€EݘXÐ':Ñ;Ô;€HÝ�HÑÔÐØ �Uˆ?ÐrcóÄ—t¦«}|r6|dtvr't|¦«\}}| |¦«|r6|dtvr't jd |¦«¦«‚t|¦«\}}| |¦«|r6|dtvr't|¦«\}}| |¦«||fS)z± [CFWS] 1*extended_attrtext [CFWS] This is like the non-extended version except we allow % characters, so that we can pick up an encoded value as a single string. rru) r]rrr—ÚEXTENDED_ATTRIBUTE_ENDSrrÞr6r„rs rÚget_extended_attributer‡- sì€õ‘ ” €IØ ð ��q”�[Ð(Ð(Ý ‘”‰ ˆˆuØ×Ò˜ÑÔÐØ ð;��q”Õ4Ð4Ð4ÝÔ%Ø +× 2Ò 2°5Ñ 9Ô 9ñ;ô;ð ;å(¨Ñ/Ô/�L€Eˆ5Ø ×Ò�UÑÔÐØ ð ��q”�[Ð(Ð(Ý ‘”‰ ˆˆuØ×Ò˜ÑÔÐØ �eÐ Ðrcóø—t¦«}|r |ddkr'tjd |¦«¦«‚| t dd¦«¦«|dd…}|r|d ¦«s'tjd |¦«¦«‚d}|rK|d ¦«r1||dz }|dd…}|r|d ¦«°1|dd kr2|d kr,|j tjd ¦«¦«t|¦«|_ | t |d ¦«¦«||fS) a6 '*' digits The formal BNF is more complicated because leading 0s are not allowed. We check for that and add a defect. We also assume no CFWS is allowed between the '*' and the digits, though the RFC is not crystal clear on that. The caller should already have dealt with leading CFWS. rÚ*zExpected section but found {}zsection-markerrçNz$Expected section number but found {}r'Ú0z'section number has an invalid leading 0rg) rdrrÞr6r—r¹rir!rsrjrT)rrergs rÚ get_sectionr‹C s—€õ‰iŒi€GØ ð0�E˜!”H ’O�OÝÔ%Ð&E×&LÒ&LØ(-ñ'/ô'/ñ0ô0ð 0à ‡N‚N•= Ð&6Ñ7Ô7Ñ8Ô8Ð8Ø �!�"�"ŒI€EØ ð@˜˜aœ×(Ò(Ñ*Ô*ð@ÝÔ%ð'1ß17²¸±´ñ@ô@ð @à €FØ ð�E˜!”H×$Ò$Ñ&Ô&ðØ�%˜”(шØ�a�b�b” ˆð ð�E˜!”H×$Ò$Ñ&Ô&ððˆa„y�CÒИF cšM˜MØŒ×Ò�vÔ9Ø9ñ ;ô ;ñ <ô <ð <嘑[”[€G„NØ ‡N‚N•= ¨Ñ2Ô2Ñ3Ô3Ð3Ø �Eˆ>ÐrcóŠ—t¦«}|stjd¦«‚d}|dtvrt |¦«\}}|s'tjd |¦«¦«‚|ddkrt |¦«\}}nt|¦«\}}|�|g|dd…<| |¦«||fS)z quoted-string / attribute z&Expected value but found end of stringNrz Expected value but found only {}r) rgrrÞrrr6rr‡r—)rÚvrrKs rÚ get_valuerŽa sÚ€õ ‰Œ€AØ ðPÝÔ%Ð&NÑOÔOÐOØ €FØ ˆQ„x•;ÐÐÝ  ™œ‰ ˆ�Ø ð@ÝÔ%ð'0ß06²°v±´ñ@ô@ð @à ˆQ„x�3‚€Ý(¨Ñ/Ô/‰ ˆˆuˆuå-¨eÑ4Ô4‰ ˆˆuØ ÐØ�Hˆˆbˆqˆb‰ ؇H‚HˆU�O„O€OØ ˆeˆ8€OrcóR —t¦«}t|¦«\}}| |¦«|r |ddkrC|j t jd |¦«¦«¦«||fS|ddkr› t|¦«\}}d|_| |¦«n#tj $rYnwxYw|st j d¦«‚|ddkr4| tdd¦«¦«|dd …}d|_ |dd krt j d ¦«‚| td d ¦«¦«|dd …}d }|r6|dtvr't|¦«\}}| |¦«d }|}|j �r|�r|dd k�rt|¦«\}}|j}d}|jdkr4|r|ddkrd}nBt#|¦«\}} | r| ddkrd}n t%|¦«\}} | sd}n#YnxYw|r_|j t jd¦«¦«| |¦«|D]} | jdkr g| d d …<| }nŒ|}n.d }|j t jd¦«¦«|r|ddkrd }nt)|¦«\}}|j r |jdkrW|r |ddkr| |¦«|�|}||fS|j t jd¦«¦«|sI|j t jd¦«¦«| |¦«|€||fS�nC|�>|D]} | jdkrnŒ| jdk| | ¦«| j|_|ddkr't j d |¦«¦«‚| tdd¦«¦«|dd …}|rt|ddkrht#|¦«\}}| |¦«|j|_|r |ddkr't j d |¦«¦«‚| tdd¦«¦«|dd …}|�…t1¦«} |rr|dt2vrt5|¦«\}}n9|dd krtd d¦«}|dd …}nt7|¦«\}}|  |¦«|°r| }nt)|¦«\}}| |¦«|�|}||fS)aY attribute [section] ["*"] [CFWS] "=" value The CFWS is implied by the RFC but not made explicit in the BNF. This simplified form of the BNF from the RFC is made to conform with the RFC BNF through some extra checks. We do it this way because it makes both error recovery and working with the resulting parse tree easier. rrMz)Parameter contains name ({}) but no valuer‰TzIncomplete parameterzextended-parameter-markerrçNú=zParameter not followed by '='úparameter-separatorrFú'z5Quoted string value for extended parameter is invalidr“zZParameter marked as extended but appears to have a quoted string value that is non-encodedzcApparent initial-extended-value but attribute was not marked as extended or was not initial sectionz(Missing required charset/lang delimitersr‚r`z=Expected RFC2231 char/lang encoding delimiter, but found {!r}zRFC2231-delimiterz;Expected RFC2231 char/lang encoding delimiter, but found {}ÚDQUOTE)rOr€r—r!rrsr6r‹rSrÞr¹rXrrrrœrUr|r„r\rŽrrŒr�rgrãrØrø) rrƒrKrrÏÚappendtoÚqstringÚ inner_valueÚ semi_validrçÚtr�s rÚ get_parameterr™w s—€õ ‰KŒK€EÝ  Ñ'Ô'�L€Eˆ5Ø ‡L‚L�ÑÔÐØ ð�E˜!”H ’O�OØ Œ ×Ò�VÔ7ð9%ß%+¢V¨E¡]¤]ñ4ô4ñ 5ô 5ð 5à�eˆ|ÐØ ˆQ„x�3‚€ð Ý& uÑ-Ô-‰LˆE�5Ø"ˆEŒOØ �LŠL˜Ñ Ô Ð Ð øÝÔ&ð ð ð Ø ˆDð øøøàð BÝÔ)Ð*@ÑAÔAÐ AØ �Œ8�sŠ?ˆ?Ø �LŠL� sÐ,GÑHÔHÑ IÔ IÐ Iؘ!˜"˜"”IˆEØ!ˆEŒNØ ˆQ„x�3‚€ÝÔ%Ð&EÑFÔFÐFØ ‡L‚L•˜sÐ$9Ñ:Ô:Ñ;Ô;Ð;Ø �!�"�"ŒI€EØ €FØ ð��q”�[Ð(Ð(Ý ‘”‰ ˆˆuØ � Š �UÑÔÐØ€IØ€HØ „~ñ$<˜%ñ$< E¨!¤H°¢O¡Oõ/¨uÑ5Ô5ш�ØÔ,ˆ ؈ Ø Ô  1Ò $Ð $Øð &˜{¨1œ~°Ò4Ð4Ø!� � å*¨;Ñ7Ô7‘ ��tØð&˜D œG sšN˜NØ!%�Jøð &Ý3°KÑ@Ô@‘ ��tðð&Ø!%�Jøøð  Ø�øøøð ð <Ø ŒM× Ò ¥Ô!;ØGñ"Iô"Iñ Jô Jð Jà �LŠL˜Ñ !Ô !Ð !Øð ð �Ø”<Ð#7Ò7Ð7Ø�A�a�a�a‘DØ �HØ�Eð8ð ˆEˆEàˆIØ ŒM× Ò ¥Ô!;ð:ñ";ô";ñ <ô <ð <ð ð(��q”˜S’�؈ˆå  Ñ'Ô'‰ ˆˆuØ Œ>ð F˜UÔ1°AÒ5Ð5Øð ˜˜aœ Cš˜Ø �OŠO˜EÑ "Ô "Ð "ØÐ$à!�ؘ%�<Ð Ø Œ ×Ò�VÔ7ð DñEôEñ Fô Fð Fð ðà Œ ×Ò�VÔ7Ø 6ñ8ô8ñ 9ô 9ð 9à�Š˜ÑÔÐØ Рؘ%�<Ð ñ ð Ð Øð ð �Ø”<Ð#6Ò6Ð6Ø�Eð7à ŒL˜JÒ &Ð &Ø �OŠO˜AÑ Ô Ð ØœGˆEŒMØ �Œ8�sŠ?ˆ?ÝÔ)ð+FßFLÂfÈUÁmÄmñUôUð Uà�Š�  cÐ+>Ñ?Ô?Ñ@Ô@Ð@Ø�a�b�b” ˆØ ð K�U˜1”X ’_�_Ý'¨Ñ.Ô.‰LˆE�5Ø �OŠO˜EÑ "Ô "Ð "ØœˆEŒJØð K˜E !œH¨šO˜OÝÔ-ð/<ßÑ?Ô?Ñ@Ô@Ð@Ø�a�b�b” ˆØÐå ‰GŒGˆØð Ø�QŒx�3ˆˆÝ& u™~œ~‘ ��u�uØ�q”˜S’�Ý% c¨8Ñ4Ô4�ؘa˜b˜bœ ��å+¨EÑ2Ô2‘ ��uØ �HŠH�U‰OŒOˆOðð ðˆˆå  Ñ'Ô'‰ ˆˆuØ ‡O‚O�EÑÔÐØÐàˆØ �%ˆ<ÐsÂ.CÃCÃCÈ,IÉIcó"—t¦«}|�rý t|¦«\}}| |¦«�n#tj$�r }d}|dt vrt |¦«\}}|s| |¦«|cYd}~S|ddkrD|�| |¦«|j tjd¦«¦«npt|¦«\}}|r|g|dd…<| |¦«|j tjd  |¦«¦«¦«Yd}~nd}~wwxYw|r�|ddkru|d}d|_ t|¦«\}}|  |¦«|j tjd  |¦«¦«¦«|r-| tdd ¦«¦«|d d…}|�°ý|S) a! parameter *( ";" parameter ) That BNF is meant to indicate this routine should only be called after finding and handling the leading ';'. There is no corresponding rule in the formal RFC grammar, but it is more convenient for us for the set of parameters to be treated as its own TokenList. This is 'parse' routine because it consumes the remaining value, but it would never be called to parse a full header. Instead it is called to parse everything after the non-parameter value of a specific MIME header. NrrMzparameter entry with no contentzinvalid parameter {!r}rër[z)parameter with invalid trailing text {!r}r‘rç)rjr™r—rrÞrrr!rsror6r\rIr¹)rÚmime_parametersrKrYrrƒs rÚparse_mime_parametersrœ sg€õ%Ñ&Ô&€OØ ñ#ð =Ý(¨Ñ/Ô/‰LˆE�5Ø × "Ò " 5Ñ )Ô )Ð )Ñ )øÝÔ&ð =ñ =ð =؈FØ�QŒx�;Ð&Ð&Ý (¨¡¤‘ �˜Øð 'Ø×&Ò& vÑ.Ô.Ð.Ø&Ð&Ð&Ð&Ð&Ð&Ð&Ø�QŒx˜3ŠˆØÐ%Ø#×*Ò*¨6Ñ2Ô2Ð2ØÔ'×.Ò.­vÔ/IØ5ñ07ô07ñ8ô8ð8ð8õ 5°UÑ;Ô;‘ ��uØð)Ø!' �E˜"˜1˜"‘IØ×&Ò& uÑ-Ô-Ð-ØÔ'×.Ò.­vÔ/IØ,×3Ò3°EÑ:Ô:ñ0<ô0<ñ=ô=ð=øøøøøøøøøð# =øøøð& ð L�U˜1”X ’_�_ð$ BÔ'ˆEØ2ˆEÔ Ý0°Ñ7Ô7‰LˆE�5Ø �LŠL˜Ñ Ô Ð Ø Ô #× *Ò *­6Ô+EØ;×BÒBÀ5ÑIÔIñ,Kô,Kñ Lô Lð Là ð à × "Ò "¥=°Ð6KÑ#LÔ#LÑ MÔ MÐ Mؘ!˜"˜"”IˆEðG ñ#ðH Ðs"“'<¼EÁ ;EÂE CEÅEcó´—|r„|ddkrx|dtvr4| t|dd¦«¦«|dd…}n't|¦«\}}| |¦«|r |ddk°x|sdS| tdd¦«¦«| t |dd…¦«¦«dS)zBDo our best to find the parameters in an invalid MIME header rrMr#rçNr‘)rr—r¹rrœ)Ú tokenlistrrKs rÚ_find_mime_parametersrŸ9 sí€ð ð$�E˜!”H ’O�OØ �Œ8•{Ð "Ð "Ø × Ò �]¨5°¬8Ð5HÑIÔIÑ JÔ JÐ Jؘ!˜"˜"”IˆEˆEå% eÑ,Ô,‰LˆE�5Ø × Ò ˜UÑ #Ô #Ð #ð ð$�E˜!”H ’O�Oð ðØˆØ ×Ò•] 3Ð(=Ñ>Ô>Ñ?Ô?Ð?Ø ×ÒÕ*¨5°°°¬9Ñ5Ô5Ñ6Ô6Ð6Ð6Ð6rcóÜ—t¦«}d}|s.|j tjd¦«¦«|S t |¦«\}}nf#tj$rT|j tjd |¦«¦«¦«t||¦«|cYSwxYw| |¦«|r |ddkr@|j tjd¦«¦«|rt||¦«|S|j   ¦«  ¦«|_ | tdd¦«¦«|dd …} t |¦«\}}nf#tj$rT|j tjd  |¦«¦«¦«t||¦«|cYSwxYw| |¦«|j   ¦«  ¦«|_|s|S|dd krU|j tjd  |¦«¦«¦«|` |`t||¦«|S| td d ¦«¦«| t!|dd …¦«¦«|S)zÅ maintype "/" subtype *( ";" parameter ) The maintype and substype are tokens. Theoretically they could be checked against the official IANA list + x-token, but we don't do that. Fz"Missing content type specificationz(Expected content maintype but found {!r}rrªzInvalid content typezcontent-type-separatorrçNz'Expected content subtype but found {!r}rMzØ 0ñ2ô2ñ 3ô 3ð 3àˆ ðÝ  Ñ'Ô'‰ ˆˆuˆuøÝ Ô "ðððØ Œ ×Ò�VÔ7Ø 6× =Ò =¸eÑ DÔ DñFôFñ Gô Gð Gå˜e UÑ+Ô+Ð+؈ ˆ ˆ ð øøøð  ‡L‚L�ÑÔÐð ð�E˜!”H ’O�OØ Œ ×Ò�VÔ7Ø "ñ$ô$ñ %ô %ð %à ð 0Ý ! %¨Ñ /Ô /Ð /؈ Ø”[×&Ò&Ñ(Ô(×.Ò.Ñ0Ô0€E„NØ ‡L‚L•˜sÐ$<Ñ=Ô=Ñ>Ô>Ð>Ø �!�"�"ŒI€EðÝ  Ñ'Ô'‰ ˆˆuˆuøÝ Ô "ðððØ Œ ×Ò�VÔ7Ø 5× <Ò <¸UÑ CÔ CñEôEñ Fô Fð Få˜e UÑ+Ô+Ð+؈ ˆ ˆ ð øøøð  ‡L‚L�ÑÔÐØ”K×%Ò%Ñ'Ô'×-Ò-Ñ/Ô/€E„MØ ðØˆ Ø ˆQ„x�3‚€Ø Œ ×Ò�VÔ7ð ßš ™œñ(ô(ñ )ô )ð )ð ˆN˜E˜Mݘe UÑ+Ô+Ð+؈ Ø ‡L‚L•˜sÐ$9Ñ:Ô:Ñ;Ô;Ð;Ø ‡L‚LÕ& u¨Q¨R¨R¤yÑ1Ô1Ñ2Ô2Ð2Ø €Ls&ÁAÁA B8Â7B8Å<FÆA G2Ç1G2có\—t¦«}|s.|j tjd¦«¦«|S t |¦«\}}nf#tj$rT|j tjd |¦«¦«¦«t||¦«|cYSwxYw| |¦«|j   ¦«  ¦«|_ |s|S|ddkrQ|j tjd |¦«¦«¦«t||¦«|S| tdd¦«¦«| t|dd…¦«¦«|S) z* disposition-type *( ";" parameter ) zMissing content dispositionz+Expected content disposition but found {!r}rrMzCOnly parameters are valid after content disposition, but found {!r}r‘rçN)r‘r!r—rrhrxrÞrsr6rŸrrpr¡r’r¹rœ)rÚ disp_headerrKs rÚ parse_content_disposition_headerr§‚ sË€õ%Ñ&Ô&€KØ ðØÔ×"Ò"¥6Ô#DØ )ñ$+ô$+ñ ,ô ,ð ,àÐðÝ  Ñ'Ô'‰ ˆˆuˆuøÝ Ô "ðððØÔ×"Ò"¥6Ô#=Ø 9× @Ò @ÀÑ GÔ Gñ$Iô$Iñ Jô Jð Jå˜k¨5Ñ1Ô1Ð1ØÐÐÐð øøøð ×Ò�uÑÔÐØ&+¤k×&7Ò&7Ñ&9Ô&9×&?Ò&?Ñ&AÔ&A€KÔ#Ø ðØÐØ ˆQ„x�3‚€ØÔ×"Ò"¥6Ô#=ð ßš ™œñ$(ô$(ñ )ô )ð )õ ˜k¨5Ñ1Ô1Ð1ØÐØ×Ò•} SÐ*?Ñ@Ô@ÑAÔAÐAØ×ÒÕ,¨U°1°2°2¬YÑ7Ô7Ñ8Ô8Ð8Ø ÐsÁAÁA B6Â5B6có—t¦«}|s.|j tjd¦«¦«|S t |¦«\}}| |¦«|j ¦« ¦«|_ nT#tj $rB|j tj d  |¦«¦«¦«YnwxYw|s|S|r˜|j tj d¦«¦«|dtvr4| t|dd¦«¦«|dd…}n't|¦«\}}| |¦«|°˜|S)z mechanism z!Missing content transfer encodingz1Expected content transfer encoding but found {!r}z*Extra text after content transfer encodingrr#rçN)r”r!r—rrhrxrrpr¡r‹rÞrsr6rr¹r)rÚ cte_headerrKs rÚ&parse_content_transfer_encoding_headerrª  sÆ€õ )Ñ*Ô*€JØ ðØÔ×!Ò!¥&Ô"CØ /ñ#1ô#1ñ 2ô 2ð 2àÐð5Ý  Ñ'Ô'‰ ˆˆuð ×Ò˜%Ñ Ô Ð Øœ×*Ò*Ñ,Ô,×2Ò2Ñ4Ô4ˆ Œˆøõ Ô "ðPðPðPØÔ×!Ò!¥&Ô"<Ø ?× FÒ FÀuÑ MÔ Mñ#Oô#Oñ Pô Pð Pð Pð PðPøøøð ðØÐØ ð%ØÔ×!Ò!¥&Ô"<Ø 8ñ#:ô#:ñ ;ô ;ð ;à �Œ8•{Ð "Ð "Ø × Ò �m¨E°!¬HÐ6IÑJÔJÑ KÔ KÐ Kؘ!˜"˜"”IˆEˆEå% eÑ,Ô,‰LˆE�5Ø × Ò ˜eÑ $Ô $Ð $ð ð%ð ÐsÁBÂAC)Ã(C)cóŠ—d}|r>|dr6|ddtvr!|dd}|ddd…|d<|S)Nr'rë)rã)ÚlinesÚwsps rÚ_steal_trailing_WSP_if_existsr®Ï sS€Ø €CØ ð#��r”ð#˜u Rœy¨œ}µÐ3Ð3Ø�BŒi˜ŒmˆØ˜"”I˜c˜r˜c”Nˆˆb‰ Ø €Jrcóì—|jp tj}|jrdnd}dg}d}d}d}d}t dd¦«} t |¦«} | �rˆ|  d¦«} | | ur|dz}Œ"t| ¦«} |s@| jd vrt  | ¦« }nt  | ¦« } |   |¦«|} n5#t$r(td „| jD¦«¦«rd } nd} d }YnwxYw| jd krt!| |||¦«Œß|�r|�s| js¤d}d}| jr™|  |¬¦«dt)|j¦« …}|j|vr_t)|¦«|t)|d¦«z kr$t-|¦«}| |¦«|dxx|z cc<�Œ�t1| d¦«st | ¦«| z} d}�Œ¶| jr;|�| |kr|d ks |dkr| dkrd}t3| |||| j| ¦«}| }d}�Œød}d}t)| ¦«|t)|d¦«z kr|dxx| z cc<�Œ7| jrWt)| ¦«dz|krAt-|¦«}|s|  ¦«r| || z¦«d}�Œ•t1| d¦«srt | ¦«}| jdkr0t9dd¦«gd„|D¦«zt9dd¦«gz}| js|dz }| | ¦«|| z} �Œ| jr|s|  d| ¦«d }�Œ:t-|¦«}|s|  ¦«r| || z¦«n|dxx| z cc<| �°ˆ|j |¦«|jzS)zLReturn string of contents of parse_tree folded according to RFC rules. úutf-8rQr'NrFÚwrap_as_ew_blockedrç)rHrÙc3óJK—|]}t|tj¦«V—ŒdSr)r?rr{r*s rr-z%_refold_parse_tree..õ sCèè€ð.ð.Øõ˜a¥Ô!>Ñ?Ô?ð.ð.ð.ð.ð.ð.rú unknown-8bitTrkrMrërr“rrHcóH—g|]}tt|¦«d¦«‘Œ S)rH)r¹r)r+Úps rrrz&_refold_parse_tree..C s;€ð(ð(ð(Øõ#Õ#4°QÑ#7Ô#7¸ÑAÔAð(ð(ð(r)Úmax_line_lengthÚsysÚmaxsizeÚutf8r¤r¬r5rr\Ú SPECIALSNLÚ isdisjointÚNLSETrryrFr>Ú_fold_mime_parametersrErbrQrèr›r®r—r]Ú _fold_as_ewrcrBr¹Úinsertr0)Ú parse_treerNÚmaxlenror¬Úlast_ewÚ last_charsetr±Ú want_encodingÚend_ew_not_allowedrrFÚtstrrŒÚ encoded_partÚnewlineÚnewpartss rrOrOÖ sþ€ð Ô #Ð 2¥s¤{€FØ œ+Ð5ˆwˆw¨:€HØ ˆD€EØ€GØ€LØÐØ€MÝ! "Ð&:Ñ;Ô;ÐÝ �Ñ Ô €EØ ñsØ�yŠy˜‰|Œ|ˆØ Ð%Ð %Ð %Ø  !Ñ #Ð Ø Ý�4‰yŒyˆØð ;ØŒÐ"4Ð4Ð4å$.×$9Ò$9¸$Ñ$?Ô$?Ð ?� � õ%*×$4Ò$4°TÑ$:Ô$:Ð :� ð !Ø �KŠK˜Ñ !Ô !Ð !؈GˆGøÝ!ð !ð !ð !Ýð.ð.Ø Ô,ð.ñ.ô.ñ.ô.ð "à(��ð"�Ø ˆMˆMˆMð !øøøð Œ?Ð/Ò /Ð /å ! $¨¨v°xÑ @Ô @Ð @Ø Ø ñ) &Ð!3ñ) &ØÔ%ð !Ø %� Ø�ØÔ'ð !Ø#'§9¢9°F 9Ñ#;Ô#;ÐQÔ>QÐ=QÐ× Ò ˜uÑ %Ô %¨¬Ñ 6Ð6sÂ=CÃ/DÄDcóx—|�B|r@tt|d|d…|z¦«¦«}|dd|…|d<|dtvr]|d}|dd…}t|d¦«|kr"| t |¦«¦«|dxx|z cc<d}|dtvr|d}|dd…}|€t|d¦«n|}|dkrdn|} t| ¦«dz} | dz|krt jd ¦«‚|rþ|t|d¦«z } | | z } | dkr| d ¦«Œ;|d| …} tj | | ¬ ¦«}t|¦«| z }|dkr8| dd…} tj | | ¬ ¦«}t|¦«| z }|dk°8|dxx|z cc<|t| ¦«d…}|r*| d ¦«t|d¦«}|°þ|dxx|z cc<|r|ndS) aøFold string to_encode into lines as encoded word, combining if allowed. Return the new value for last_ew, or None if ew_combine_allowed is False. If there is already an encoded word in the last line of lines (indicated by a non-None value for last_ew) and ew_combine_allowed is true, decode the existing ew, combine it with to_encode, and re-encode. Otherwise, encode to_encode. In either case, split to_encode as necessary so that the encoded segments fit within maxlen. Nrërrçr'rQr°éz3max_line_length is too small to fit an encoded wordrk)rŒ) rròrãrèr—r®rrÞràr)Ú to_encoder¬rÁrÂrcrŒÚ leading_wspÚ trailing_wspÚ new_last_ewÚ encode_asÚ chrome_lenÚremaining_spaceÚ text_spaceÚto_encode_wordÚ encoded_wordÚexcesss rr¾r¾Z s�€ðÐÐ1ÐÝÝ ˜U 2œY w x xÔ0°9Ñ<Ñ =Ô =ñ?ô?ˆ à˜"”I˜h˜w˜hÔ'ˆˆb‰ Ø�„|•sÐÐð  ”lˆ ؘa˜b˜b”Mˆ Ý ��b” ‰NŒN˜fÒ $Ð $Ø �LŠLÕ6°uÑ=Ô=Ñ >Ô >Ð >Ø ˆbˆ ˆ Œ �[Ñ ˆ ˆ ‰ Ø€LØ�„}�ÐÐà  ”}ˆ ؘc˜r˜c”Nˆ Ø$+ O•#�e˜B”i‘.”.�.¸€Kà" jÒ0Ð0��°g€Iõ�Y‘” !Ñ#€Jà�Q‰˜6Ò!Ð!ÝÔ%Ø AñCôCð Cð ð)Ø ¥3 u¨R¤y¡>¤>Ñ1ˆØ$ zÑ1ˆ Ø ˜Š?ˆ?Ø �LŠL˜Ñ Ô Ð Ø à" ; J ;Ô/ˆÝ”z .¸)ÐDÑDÔDˆ Ý�\Ñ"Ô" _Ñ4ˆØ�qŠjˆjð,¨C¨R¨CÔ0ˆNÝœ: n¸iÐHÑHÔHˆLݘÑ&Ô&¨Ñ8ˆFð �qŠjˆjð ˆbˆ ˆ Œ �\Ñ!ˆ ˆ ‰ Ø�c .Ñ1Ô1Ð2Ð2Ô3ˆ à ð )Ø �LŠL˜Ñ Ô Ð Ý˜e Bœi™.œ.ˆKð+ ð)ð, ˆ"€I€I„I�Ñ€I€I�IØ,Ð 6ˆ;ˆ;°$Ð6rc ó¶—|jD�]O\}}|d ¦« d¦«s|dxxdz cc<|}d} | |¦«d}n-#t$r d}t j|¦«rd}d}nd}YnwxYw|r:tj  |d |¬ ¦«} d   ||| ¦«} n#d   |t|¦«¦«} t|d¦«t| ¦«zd z|kr|ddz| z|d<�Œ+t| ¦«dz|kr|  d| z¦«�Œ[d} |dz} |rët|¦«tt| ¦«¦«zdzt| ¦«z} || dzkrd}|| z dz x}} |d|…}tj  |d |¬ ¦«} t| ¦«|krn|d z}ŒF|  d  || | | ¦«¦«d } | d z } ||d…}|r|dxxdz cc<|°ë�ŒQdS)a>Fold TokenList 'part' into the 'lines' list as mime parameters. Using the decoded list of parameters and values, format them according to the RFC rules, including using RFC2231 encoding if the value cannot be expressed in 'encoding' and/or the parameter+value is too long to fit within 'maxlen'. rërMÚstrictFTr³rnr°r')Úsaferz {}*={}''{}r…rçrkrßrz''r&éNNz {}*{}*={}{})r}r(rarryrrzrtrur¨r6rrèr—r)rFr¬rÁror~rrŒÚ error_handlerÚencoding_requiredÚ encoded_valuerÆreÚ extra_chromerÑÚ splitpointÚmaxcharsÚpartials rr½r½› sä€ð”{ð:!ñ:!‰ ˆˆeð �RŒy×ÒÑ!Ô!×*Ò*¨3Ñ/Ô/ð Ø �"ˆIˆIŒI˜Ñ ˆIˆI‰IØˆØ ˆ ð "Ø �LŠL˜Ñ "Ô "Ð "Ø %Ð Ð øÝ!ð "ð "ð "Ø $Ð ÝÔ$ UÑ+Ô+ð "Ø(�Ø 1� � à!�øøð  "øøøð ð =Ý"œL×.Ò.ؘB }ð/ñ6ô6ˆMà×&Ò& t¨W°mÑDÔDˆDˆDà—>’> $­ °UÑ(;Ô(;Ñ<Ô<ˆDÝ ˆu�RŒy‰>Œ>�C ™IœIÑ %¨Ñ )¨FÒ 2Ð 2ؘbœ  C™¨$Ñ.ˆE�"‰IÙ Ý �‰YŒY˜‰]˜fÒ $Ð $Ø �LŠL˜˜t™Ñ $Ô $Ð $Ù ðˆØ ‘~ˆ Øð !ݘT™œ¥S­¨W©¬Ñ%6Ô%6Ñ6¸Ñ:½SÀÑ=NÔ=NÑNˆJؘ a™Ò'Ð'ð �Ø$*¨ZÑ$7¸!Ñ$;Ð ;ˆJ˜ð Ø     Ô,�Ý &¤ × 2Ò 2Ø "¨]ð!3ñ!<ô!<� å�}Ñ%Ô%¨Ò1Ð1ØØ˜a‘� ð  ð �LŠL˜×.Ò.Ø�g˜|¨]ñ<ô<ñ =ô =ð =àˆLØ �q‰LˆGؘ*˜+˜+Ô&ˆEØð !Ø�b� � ” ˜SÑ � � ‘ ð-ð !ùðI:!ð:!sÁA(Á('BÂB)rÙ)£rÂÚrer·rtÚstringrÚoperatorrÚemailrràrrr,rãrrr r-rÚ TSPECIALSrvÚ ASPECIALSr~r†r¼rºrrÚcompileÚVERBOSEÚ MULTILINErír¬rrhrtrxr|r€rƒr†r‰r�ržr¥r¯rÃrÎrÖrÜrãrørrrrrrr!r#r1r3r:rErKrOrZr]rdrgrjr‡r‹r‘r”r—r™r�rŸr¡rr¤r´r¹r½rÞrÁr>r6rErbr7r6r0rrËrÑÚmatchrûÚfindallrÅrrrzrƒrÉrÔrØréròrörørýrrrrr rrrrr!rr&r+r.r0r3r9r>r@rCrGrKrOrRrTrVrZr]rarerlrorsrxr|r€r„r‡r‹rŽr™rœrŸr¤r§rªr®rOr¾r½rlrrúrísžððCðCðJ € € € Ø € € € Ø € € € ØÐÐÐÐÐØÐÐÐÐÐØ'Ð'Ð'Ð'Ð'Ð'ØÐÐÐÐÐØÐÐÐÐÐð  €cˆ%�j„j€Ø�C�C˜‘H”H‰n€ Ø ˆ3ÐÑ Ô €Ø �s‰N€ ؘC˜C ™HœHÑ$€ à˜˜˜U™œÑ#€ Ø ˜˜˜E™ œ Ñ " c c¨#¡h¤hÑ .€ Ø ˜‰_€ Ø ˜˜˜E™ œ Ñ "€ ؘS‘€Ø(¨3¨3¨s©8¬8Ñ3ÐØ ˆtˆ €Ø ˜Ñ € ð@ð@ð@ð ððð �"”*ðð„Z�"”,Ññ ô €ð@,ð@,ð@,ð@,ð@,�ñ@,ô@,ð@,ðFDðDðDðDðD˜)ñDôDðDð ð ð ð ð ˜Iñ ô ð ðððððˆYñôððððððˆ9ñôððððððÐ"ñôððððððˆ9ñôððððððˆIñôðð ðððð�)ñôðð#ð#ð#ð#ð#�9ñ#ô#ð#ð6 -ð -ð -ð -ð -�|ñ -ô -ð -ðððððÐ!ñôðð4CðCðCðCðC�)ñCôCðCð&%ð%ð%ð%ð%ˆiñ%ô%ð%ð2 ?ð ?ð ?ð ?ð ?�)ñ ?ô ?ð ?ð%ð%ð%ð%ð%� ñ%ô%ð%ð"$ð$ð$ð$ð$ˆIñ$ô$ð$ð*"ð"ð"ð"ð"ˆyñ"ô"ð"ð6ðððð� ñôððDDðDðDðDðDˆyñDôDðDð!ð!ð!ð!ð!ˆiñ!ô!ð!ð6;ð;ð;ð;ð;�Yñ;ô;ð;ð.ð.ð.ð.ð.ˆYñ.ô.ð.ðððððˆiñôðððððð�)ñôðð ðððð�Iñôðð ððððˆyñôððBðððð�9ñôðð '!ð'!ð'!ð'!ð'!�&ñ'!ô'!ð'!ðT!ð!ð!ð!ð!� ñ!ô!ð!ðH ð ð ð ð �Iñ ô ð ð ðððð�)ñôðððððð� ñôðð8%ð%ð%ð%ð%�yñ%ô%ð%ð #ð#ð#ð#ð#� ñ#ô#ð#ðððððˆiñôðð ð ð ð ð ˆIñ ô ð ðS.ðS.ðS.ðS.ðS.�YñS.ôS.ðS.ðl ð ð ð ð ˜yñ ô ð ðððððÐ*ñôððððððÐ1ñôðð ðððð˜iñôðð ðððð�)ñôðð *ð*ð*ð*ð*ˆIñ*ô*ð*ððððð�ñôðð&ð&ð&ð&ð&�yñ&ô&ð&ðððððˆYñôðð(+ð(+ð(+ð(+ð(+ˆsñ(+ô(+ð(+ðVðððð˜ñôðððððð�HñôððððððÐ-ñôðð<ð<ð<ð<ð<�fÔ-ñ<ô<ð<ð€m�C˜ÑÔ€Ø� ˜cÐ#3Ñ4Ô4€ Ø#€ ÔØ %€ ÔØ$�} SÐ*BÑCÔCÐð.�” ˜:×,Ò,¨R¯WªW°S©\¬\Ñ:Ô:Ñ;Ô;ÔA€ Ø"˜œ  9×#3Ò#3Ø €B„Iˆb�gŠg�iÑ Ô Ñ!Ô!ñ$#ô$#ñ$ô$Ü$)ðà"˜œ Ð#5Ñ6Ô6Ô>ÐØ#˜œ I×$4Ò$4Ø €B„Iˆb�gŠg�jÑ!Ô!Ñ"Ô"ñ%$ô%$ñ%ô%Ü%*ðà'˜RœZ¨ ×(8Ò(8Ø €B„Iˆb�gŠg�nÑ%Ô%Ñ&Ô&ñ)(ô)(ñ)ô)Ü).ðà&0 b¤j°×1AÒ1AØ €B„Iˆb�gŠgÐ-Ñ.Ô.Ñ/Ô/ñ21ô21ñ'2ô'2Ü27ð$ð;ð;ð;ðJðJðJð< ð ð ð/ð/ð/ð/ðbAðAðAðFððð" ð ð ðððð ))ð))ð))ðVððð2 ð ð ð ð ð ð$ððð6 ð ð ð&ððð2 ð ð ðD$ð$ð$ðL%ð%ð%ðN-!ð-!ð-!ð^ððð(ððð%!ð%!ð%!ðN$ð$ð$ðLððð ' ð' ð' ðR,ð,ð,ð\ ð ð ðððð<ððð*"ð"ð"ð$6ð6ð6ðr#ð#ð#ðJððð<ððð:4ð4ð4ðn&ð&ð&ð,BðBðBðJððð8BðBðBðH$ð$ð$ð$ððð&ððð.ððð&ððð.ððð$ððð,ððð<ððð,LðLðLð\2ð2ð2ðh7ð7ð7ð 7ð7ð7ðrððð<ððð^ðððB7ðB7ðB7ðH?7ð?7ð?7ðBI!ðI!ðI!ðI!ðI!r