ÿØÿà JFIF    ÿÛ „  ( %"1!%)+...383,7(-.+  -+++--++++---+-+-----+---------------+---+-++7-----ÿÀ  ß â" ÿÄ     ÿÄ H    !1AQaq"‘¡2B±ÁÑð#R“Ò Tbr‚²á3csƒ’ÂñDS¢³$CÿÄ   ÿÄ %  !1AQa"23‘ÿÚ   ? ôÿ ¨pŸªáÿ —åYõõ\?àÒü©ŠÄï¨pŸªáÿ —åYõõ\?àÓü©ŠÄá 0Ÿªáÿ Ÿå[úƒ ú®ði~TÁbqÐ8OÕpÿ ƒOò¤Oè`–RÂáœá™êi€ßÉ< FtŸI“öÌ8úDf´°å}“¾œ6  öFá°y¥jñÇh†ˆ¢ã/ÃÐ:ªcÈ "Y¡ðÑl>ÿ ”ÏËte:qž\oäŠe÷󲍷˜HT4&ÿ ÓÐü6ö®¿øþßèô Ÿ•7Ñi’•j|“ñì>b…þS?*Óôÿ ÓÐü*h¥£ír¶ü UãS炟[AÐaè[ûª•õ&õj?†Éö+EzP—WeÒírJFt ‘BŒ†Ï‡%#tE Øz ¥OÛ«!1›üä±Í™%ºÍãö]°î(–:@<‹ŒÊö×òÆt¦ãº+‡¦%ÌÁ²h´OƒJŒtMÜ>ÀÜÊw3Y´•牋4ǍýʏTì>œú=Íwhyë,¾Ôò×õ¿ßÊa»«þˆѪQ|%6ž™A õ%:øj<>É—ÿ Å_ˆCbõ¥š±ý¯Ýƒï…¶|RëócÍf溪“t.СøTÿ *Ä¿-{†çàczůŽ_–^XþŒ±miB[X±d 1,é”zEù»& î9gœf™9Ð'.;—™i}!ôšåîqêÛ٤ёý£½ÆA–àôe"A$˝Úsäÿ ÷Û #°xŸëí(l »ý3—¥5m! rt`†0~'j2(]S¦¦kv,ÚÇ l¦øJA£Šƒ J3E8ÙiŽ:cÉžúeZ°€¯\®kÖ(79«Ž:¯X”¾³Š&¡* ….‰Ž(ÜíŸ2¥ª‡×Hi²TF¤ò[¨íÈRëÉ䢍mgÑ.Ÿ<öäS0í„ǹÁU´f#Vß;Õ–…P@3ío<ä-±»Ž.L|kªÀê›fÂ6@»eu‚|ÓaÞÆŸ…¨ááå>åŠ?cKü6ùTÍÆ”†sĤÚ;H2RÚ†õ\Ö·Ÿn'¾ ñ#ºI¤Å´%çÁ­‚â7›‹qT3Iï¨ÖÚ5I7Ë!ÅOóŸ¶øÝñØôת¦$Tcö‘[«Ö³šÒ';Aþ ¸èíg A2Z"i¸vdÄ÷.iõ®§)¿]¤À†–‡É&ä{V¶iŽ”.Ó×Õÿ û?h¬Mt–íª[ÿ Ñÿ ÌV(í}=ibÔ¡›¥¢±b Lô¥‡piη_Z<‡z§èŒ)iÖwiÇ 2hÙ3·=’d÷8éŽ1¦¸c¤µ€7›7Ø ð\á)} ¹fËí›pAÃL%âc2 í§æQz¿;T8sæ°qø)QFMð‰XŒÂ±N¢aF¨…8¯!U  Z©RÊ ÖPVÄÀÍin™Ì-GˆªÅËŠ›•zË}º±ŽÍFò¹}Uw×#ä5B¤{î}Ð<ÙD é©¤&‡ïDbàÁôMÁ." ¤‡ú*õ'VŽ|¼´Úgllº¼klz[Æüï÷Aób‡Eÿ dÑ»Xx9ÃÜ£ÁT/`¼¸vI±Ýµ·Ë‚“G³þ*Ÿû´r|*}<¨îºœ @¦mÄ’M¹”.œ«Y–|6ÏU¤jç¥ÕÞqO ˜kDÆÁ¨5ÿ š;ÐЦ¦€GÙk \ –Þ=â¼=SͧµªS°ÚÍpÜãQűÀõ¬?ÃÁ1Ñ•õZà?hóœ€ L¦l{Y*K˜Ù›zc˜–ˆâ ø+¾ ­-Ök¥%ùEÜA'}ˆ><ÊIè“bpÍ/qÞâvoX€w,\úªò6Z[XdÒæ­@Ö—€$òJí#é>'°Ú ôª˜<)4ryÙ£|óAÅn5žêŸyÒäMÝ2{"}‰–¤l÷ûWX\l¾Á¸góÉOÔ /óñB¤f¸çñ[.P˜ZsÊË*ßT܈§QN¢’¡¨§V¼(Üù*eÕ“”5T¨‹Âê¥FŒã½Dü[8'Ò¥a…Ú¶k7a *•›¼'Ò·\8¨ª\@\õ¢¦íq+DÙrmÎ…_ªæ»ŠÓœ¡¯’Ré9MÅ×D™lælffc+ŒÑ,ý™ÿ ¯þǤ=Å’Á7µ÷ÚÛ/“Ü€ñýã¼àí¾ÕÑ+ƒ,uµMâÀÄbm:ÒÎPæ{˜Gz[ƒ¯«® KHà`ߨŠéí¯P8Aq.C‰ à€kòpj´kN¶qô€…Õ,ÜNŠª-­{Zö’æû44‰sŽè‰îVíRœÕm" 6?³D9¡ÇTíÅꋇ`4«¸ÝÁô ï’ýorqКÇZ«x4Žâéþuïf¹µö[P ,Q£éaX±`PÉÍZ ¸äYúg üAx ’6Lê‚xÝÓ*äQ  Ï’¨hÍ =²,6ï#rÃ<¯–£»ƒ‹,–ê•€ aÛsñ'%Æ"®ÛüìBᝠHÚ3ß°©$“XnœÖ’î2ËTeûìxîß ¦å¿çÉ ðK§þ{‘t‚Ϋ¬jéîZ[ ”š7L¥4VÚCE×]m¤Øy”ä4-dz£œ§¸x.*ãÊÊ b÷•h:©‡¦s`BTÁRû¾g⻩‹jø sF¢àJøFl‘È•Xᓁà~*j¯ +(ÚÕ6-£¯÷GŠØy‚<Ç’.F‹Hœw(+)ÜÜâÈzÄäT§FߘãÏ;DmVœ3Àu@mÚüXÝü•3B¨òÌÁÛ<·ÃÜ z,Ì@õÅ·d2]ü8s÷IôÞ¯^Ç9¢u„~ëAŸï4«M? K]­ÅàPl@s_ p:°¬ZR”´›JC[CS.h‹ƒïËœ«Æ]–÷ó‚wR×k7X‰k›‘´ù¦=¡«‰¨¨Â')—71ó’c‡Ðúµ `é.{§p¹ój\Ž{1h{o±Ý=áUÊïGÖŒõ–-BÄm+AZX¶¡ ïHðæ¥JmÙ;…䡟ˆ¦ ° äšiÉg«$üMk5¤L“’çÊvïâï ,=f“"íἊ5ô¬x6{ɏžID0e¸vçmi'︧ºð9$ò¹÷*£’9ÿ ²TÔ…×>JV¥}Œ}$p[bÔ®*[jzS*8 ”·T›Í–ñUîƒwo$áè=LT™ç—~ô·¤ÈÚ$榍q‰„+´kFm)ž‹©i–ËqÞŠ‰à¶ü( ‚•§ •°ò·‡#5ª•µÊ﯅¡X¨šÁ*F#TXJÊ ušJVÍ&=iÄs1‚3•'fý§5Ñ<=[íÞ­ PÚ;ѱÌ_~Ä££8rÞ ²w;’hDT°>ÈG¬8Á²ÚzŽ®ò®qZcqJêäÞ-ö[ܘbň±çb“ж31²n×iƒðÕ;1¶þÉ ªX‰,ßqÏ$>•î íZ¥Z 1{ç൵+ƒÕµ¥°T$§K]á»Ûï*·¤tMI’ÂZbŽÕiÒ˜}bÓ0£ª5›¨ [5Ž^ÝœWøÂÝh° ¢OWun£¤5 a2Z.G2³YL]jåtì”ä ÁÓ‘%"©<Ôúʰsº UZvä‡ÄiÆÒM .÷V·™ø#kèýiíÌ–ª)µT[)BˆõÑ xB¾B€ÖT¨.¥~ð@VĶr#¸ü*åZNDŽH;âi ],©£öØpù(šºãö¼T.uCê•4@ÿ GÕÛ)Cx›®0ø#:ÏðFÒbR\(€€Ä®fã4Þ‰Fä¯HXƒÅ,†öEÑÔÜ]Öv²?tLÃvBY£ú6Êu5ÅAQ³1‘’¬x–HŒÐ‡ ^ ¸KwJôÖŽ5×CÚ¨vÜ«/B0$×k°=ðbÇ(Ï)w±A†Á† 11Í=èQšµ626ŒÜ/`G«µ<}—-Ö7KEHÈÉðóȤmݱû±·ø«Snmá=“䫚mݱŸ¡¶~ó·“äUóJæúòB|E LêŽy´jDÔ$G¢þÐñ7óR8ýÒ…Ç› WVe#·Ÿ p·Fx~•ݤF÷0Èÿ K¯æS<6’¡WШ; ´ÿ ¥Êø\Òuî†åÝ–VNœkÒ7oòX¨Á­Ø÷FÎÑä±g÷ÿ M~Çî=p,X´ ÝÌÚÅ‹’ÃjÖ.ØöÏñ qïQ¤ÓZE†° =6·]܈ s¸>v•Ž^Ý\wq9r‰Î\¸¡kURÒ$­*‹Nq?Þª*!sŠÆ:TU_u±T+øX¡ ®¹¡,ÄâÃBTsÜ$Ø›4m椴zÜK]’’›Pƒ @€#â˜`é¹=I‡fiV•Ôî“nRm+µFPOhÍ0B£ €+¬5c v•:P'ÒyÎ ‰V~‚Ó†ÖuókDoh$å\*ö%Ю=£«…aȼ½÷Û.-½VŒŠ¼'lyî±1¬3ó#ÞE¿ÔS¤gV£m›=§\û"—WU¤ÚǼÿ ÂnÁGŒÃ ‚õN D³õNÚíŒÕ;HôyÄÈ©P¹Ä{:?R‘Ô¨âF÷ø£bÅó® JS|‚R÷ivýáâ€Æé¡è³´IئÑT!§˜•ت‚¬â@q€wnïCWÄ@JU€ê¯m6]Ï:£âx'+ÒðXvÓ¦Úm=–´7œ $ì“B£~p%ÕŸUþ« N@¼üï~w˜ñø5®—'Ôe»¤5ã//€ž~‰Tþ›Å7•#¤× Íö pÄ$ùeåì*«ÓŠEØWEÈsßg ¦ûvžSsLpºÊW–âµEWöˬH; ™!CYõZ ÃÄf æ#1W. \uWâ\,\Çf j’<qTbên›Î[vxx£ë 'ö¨1›˜ÀM¼Pÿ H)ƒêêŒA7s,|F“ 꺸k³9Ìö*ç®;Ö!Ö$Eiž•¹ÒÚ†ýóéÝû¾ÕS®ó$’NÝäŸz¤5r¦ãÄÃD÷Üø!°ø‡Ô&@m™Ì^Ãä­d q5Lnÿ N;.6½·N|#ä"1Nƒx“ã<3('&ñßt  ~ªu”1Tb㫨9ê–›–bìd$ߣ=#ÕãÒmU¯eí$EFù5ýYô櫨æì™Ç—±ssM]·á¿0ÕåJRÓªîiƒ+O58ÖñªŠÒx" \µâá¨i’¤i —Ö ” M+M¤ë9‚‰A¦°Qõ¾ßøK~¼Ã‘g…Ö´~÷Ï[3GUœÒ½#…kàÔ®Ò”‰³·dWV‰IP‰Ú8u¹”E ÖqLj¾êÕCBš{A^Âß;–¨`¯¬ìö ˼ ×tìø.tƐm*n¨y4o&Àx¥n¦×î‡aupáÛj8¿m›è¶ã!o½;ß0y^ý×^EÑ¿ÒjzŒ­)vÚÑnÄL …^ªô× ‡—‚3k Îý­hï]içå–îÏ*÷ñþ»Ô CÒjøjÍznˆ´ ¹#b'Fô‹ ‰v¥'’à'T´ƒHýÍ%M‰ ƒ&ÆÇŒï1 ‘ –Þ ‰i¬s žR-Ÿ kЬá¬7:þ 0ŒÅÒÕ/aÙ¬ÃÝ#Úøœ ©aiVc‰. ¹¦ãµ” ›Yg¦›ÆÎýº°f³7ƒhá·¸­}&D9¡ÂsÉÙÞèŠõØàC™¨ñbFC|´Ü(ŸƒÚÒ-%»'a Ì¿)ËÇn¿úÿ ÞŽX…4ÊÅH^ôΑí@ù¹Eh¶“L8Çjù ¼ÎåVªóR©Ï5uà V4lZß®=€xÖŸ–ÑÈ ÷”¨°¾__yM1tÉ?uÆþIkÄgæ@þ[¢†°XÃJ£j·:nkÅ¢u ‘}âGzö­/IµèЬ¼48q¦F°ŽR¼=ûì{´¯RýicS ÕÛ íNtÍÙï£,w4rêì®»~x(©Uñ§#Ñ&œÕ¤>ÎåÍÓ9’Ö{9eV­[Öjâ²ãu]˜å2›qÑšÕJç0€sÄ|Êëè0튔bÁ>“{×_F`Ø©ºê:µä,v¤ðfc1±"«ÔÍän1#=· Âøv~H½ÐßA¾¿Ü€Óš]Õ; I¾÷ç‚Qi†î¹9ywÔKG˜áñ zQY—§ÃÕZ07§X‚ Áh;ÁM)iÌCH-¯T‘ë|A0{Ò½LÚ–TâÖkÜ’dÀ“rmm»”جPF³ÖcbE§T€ÒxKºû’Ó®7±²(\4ŽÃ¸Uu@j™yĵ;³µ!Á¢b.W¤=mõ´êµK k ¸K^ÜÛ#p*Ü14qkZç5ïë †°5Ï%ÍÛ<Õ¤×Ô¥ê†C Õ´¼ú$ƒÖ“”]Ù¬qÞÚ[4©ý!ûÏ—Áb쳐XµA¬â~`›Çr¸8ìùÝ䫦<>ä÷«?xs´ÇÑ /á;¹øüÊÈÙà{"@Žïzâ¬[âß‚ U_<ÇŸ½4èN˜ú61®qŠu ¦þF£»äJ_ˆÙÎ~ ÞAã–݄ϗrŠD;xTž‘ô`É«…suãO`?³à™ô Lý#Íc5öoæØ‚y´´÷«ZR§<&JÇ+éâô´€i!Àˆ0æAoàðLèÖ-2ŸõW.’t^–(KÁmHµV@xÜÇy®Ñø­â^:Ú3w· 7½¹°ñ¸â¹®:',«Mœ—n­Á+Ãbš LÈ‘ÄnRÓÅœ%¦²‰¨ùQ:¤f‚ "PÕtô¸…cæl…&˜Ú˜Ôkv‹ž+vŠ,=¢v­6—Xy*¥t£«<™:“aîϲ=¦6rO]XI¿Œ÷¤zÚ­›¶ 6÷”w\d ü~v®ˆÌk«^m<ÿ ¢‰Õ\)ùºŽ;… lîÙÅEŠ®cѾ@vnMÏ,¼“ñ•ŽBxðÃzãÇç%3ˆ"}Ù•Åî> BÉú;Ò]V+P˜F_´ßé> Øše|ï‡ÄOmFæÇ ãqÞ$/xÐx­z`ï9"œÜij‚!7.\Td…9M‡•iŽ‹¾‘50ÞŽn¥ß4ÉôO ¹*í^QêËÜÇÌ8=ާs‰'ÂëÙ«á%Pú[O †ÅP¯Vsް.‰,kc¶ ¬A9n˜XÎ-ÞšN["¹QÕ‰ƒMýÁߺXJæÍaLj¾×Ãmã¾ãÚ uñÒþåQô¦¥ /ÄUx:‚ÍÜ’ Đ©ØÝ3V¨‰ÕnÐ6ó*óúK­«…c ¯U òhsý­jóÔj#,ímŒRµ«lbïUTŒÑ8†Ä0œÏr`ð¡¬É Ї ë"À² ™ 6¥ f¶ ¢ÚoܱԷ-<Àî)†a¶ž'Ú»¨TXqØæ¶÷YÄHy˜9ÈIW­YÀuMFë ºÏ’AqÌ4·/Ú †ô'i$øä­=Ä Ý|öK×40è|È6p‘0§)o¥ctî§H+CA-“ xØ|ÐXАç l8íºð3Ø:³¤¬KX¯UÿÙ U ^E3@sRdZddlZddlZddlZddlZddlZddlZddlZddlZddl Zddl Zddl Z ddl Z z ddl Z Wnek rdZ YnXddddddd d d d d ddddddgZejdZGdddZGdddeZGdddeZGdddeZGdddeZGdddeZGdddeZGdddeZGdd d ejjZGd d d eZGd!d"d"eZGd#d d eZGd$d d eZGd%d d eZ Gd&ddeZ!Gd'd(d(Z"Gd)d*d*e"Z#d=d,d-Z$d.d/Z%d0d1Z&d2d3Z'd4d5Z(d6d7Z)Gd8dde*Z+Gd9dde+Z,Gd:dde+Z-Gd;dde+Z.GdzDRead/write support for Maildir, mbox, MH, Babyl, and MMDF mailboxes.NMailboxMaildirmboxMHBabylMMDFMessageMaildirMessage mboxMessage MHMessage BabylMessage MMDFMessageErrorNoSuchMailboxError NotEmptyErrorExternalClashError FormatErrorasciic@seZdZdZdCddZddZdd Zd d Zd d ZddZ dDddZ ddZ ddZ ddZ ddZddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.d/ZdEd0d1Zd2d3ZdFd4d5Zd6d7Zd8d9Zd:d;Zdd?Z!d@Z"dGdAdBZ#dS)Hrz*A group of messages in a particular place.NTcCs tjtj||_||_dS)zInitialize a Mailbox instance.N)ospathabspath expanduser_path_factoryselfrfactorycreater/usr/lib/python3.8/mailbox.py__init__$szMailbox.__init__cCs tddS)$Add message and return assigned key.&Method must be implemented by subclassNNotImplementedErrorrmessagerrradd)sz Mailbox.addcCs tddS)=Remove the keyed message; raise KeyError if it doesn't exist.r"Nr#rkeyrrrremove-szMailbox.removecCs||dSN)r+r)rrr __delitem__1szMailbox.__delitem__cCs(z||Wntk r"YnXdSz'If the keyed message exists, remove it.N)r+KeyErrorr)rrrdiscard4szMailbox.discardcCs tddS)>Replace the keyed message; raise KeyError if it doesn't exist.r"Nr#rr*r&rrr __setitem__;szMailbox.__setitem__cCs*z ||WStk r$|YSXdS)z9Return the keyed message, or default if it doesn't exist.N) __getitem__r/)rr*defaultrrrget?s z Mailbox.getc CsB|js||St||}||W5QRSQRXdS)z=Return the keyed message; raise KeyError if it doesn't exist.N)r get_message contextlibclosingget_file)rr*filerrrr4Fs zMailbox.__getitem__cCs tddS)4Return a Message representation or raise a KeyError.r"Nr#r)rrrr7NszMailbox.get_messagecCst||S)zReturn a string representation or raise a KeyError. Uses email.message.Message to create a 7bit clean string representation of the message.emailmessage_from_bytes get_bytesZ as_stringr)rrr get_stringRszMailbox.get_stringcCs tddS)z8Return a byte string representation or raise a KeyError.r"Nr#r)rrrr@YszMailbox.get_bytescCs tddS)6Return a file-like representation or raise a KeyError.r"Nr#r)rrrr:]szMailbox.get_filecCs tddS)Return an iterator over keys.r"Nr#rrrriterkeysaszMailbox.iterkeyscCs t|S)zReturn a list of keys.)listrErDrrrkeysesz Mailbox.keysc cs>|D]0}z ||}Wntk r0YqYnX|VqdS)z%Return an iterator over all messages.NrEr/rr*valuerrr itervaluesis    zMailbox.itervaluescCs|Sr,)rKrDrrr__iter__rszMailbox.__iter__cCs t|S)z,Return a list of messages. Memory intensive.)rFrKrDrrrvaluesuszMailbox.valuesc csB|D]4}z ||}Wntk r0YqYnX||fVqdS)z.Return an iterator over (key, message) tuples.NrHrIrrr iteritemsys    zMailbox.iteritemscCs t|S)z9Return a list of (key, message) tuples. Memory intensive.)rFrNrDrrritemssz Mailbox.itemscCs tddS)9Return True if the keyed message exists, False otherwise.r"Nr#r)rrr __contains__szMailbox.__contains__cCs tddS)*Return a count of messages in the mailbox.r"Nr#rDrrr__len__szMailbox.__len__cCs|D]}||qdS)zDelete all messages.N)rGr0r)rrrclears z Mailbox.clearcCs4z ||}Wntk r$|YSX|||S)z3Delete the keyed message and return it, or default.)r/r0)rr*r5resultrrrpops    z Mailbox.popcCs*|D]}|||fStddS)z6Delete an arbitrary (key, message) pair and return it.zNo messages in mailboxN)rErVr/r)rrrpopitems zMailbox.popitemc Cstt|dr|}nt|dr(|}n|}d}|D].\}}z |||<Wq4tk r`d}Yq4Xq4|rptddS)z4Change the messages that correspond to certain keys.rNrOFTzNo message with key(s)N)hasattrrNrOr/)rargsourceZbad_keyr*r&rrrupdates       zMailbox.updatecCs tddS)&Write any pending changes to the disk.r"Nr#rDrrrflushsz Mailbox.flushcCs tddS)Lock the mailbox.r"Nr#rDrrrlocksz Mailbox.lockcCs tddS)#Unlock the mailbox if it is locked.r"Nr#rDrrrunlockszMailbox.unlockcCs tddS)Flush and close the mailbox.r"Nr#rDrrrclosesz Mailbox.closecCs.z |dWStk r(tdYnXdS)Nrz?String input must be ASCII-only; use bytes or a Message instead)encode UnicodeError ValueErrorr%rrr_string_to_bytess zMailbox._string_to_bytesFc Cst|tjjrvt}tj||d}||| d| }| dt }| ||jrr|t sr| t nt|tttjfrt|tjrtdtd|}t|tr||}|r| dd}| dt }| ||jr|t s| t nt|drt|dr2td td|j}d }|}|d r\|d d d}n|d rx|d dd}|sq|r|drd|dd }| dt }| ||}q6|jr|r|t s| t ntdt|d S)z%Dump message contents to target file.r 8Use of StringIO input is deprecated, use BytesIO insteads From s >From readbufferDUse of text mode files is deprecated, use a binary mode file insteadN  From s>From Invalid message type: %s) isinstancer>r&rioBytesIO generatorBytesGeneratorflattenseekrkreplacelinesepwrite_append_newlineendswithstrbytesStringIOwarningswarnDeprecationWarninggetvaluergrXrlreadline startswith TypeErrortype) rr&targetZ mangle_from_rlgendataZlastlinelinerrr _dump_messages`                  zMailbox._dump_message)NT)N)N)N)F)$__name__ __module__ __qualname____doc__r r'r+r-r0r3r6r4r7rAr@r:rErGrKrLrMrNrOrQrSrTrVrWr[r]r_rarcrgrrrrrrr!sB       c@seZdZdZdZd6ddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-Zd.d/Zd0d1Zd2d3Zd4d5ZdS)7rzA qmail-style Maildir mailbox.:NTcCst||||tj|jdtj|jdtj|jdd|_tj|js|rt|jd|j D]}t|dqln t |ji|_ ddd|_ d|_ d|_d S) zInitialize a Maildir instance.tmpnewcur)rrrr)rrg?N)rr rrjoinr_pathsexistsmkdirrMr_toc _toc_mtimes _last_read _skewfactor)rdirnamerrrrrrr s  zMaildir.__init__c Cs~|}z|||Wn*tk rB|t|jYnXt|t|t r|| }|j | }||j krd}nd}d}tj |j|j d}tj |j|||}t|t rt|jtj |j|fzLzt|j|Wn(ttfk rt|j|YnXt|jWnNtk rx}z.t|j|jtjkrftd|nW5d}~XYnX|S)r!rrz$Name clash with existing message: %sN) _create_tmpr BaseExceptionrcrr+name _sync_closerur get_subdircolonget_inforbasenamesplitrrutimegetatimeget_datelinkAttributeErrorPermissionErrorrenameOSErrorerrnoZEEXISTr)rr&Ztmp_filesubdirsuffixuniqdesterrrr'!sF     z Maildir.addcCs ttj|j||dSr(N)rr+rrr_lookupr)rrrr+KszMaildir.removec Cs,z||Wnttfk r&YnXdSr.)r+r/FileNotFoundErrorr)rrrr0OszMaildir.discardc Cs||}||}||}t|tr.|}n|}tj|}|j|kr`|j||jd}nd}| |tj |j |} tj |j |||} t|trt | tj | |ft| | dS)r1rqrN)rr'rur rrrrrr0rrrrrr) rr*r&Z old_subpathZtemp_keyZ temp_subpathZdominant_subpathrrZtmp_pathnew_pathrrrr3Ws$        zMaildir.__setitem__c Cs||}ttj|j|d }|jr4||}nt|}W5QRXtj|\}}| ||j |kr| ||j d| tj tj|j||S)r<rbrq)ropenrrrrrr r set_subdirrset_infoset_dategetmtime)rr*Zsubpathfmsgrrrrrr7rs    zMaildir.get_messagec CsDttj|j||d}|tdW5QRSQRXdS)2Return a bytes representation or raise a KeyError.rrhN) rrrrrrrkr|r}rr*rrrrr@szMaildir.get_bytescCs$ttj|j||d}t|S)rBr)rrrrrr _ProxyFilerrrrr:szMaildir.get_filec csF||jD]2}z||Wntk r8YqYnX|VqdSrCN)_refreshrrr/r)rrrrEs  zMaildir.iterkeyscCs|||jkSrP)rrr)rrrrQszMaildir.__contains__cCs|t|jSrR)rlenrrDrrrrSszMaildir.__len__cCsdS)"Write any pending changes to disk.NrrDrrrr]sz Maildir.flushcCsdS)r^NrrDrrrr_sz Maildir.lockcCsdS)r`NrrDrrrraszMaildir.unlockcCsdSrbNrrDrrrrcsz Maildir.closecCs\g}t|jD]F}t|dkr|ddkrtjtj|j|r||ddq|S)Return a list of folder names.r.N)rlistdirrrrisdirrappendrrUentryrrr list_foldersszMaildir.list_folderscCs ttj|jd||jddS)z/Return a Maildir instance for the named folder.rFrr)rrrrrrrfolderrrr get_folderszMaildir.get_foldercCs\tj|jd|}t||jd}tj|d}tj|sXtt|tj tj Bd|S)z>Create a folder and return a Maildir instance representing it.rrZ maildirfolder) rrrrrrrrcrO_CREATO_WRONLY)rrrrUZmaildirfolder_pathrrr add_folders zMaildir.add_foldercCstj|jd|}ttj|dttj|dD](}t|dksX|ddkrs"  @ rc@sBeZdZdZdZddZdddZddd Zdd d Zd d Z dS) _mboxMMDFzAn mbox or MMDF mailbox.TcCsp||\}}|j||jtd}|j||j}||td}| |dd d|S)r<rhrsNr) rrr{rr|r}rkr_message_factoryset_fromdecode)rr*rr from_linestringrrrrr7s z_mboxMMDF.get_messageFcCst|||j|dS)3Return a string representation or raise a KeyError.)unixfromr=)rr*from_rrrrAs  z_mboxMMDF.get_stringcCsJ||\}}|j||s(|j|j||j}|tdS)r,rh)rrr{rrkrr|r})rr*r.rrr+rrrr@s   z_mboxMMDF.get_bytescCs<||\}}|j||s(|jt|j|j|S)rB)rrr{r _PartialFiler)rr*r.rrrrrr:s   z_mboxMMDF.get_filecCs d}t|tr||}t|trf|drf|d}|dkr\|d|}||dd}q|}d}nJt|tr|d}d|}n(t|t j j r| }|dk r|d}|dkrdt t }|j}|j|t|||j|j|j}||fS) z1Format a message and blindly write to self._file.Nrrrhrqrr&rsFrom MAILER-DAEMON )rurrgrrfind_mboxMMDFMessageget_fromrdr>r&r get_unixfromrasctimegmtimerrr~r}r _mangle_from_)rr&r*newlineZauthorrrrrrr#&s0         z_mboxMMDF._install_messageN)F)F)F) rrrrr6r7rAr@r:r#rrrrr%s  r%c@s2eZdZdZdZdZd ddZddZdd ZdS) rzA classic mbox mailbox.TNcCst|_t||||dS)zInitialize an mbox mailbox.N)r r'r%r rrrrr Lsz mbox.__init__cCs|tdSr r~r}rrrrrQszmbox._post_message_hookcCsgg}}d}|jd|j}|j}|drzt|t|krj|r`||ttn ||||d}q|s|r||ttq||qq|tkrd}qd}qtt t |||_ t|j |_ |j|_ dS)0Generate key-to-(start, stop) table of contents.FrrrTN)rr{rrrrrr}dict enumerateziprrr)rstartsstopsZlast_was_emptyline_posrrrrr"Us.         zmbox._generate_toc)NT) rrrrr6rr rr"rrrrrCs  c@s2eZdZdZd ddZddZdd Zd d ZdS) rzAn MMDF mailbox.NTcCst|_t||||dS)zInitialize an MMDF mailbox.N)r r'r%r rrrrr zsz MMDF.__init__cCs|dtdS)rNr8rrrrrszMMDF._pre_message_hookcCs|tdtdS)r!r@Nr8rrrrrszMMDF._post_message_hookcCsgg}}|jdd}|}|j}|j}|dtr|||}|j}|j}|dtkr||ttqqJ|sJ||qqJq|sqqtt t |||_ t|j |_ |jdd|j|_ dS)r9rr@rN)rr{rrrr}rrr:r;r<rrr)rr=r>next_posr?rrrrr"s.          zMMDF._generate_toc)NT)rrrrr rrr"rrrrrws  c@seZdZdZd0ddZddZdd Zd d Zd d ZddZ ddZ ddZ ddZ ddZ ddZddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.d/ZdS)1rzAn MH mailbox.NTcCstt||||tj|jsj|r`t|jdtttj |jdtj tj Btj Bdn t |jd|_dS)zInitialize an MH instance.r .mh_sequencesiFN)rr rrrrrrcrrrO_EXCLrrrrrrrr s z MH.__init__cCs|}t|dkrd}n t|d}tj|jt|}t|}d}z|j rVt |zfz| ||Wn:tk r|j rt |t |d}t|YnXt|tr|||W5|j rt |XW5|st |X|S)r!rrFT)rGrmaxrrrrrrrrr r rrr+rur _dump_sequences)rr&rGZnew_keyrrclosedrrrr's6     zMH.addc Csxtj|jt|}zt|d}Wn>tk r`}z |jtjkrNt d|nW5d}~XYnX| t |dS)r(rrN) rrrrrrrrrr/rcr+)rr*rrrrrrr+s z MH.removec Cstj|jt|}zt|d}Wn>tk r`}z |jtjkrNt d|nW5d}~XYnXzd|j rrt |z@tt|tjtjB|||t|tr|||W5|j rt |XW5t |XdS)r1rrN)rrrrrrrrrr/rrr r rcrO_TRUNCrrur rE)rr*r&rrrrrrr3s$   zMH.__setitem__c Csz@|jr$ttj|jt|d}nttj|jt|d}Wn>tk r~}z |jtj krlt d|nW5d}~XYnX|2|jrt |z t |}W5|jrt |XW5QRX|D]\}}||kr||q|S)r<rrrN)rrrrrrrrrrr/r r r get_sequencesrO add_sequence)rr*rrrrkey_listrrrr7s&   zMH.get_messagec Csz@|jr$ttj|jt|d}nttj|jt|d}Wn>tk r~}z |jtj krlt d|nW5d}~XYnX|F|jrt |z | tdWW5QRS|jrt |XW5QRXdS)rrrrNrh)rrrrrrrrrrr/r r rkr|r}rr*rrrrrr@s  z MH.get_bytesc Csfzttj|jt|d}Wn>tk r\}z |jtjkrJt d|nW5d}~XYnXt |S)rBrrN) rrrrrrrrrr/rrKrrrr:)s z MH.get_filecCsttddt|jDS)rCcss|]}|rt|VqdSr,)isdigitr).0rrrr 6szMH.iterkeys..)iterrrrrrDrrrrE4sz MH.iterkeyscCstjtj|jt|Sr)rrrrrrr)rrrrQ9szMH.__contains__cCstt|Sr)rrFrErDrrrrS=sz MH.__len__cCs2|js.ttj|jdd|_t|jd|_dS)r^rBrTN)rrrrrrrr rDrrrr_As zMH.lockcCs(|jr$t|jt|j|`d|_dSr )rr rrrDrrrraHs   z MH.unlockcCsdS)r\NrrDrrrr]PszMH.flushcCs|jr|dSr)rrarDrrrrcTszMH.closecCs<g}t|jD]&}tjtj|j|r||q|S)r)rrrrrrrrrrrrYs  zMH.list_folderscCsttj|j||jddS)z+Return an MH instance for the named folder.Frrrrrrrrrrrrasz MH.get_foldercCsttj|j||jdS)z:Create a folder and return an MH instance representing it.rrPrrrrrfsz MH.add_foldercCs`tj|j|}t|}|dgkr:ttj|dn|gkrDntd|jt|dS)rrBzFolder not empty: %sN)rrrrrr+rr)rrrentriesrrrrks  zMH.remove_folderc si}ttj|jdddd}t||D]}z|d\}}t}|D]H}|rn| t |qRdd|dD\}} | t || d qRfd d t |D||<t||d kr||=Wq0tk rtd |Yq0Xq0W5QRX|S)z=Return a name-to-key-list dictionary to define each sequence.rBrASCIIencodingrcss|]}t|VqdSr,)r)rMxrrrrNsz#MH.get_sequences..-rcsg|]}|kr|qSrr)rMr*Zall_keysrr sz$MH.get_sequences..rz"Invalid sequence specification: %s)rrrrrsetrGrrLr'rr[rangerrrfrrstrip) rZresultsrrrcontentsrGspecrrrrXrrHws(   zMH.get_sequencescCsttj|jdddd}ztt|jtjtj B| D]\}}t |dkrVq@| |dd}d}t t|D]R}|d |kr|sd }| d n*|rd}| d ||fn| d ||}qx|r| t|dq@| dq@W5t|XdS)z:Set sequences using the given name-to-key-list dictionary.rBzr+rSrTrrNFrTrWz%s %sz %s )rrrrrrrcrrrGrOrr~rrZr)r sequencesrrrGprevZ completingr*rrr set_sequencess.   zMH.set_sequencesc Cs>|}d}g}|D]}|d|kr|||dfz4ttj|jt|tj|jt|dWnHt t fk rt tj|jt|tj|jt|dYnXt tj|jt||d7}q|d|_ t|dkrdS|D]0\}}|D]"\}}||kr ||||<q q||dS)z?Re-name messages to eliminate numbering gaps. Invalidates keys.rrN)rHrErrrrrrrrrrunlinkrrrOindexrb) rr`raZchangesr*rrJoldrrrrpacks0        zMH.packcCst|}|}|D]0\}}||kr4||q||kr|||=q|D]}||krN|g||<qN||dS)z;Inspect a new MHMessage and update sequences appropriately.N)rHrOrrdrb)rr&r*Zpending_sequencesZ all_sequencesrrJsequencerrrrEs  zMH._dump_sequences)NT)rrrrr r'r+r3r7r@r:rErQrSr_rar]rcrrrrrHrbrfrErrrrrs. "  c@seZdZdZedddddddhZd%d d Zd dZddZddZ ddZ ddZ ddZ ddZ ddZddZdd Zd!d"Zd#d$Zd S)&rzAn Rmail-style Babyl mailbox.unseendeletedZfiledanswered forwardedZeditedresentNTcCst||||i|_dS)zInitialize a Babyl mailbox.N)rr _labelsrrrrr szBabyl.__init__cCs(t||}t|tr$||j|<|S)r!)rr'rur get_labelsrm)rr&r*rrrr's  z Babyl.addcCs"t||||jkr|j|=dSr)rr+rmr)rrrr+s  z Babyl.removecCs*t|||t|tr&||j|<dS)r1N)rr3rur rnrmr2rrrr3s zBabyl.__setitem__c Cs||\}}|j||jt}|j}|dtks\|sHq\||tdq,t}|j}|tks|s|q||tdqd||j }|dkst |j |}|td}t | |} | | ||jkr| |j|| S)r< *** EOOH ***rhr)rrr{rrvrwr}r~r|rrrkr r set_visiblerm set_labels) rr*rroriginal_headersrZvisible_headersnZbodyrrrrr7s,         zBabyl.get_messagec Cs||\}}|j||jt}|j}|dtks\|sHq\||tdq,|j}|tksv|s\qvq\| }||j }|dkst |j |}|td}||S)r,rorhr) rrr{rrvrwr}r~r|rrrrk) rr*rrrrrZheadersrsrrrrr@s"        zBabyl.get_bytescCst||dtS)rBrh)rvrwr@r|r}r)rrrr:%szBabyl.get_filecCs<|t}|jD]}||q||jt|S)z4Return a list of user-defined labels in the mailbox.)rrZrmrMr[difference_update_special_labelsrF)rlabelsZ label_listrrrrn)s   zBabyl.get_labelscCs:gg}}|jdd}g}|}|j}|j}|dtkrt|t|krd||tt||dd|jdddD}||q|dks|dtkrt|t|kr||ttq|s||ttqqtt t |||_ tt ||_ t|j |_ |jdd |j|_dS) r9rs cSsg|]}|r|qSr)striprMlabelrrrrY@sz'Babyl._generate_toc..rN,r)rr{rrr}rrrr:r;r<rrmrr)rr=r>rAZ label_listsr?rrvrrrr"2s4        zBabyl._generate_toccCsVdt}|dt7}|}dd|D}|dd|t7}|d7}||dS) rsBABYL OPTIONS:s Version: 5css|]}|VqdSr,)rdrxrrrrNUsz*Babyl._pre_mailbox_hook..sLabels:rzr{N)r}rnrr~)rrZbabylrvrrrrPs zBabyl._pre_mailbox_hookcCs|dtdS)r Nr8rrrrrZszBabyl._pre_message_hookcCs|tddS)r!r{Nr8rrrrr^szBabyl._post_message_hookcCsx|j}t|trg}g}|D]$}||jkr>||q$||q$|jd|D]}|jd|qZ|jd|D]}|jd|dq|jt n|jdt t|t j j rt }t j|dd}|||d|}|j|d t |d ks,|sq,q|jd t t|trt } t j| dd} | || }|j|d t |d ks|snqqnn>|d|}|j|d t |d ks|sqq|d } | sqf|j| d t qnTt|ttt jfrt|t jrJtd td |}t|tr`||}|dd} | ddkr|j|d| d t |jd t |j|d| d t |j|| dd t n(|jd t t |j|d t nXt |drVt |dr:tdtd |j!}|} d}|}|"drl|ddd }n|"dr|ddd }|j|d t |d ks|sF|rd}|jd t || nqڐqF|}|sqf|"dr |ddt }n:|"dr(|ddt }n|"d rD|ddt }|j|qnt#dt$||j}||fS)z0Write message contents and return (start, stop).1s, s,, rzs1,,Frrhror rirjs rrqNrrlrmTrnrorprt)%rrrur rnrurr~rdr}r>r&rrvrwrxryrzr{rr| get_visiblerkrrrrrrrrgr0rXrlrrr)rr&rZspecial_labelsrvryZ orig_bufferZorig_generatorrZ vis_bufferZ vis_generatorrlZ body_startZ original_posZ first_passrrrrr#bs                         zBabyl._install_message)NT)rrrr frozensetrur r'r+r3r7r@r:rnr"rrrr#rrrrrs&    c@s*eZdZdZd ddZddZddZdS) rz0Message with mailbox-format-specific properties.NcCst|tjjr4|t|t|tr||nt|trP|t |n~t|t rl|t |nbt|t j r|t|nDt|dr|t|n(|dkrtjj|ntdt|dS)zInitialize a Message instance.rkNrt)rur>r&r_become_messagecopyZdeepcopy _explain_torr?rZmessage_from_stringrv TextIOWrapperZmessage_from_filerXZmessage_from_binary_filer rrr%rrrr s      zMessage.__init__cCs4t|dg}|jD]}||kr|j||j|<qdS)z0Assume the non-format-specific state of message._type_specific_attributesN)getattr__dict__)rr&Z type_specificrrrrrs  zMessage._become_messagecCst|trdStddS)z:Copy format-specific state to message insofar as possible.Nz Cannot convert to specified type)rurrr%rrrrs zMessage._explain_to)N)rrrrr rrrrrrrs c@s|eZdZdZdddgZdddZdd Zd d Zd d ZddZ ddZ ddZ ddZ ddZ ddZddZddZdS)r z)Message with Maildir-specific properties._subdir_info_dateNcCs&d|_d|_t|_t||dS)z%Initialize a MaildirMessage instance.rrN)rrrrrr r%rrrr s zMaildirMessage.__init__cCs|jS)zReturn 'new' or 'cur'.)rrDrrrrszMaildirMessage.get_subdircCs(|dks|dkr||_n td|dS)zSet subdir to 'new' or 'cur'.rrz!subdir must be 'new' or 'cur': %sN)rrf)rrrrrrszMaildirMessage.set_subdircCs"|jdr|jddSdSdS)*Return as a string the flags that are set.2,rNr)rrrDrrr get_flags s zMaildirMessage.get_flagscCsddt||_dS))Set the given flags and unset all others.rrN)rrr)rflagsrrr set_flagsszMaildirMessage.set_flagscCs$|dt|t|BdSz.Set the given flag(s) without changing others.rNrrrZrrflagrrradd_flagszMaildirMessage.add_flagcCs,|r(|dt|t|dS)7Unset the given string flag(s) without changing others.rN)rrrrZrrrr remove_flagszMaildirMessage.remove_flagcCs|jS)zr&rr3rr )rr&r-rrrr es  z_mboxMMDFMessage.__init__cCs|jS)z Return contents of "From " line.)rrDrrrr2nsz_mboxMMDFMessage.get_fromcCs4|dk r*|dkrt}|dt|7}||_dS)z>Set "From " line, formatting and appending time_ if specified.NT )rr5r4r)rr.Ztime_rrrr(rs z_mboxMMDFMessage.set_fromcCs|dd|ddS)rStatusrX-Status)r6rDrrrrzsz_mboxMMDFMessage.get_flagscCst|}d\}}dD]}||kr||7}||qdD]}||kr8||7}||q8|dt|7}z|d|Wn tk r|d|YnXz|d|Wn tk r|d|YnXdS)r)rr)rr)rrrrrrN)rZr+rrreplace_headerr/Z add_header)rrZ status_flagsZ xstatus_flagsrrrrr~s&  z_mboxMMDFMessage.set_flagscCs$|dt|t|BdSrrrrrrrsz_mboxMMDFMessage.add_flagcCs4d|ksd|kr0|dt|t|dS)rrrrNrrrrrrsz_mboxMMDFMessage.remove_flagc Cst|trt|}d|kr(|dd|kr:|dd|krL|dd|kr^|dd|krp|d|d =|d =d |d d }z| t t |dWnttfk rYnXn t|tr||||nt|trZt|}d|kr$|dd|kr8|dd|krL|d|d =|d =nt|trt|}d|kr|dd|kr|dd|kr|d|d =|d =nt|trntdt|d S)zACopy mbox- or MMDF-specific state to message insofar as possible.rrrrrrrrZstatuszx-statusrNz%a %b %d %H:%M:%S %Yrhrrrirjr)rur rZrrrrr2rrcalendarZtimegmrstrptimerf OverflowErrorr1rr(r rIr rrrr)rr&rZ maybe_daterrrrsb                           z_mboxMMDFMessage._explain_to)N)N) rrrrrr r2r(rrrrrrrrrr1`s  r1c@seZdZdZdS)r z&Message with mbox-specific properties.Nrrrrrrrrr sc@sHeZdZdZdgZdddZddZdd Zd d Zd d Z ddZ dS)r z$Message with MH-specific properties. _sequencesNcCsg|_t||dS)z!Initialize an MHMessage instance.N)rrr r%rrrr szMHMessage.__init__cCs|jddS)z4Return a list of sequences that include the message.N)rrDrrrrHszMHMessage.get_sequencescCst||_dS)z3Set the list of sequences that include the message.N)rFr)rr`rrrrbszMHMessage.set_sequencescCs6t|tr"||jkr2|j|ntdt|dS)z8Add sequence to list of sequences including the message.zsequence type must be str: %sN)rurrrrrrrgrrrrIs  zMHMessage.add_sequencecCs*z|j|Wntk r$YnXdS)zARemove sequence from the list of sequences including the message.N)rr+rfrrrrremove_sequenceszMHMessage.remove_sequencecCsFt|trdt|}d|kr*|dn|d|dd|krP|dd|krb|dnt|trt|}d|kr|dn |d d|kr|dd|kr|d nt|tr|D]}||qn`t|t r$t|}d|kr| dd|krB| d nt|t r2nt d t |d S)z6Copy MH-specific state to message insofar as possible.rhrrrrrrROrrrjrN)rur rZrHrrr1r rIr rrrr)rr&r`rgrrrrsB                      zMHMessage._explain_to)N) rrrrrr rHrbrIrrrrrrr s c@sbeZdZdZddgZdddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ dS)r z'Message with Babyl-specific properties.rm_visibleNcCsg|_t|_t||dS)z#Initialize a BabylMessage instance.N)rmrrr r%rrrr "szBabylMessage.__init__cCs|jddS)z'Return a list of labels on the message.N)rmrDrrrrn(szBabylMessage.get_labelscCst||_dS)z&Set the list of labels on the message.N)rFrm)rrvrrrrq,szBabylMessage.set_labelscCs6t|tr"||jkr2|j|ntdt|dS)z+Add label to list of labels on the message.zlabel must be a string: %sN)rurrmrrrrryrrrr0s  zBabylMessage.add_labelcCs*z|j|Wntk r$YnXdS)z4Remove label from the list of labels on the message.N)rmr+rfrrrr remove_label8szBabylMessage.remove_labelcCs t|jS)z3Return a Message representation of visible headers.rrrDrrrr?szBabylMessage.get_visiblecCst||_dS)z2Set the Message representation of visible headers.Nr)rZvisiblerrrrpCszBabylMessage.set_visiblecCsb|jD](}||kr*|j|||q |j|=q dD]$}||kr8||jkr8|||j|<q8dS)z9Update and/or sensibly generate a set of visible headers.)ZDateZFromzReply-ToZToZCCZSubjectN)rrGr)rheaderrrrupdate_visibleGs zBabylMessage.update_visiblecCsrt|tr~t|}d|kr*|dn|d|dd|ksNd|krX|dd|krj|dd |kr||d nt|trt|}d|kr|d n |d d |kr|d d|kr|dnt|trt|}d|kr|dd|krn|dnTt|t rP| | |D]}| |qThe specified mailbox is not empty and deletion was requested.Nrrrrrr[sc@seZdZdZdS)rz)Another process caused an action to fail.Nrrrrrr^sc@seZdZdZdS)rz)A file appears to have an invalid format.Nrrrrrras)T)0rrrrrrrrr>Z email.messageZemail.generatorrvr8r ImportError__all__r}rdrrrr%rrrrr&rr r1r r r r rr/r r rrrr Exceptionrrrrrrrrrs    h8DB4-3z%mqH_c' *