Ë  î:K€Pãóˆ—dZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl ZddlZddlZddlZddlZddlZddlZddlmZddlmZddlmZmZmZmZddlmZddl m!Z!m"Z"m#Z#m$Z$mZm%Z%dd l&m'Z'm(Z(m)Z)m*Z*ejVrdd l,m-Z-m.Z.m/Z/m0Z0m1Z1e$jdd «Z3e$jdd «Z4e3jjZ5e3jlZ6ejnZ7ejpZ8ejrZ9ejtZ:ejvZe%j~Z?e%j€Z@e%j‚ZAej„ZCejˆrdd l mEZFnddl mGZFe#j�ZHeFj’ZIeFj”ZJeFj–ZKeFj˜ZLeFjšZMeFjœZNeFjžZOeFj ZPeFj¢ZQeFj¤ZReFj¦ZSeFj¨ZTeFjªZUeFj¬ZVe4j®ZWeFj°ZXeFj²ZYeFj´ZZeFj¶Z[eFj¸Z\eFjºZ]eFj¼Z^eFj¾Z_eFjÀZ`eFjÂZaeFjÄZbeFjÆZceFjÈZdeFjÊZeeFjÌZfeFjÎZgeFjÐZheFjÒZieFjÔZjeFjÖZkeFjØZleFjÚZmee4deFjÜ«ZneFjÞZoeFjàZpeFjâaqeFjäZreFjæZsd„Zte'jêZue'jìZve'jîZwex«Zyd„Zze{e!jøjûd««Z~e~r?ejþdde€d«ejþdde€d«ejþdde€d«e~r?ejþdde€d«ejþdde€d«ejþdde€d«d¹d„Z�e�je(�je�jdœZ…gd¢Z†e†D]Z‡e‡e…vrŒJ‚Gd„d «ZˆGd!„d"«Z‰ eŠZŠd$ZŒGd%„d&«Z�d»d'„ZŽGd(„d)«Z�Gd*„d+e�«Z�hd,£Z‘Gd-„d.«Z’Gd/„d0«Z“Gd1„d2e“«Z” d¼d4„Z•Gd5„d6e“«Z– d½d7„Z—d8„Z˜d¾d9„Z™d:„ZšGd;„d<«Z›Gd=„d>e�j8«Z�Gd?„d@e›ež«ZŸGdA„dBe›e�«Z GdC„dD«Z¡e�jDd»dE„«Z£e�jDd»dF„«Z¤GdG„dH«Z¥GdI„dJ«Z¦dK„Z§GdL„dM«Z¨dN„Z©d¿dP„ZªdQ„Z«dR„Z¬dS„Z­e�j\rdT„Z­dU„Z¯d¹dV„Z°hdW£Z± dÀdX„Z²dÁdY„Z³hdZ£Z´d[Zµd\„Z¶eed]d«Z·ejˆre¶Z¸e·s)e�jrZ·neF�jpZ¸e·s ej$Z·d^„Zºd_„Z»d`„Z¼da„Z½db„a¾ ddl¿Z¿daÀdc„ZÂGdd„de«ZÃeëZ iZÄdf„ZÅdg„ZÆdh„ZÇdi„ZÈdÂdj„ZÉGdk„dl«ZÊGdm„dn«ZËdo„ZÌdÃdp„ZÍdq„ZÎdÄdr„ZÏds„ZÐdt„ZÑdu„ZÒGdv„dw«ZÓdÅdx„ZÔGdy„dz«ZÕd{„ZÖd|„Z×eÖd}d~eHd«fd€d~eHd�«fdd~eHd‚«fd}dƒeHd„«fd€dƒeHd…«fddƒeHd†«fd}dOeHd‡«fd€dOeHdˆ«fddOeHd‰«fddeHdŠ«f« ZØGd‹„dŒ«ZÙe�j´d�«ZÛdŽ„ZÜd�„ZÝd�„ZÞe�j¾d‘k(reÝZàeÜZáeÞZân'e�jÆZàe�jÆZáe�jÆZâd’„Zäd“„Zåd”„ZædÄd•„ZçeÖdd–eHd—«fd}deHd˜«fd€deHd™«fddeHdš«fd}d›eHdœ«fd€d›eHd�«fdd›eHdž«fd}dŸeHd «fd€dŸeHd¡«fddŸeHd¢«fd}d£eHd¤«fd€d£eHd¥«fdd£eHd¦«f« Zèe�jÒGd§„d¨««Zêe�jDd©„«Zëdeë_ìdª„Zíd«Zîd¬„ZïGd­„d®«ZðdÆd¯„Zñd°de)�jäe)�jædd±fd²„ZôeôZõd»d³„Zöd´„Z÷dµ„Zød¶„Zùe�jDd·„«Zúd¸„Zûy#e‹$rdºd#„ZŠY�ŒwxYw#eÁ$rd3aÀY�Œ~wxYw)Çz¹Mercurial utility functions and platform specific implementations. This contains helper routines that are independent of the SCM core and hide platform-specific details from the core. éNé)Úhex)Úattr)ÚdelattrÚgetattrÚopenÚsetattr)Útracing)ÚencodingÚerrorÚi18nÚpolicyÚpycompatÚ urllibcompat)Ú compressionÚhashutilÚprocutilÚ stringutil)ÚIterableÚIteratorÚListÚOptionalÚTupleÚbase85Úosutil)Úwindows)ÚposixÚ statfilescóp—tjrytj|«|dzxt_ay)z%updates the umask. used by chg serverNiÿ)rÚ iswindowsÚosÚumaskÚplatform)Úvals ú2usr/lib/python3.12/site-packages/mercurial/util.pyÚsetumaskr&‘s+€ô×ÒØÜ‡H�HˆS„Mà  5™[Ð(„H„N‘Uócó"—d}|D]}||z}Œ |S©Nr©)Ú containerÚbitsÚbits r%Úbitsfromr.¥s€Ø €DÛˆØ �‰ ‰ðà €Kr'sHGEMITWARNINGSÚdefaultÚÚ mercurialÚhgextÚhgext3rdÚignorez bad escapezinvalid escape sequencezthe imp module is deprecatedcóÀ—trX|d|zz }tjtj|«t |dz«t jj«yy)zxIssue an python native deprecation warning This is a noop outside of tests, use 'ui.deprecwarn' when possible. sF (compatibility will be dropped after Mercurial-%s, update your code.)rN) Ú_dowarnÚwarningsÚwarnrÚsysstrÚDeprecationWarningÚsysÚstderrÚflush)ÚmsgÚversionÚ stacklevels r%ÚnouideprecwarnrAËsS€õ Ø ð #à ññ ˆô � ‰ ”h—o‘o cÓ*Ô,>À ÈQÁÔOä � ‰ ×ÑÕðr')ómd5ósha1ósha512)rDrCrBcó:—eZdZdZdd„Zd„Zd„Zd„Zed„«Z y) Údigestera–helper to compute digests. This helper can be used to compute one or more digests given their name. >>> d = digester([b'md5', b'sha1']) >>> d.update(b'foo') >>> [k for k in sorted(d)] ['md5', 'sha1'] >>> d[b'md5'] 'acbd18db4cc2f85cedef654fccc4a4d8' >>> d[b'sha1'] '0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33' >>> digester.preferred([b'md5', b'sha1']) 'sha1' cóΗi|_|D]E}|tvr!tjt d«|z«‚t|«|j|<ŒG|r|j |«yy©Nsunknown digest type: %s)Ú_hashesÚDIGESTSr ÚAbortÚ_Úupdate)ÚselfÚdigestsÚsÚks r%Ú__init__zdigester.__init__÷s]€ØˆŒ ÛˆAØœÑÜ—k‘k¤!Ð$>Ó"?À!Ñ"CÓDÐDÜ% a™j›lˆD�L‰L˜ŠOðñ Ø �K‰K˜�Nð r'cód—|jj«D]}|j|«Œy©N)rIÚvaluesrM)rNÚdataÚhs r%rMzdigester.updates$€Ø—‘×$Ñ$Ö&ˆAØ �H‰H�T�Nñ'r'có¨—|tvr%tjtd«tz«‚t |j |j««SrH)rJr rKrLrQrrIÚdigest)rNÚkeys r%Ú __getitem__zdigester.__getitem__sA€Ø ”gÑ Ü—+‘+œaÐ :Ó;¼aÑ?Ó@Ð @Ü�4—<‘< Ñ$×+Ñ+Ó-Ó.Ð.r'có,—t|j«SrT)ÚiterrI©rNs r%Ú__iter__zdigester.__iter__ s€Ü�D—L‘LÓ!Ð!r'có*—tD] }||vsŒ|cSy)z@returns the strongest digest type in both supported and DIGESTS.N)ÚDIGESTS_BY_STRENGTH)Ú supportedrQs r%Ú preferredzdigester.preferred s€÷%ˆAØ�IŠ~Ø’ð%ðr'N)r') Ú__name__Ú __module__Ú __qualname__Ú__doc__rRrMr[r_Ú staticmethodrcr*r'r%rFrFæs/„ñó òò/ò "ðñóñr'rFcó$—eZdZdZd„Zdd„Zd„Zy)Ú digestcheckerzÕfile handle wrapper that additionally checks content against a given size and digests. d = digestchecker(fh, size, {'md5': '...'}) When multiple digests are given, all of them are validated. cóž—||_||_d|_t|«|_t |jj ««|_yr))Ú_fhÚ_sizeÚ_gotÚdictÚ_digestsrFÚkeysÚ _digester)rNÚfhÚsizerOs r%rRzdigestchecker.__init__s;€ØˆŒØˆŒ ؈Œ ܘW› ˆŒ Ü! $§-¡-×"4Ñ"4Ó"6Ó7ˆ�r'có®—|jj|«}|jj|«|xjt |«z c_|SrT)rlÚreadrrrMrnÚlen)rNÚlengthÚcontents r%rvzdigestchecker.read&s=€Ø—(‘(—-‘- Ó'ˆØ �‰×јgÔ&Ø � Š ”S˜“\Ñ!� ؈r'cón—|j|jk7r7tjt d«|j|jfz«‚|j j «D]H\}}||j|k7sŒtjt d«|||j|fz«‚y)Ns"size mismatch: expected %d, got %ds %s mismatch: expected %s, got %s)rmrnr rKrLrpÚitemsrr©rNrQÚvs r%Úvalidatezdigestchecker.validate,s¡€Ø �:‰:˜Ÿ™Ò "Ü—+‘+ÜÐ7Ó8Ø—:‘:˜tŸy™yÐ)ñ*óð ð—M‘M×'Ñ'Ö)‰DˆAˆqØ�D—N‘N 1Ñ%Ó%ä—k‘kÜÐ9Ó:ؘ!˜TŸ^™^¨AÑ.Ð/ñ0óðñ*r'N©éÿÿÿÿ)rdrerfrgrRrvr~r*r'r%rjrjs„ñò8óó r'rjcóD—|�t|«|||zSt|«|dSrT)Ú memoryview)Ú sliceableÚoffsetrxs r%Úbufferr…?s0€Ø РܘiÓ(¨°&¸6±/ÐBÐ Bܘ)Ó$ V WÐ-Ð-r'icóv‡—eZdZdZˆfd„Zd„Zed„«Zed„«Zd„Z d„Z d„Z d „Z d „Z d „Zefd „ZˆxZS) ÚbufferedinputpipeaWa manually buffered input pipe Python will not let us use buffered IO and lazy reading with 'polling' at the same time. We cannot probe the buffer state and select will not detect that data are ready to read if they are already buffered. This class let us work around that by implementing its own buffering (allowing efficient readline) while offering a way to know if the buffer is empty from the output (allowing collaboration of the buffer with polling). This class lives in the 'util' module because it makes use of the 'os' module from the python stdlib. cóV•—t|t«rt}tt|�|«SrT)Ú isinstanceÚfileobjectproxyÚobservedbufferedinputpipeÚsuperr‡Ú__new__)ÚclsrsÚ __class__s €r%r�zbufferedinputpipe.__new__Ws'ø€ô �bœ/Ô *Ü+ˆCäÔ&¨Ñ4°SÓ9Ð9r'có<—||_g|_d|_d|_y)NFr)Ú_inputÚ_bufferÚ_eofÚ_lenbuf)rNÚinputs r%rRzbufferedinputpipe.__init___s€ØˆŒ ؈Œ ؈Œ ؈� r'có,—t|j«S)z°True is any data is currently buffered This will be used externally a pre-step for polling IO. If there is already data then no polling should be set in place.)Úboolr’r^s r%Ú hasbufferzbufferedinputpipe.hasbufferes€ô �D—L‘LÓ!Ð!r'có.—|jjSrT)r‘Úclosedr^s r%ršzbufferedinputpipe.closedms€à�{‰{×!Ñ!Ð!r'có6—|jj«SrT)r‘Úfilenor^s r%rœzbufferedinputpipe.filenoqs€Ø�{‰{×!Ñ!Ó#Ð#r'có6—|jj«SrT)r‘Úcloser^s r%ržzbufferedinputpipe.closets€Ø�{‰{× Ñ Ó"Ð"r'có²—|js;|j|kr,|j«|js|j|krŒ,|j|«SrT)r“r”Ú _fillbufferÚ _frombuffer©rNrts r%rvzbufferedinputpipe.readwsE€Ø—9’9 4§<¡<°$Ò#6Ø × Ñ Ô ð—9’9 4§<¡<°$Ó#6à×Ñ Ó%Ð%r'cóÀ—|js.|jdk(r|jt|t««|j t |j|««Sr))r“r”r ÚmaxÚ _chunksizer¡Úminr¢s r%Úunbufferedreadz bufferedinputpipe.unbufferedread|sE€Ø�yŠy˜TŸ\™\¨QÒ.Ø × Ñ œS ¤zÓ2Ô 3Ø×Ѥ D§L¡L°$Ó 7Ó8Ð8r'có�—t|j«dkDr>dj|j«g|_t|jd«|_d}|jr|jdj d«}|j sQ|dkrL|j «|jr|jdj d«}|j s|dkrŒL|dz}|dkr |j}n@t|j«dkDr(||jt|jd«z z }|j|«S)Nrr'rr€ó )rwr’Újoinr”Úfindr“r r¡)rNÚargsÚkwargsÚlfirts r%Úreadlinezbufferedinputpipe.readline�s €Ü ˆt�|‰|Ó ˜qÒ ð ŸH™H T§\¡\Ó2Ð3ˆDŒLܘtŸ|™|¨A™Ó/ˆDŒLØˆØ �<Š<Ø—,‘,˜rÑ"×'Ñ'¨Ó.ˆCØ—9’9 #¨¢'Ø × Ñ Ô Ø�|Š|Ø—l‘l 2Ñ&×+Ñ+¨EÓ2�ð—9’9 #¨£'ð�Q‰wˆØ �Š7Ø—<‘<‰DÜ �—‘Ó  Ò "à �D—L‘L¤3 t§|¡|°BÑ'7Ó#8Ñ8Ñ 8ˆDØ×Ñ Ó%Ð%r'có(—|dk(s |jsy|jd}t|j«dkDrdj|j«}|d|}|t|«d}|r|g|_t|«|_|Sg|_d|_|S)zYreturn at most 'size' data from the buffer The data are removed from the buffer.rr'rN)r’rwrªr”)rNrtÚbufrVs r%r¡zbufferedinputpipe._frombuffer–s’€ð �1Š9˜DŸLšLØØ�l‰l˜1‰oˆÜ ˆt�|‰|Ó ˜qÒ Ø—(‘(˜4Ÿ<™<Ó(ˆCà�5�DˆzˆØ”#�d“)�+Ј٠ؘ5ˆDŒLܘs›8ˆDŒLðˆ ðˆDŒL؈DŒL؈ r'cóê—tj|jj«|«}|s d|_|S|xj t |«z c_|jj|«|S)zread data to the bufferT) r!rvr‘rœr“r”rwr’Úappend)rNrtrVs r%r zbufferedinputpipe._fillbufferªs[€ä�w‰w�t—{‘{×)Ñ)Ó+¨TÓ2ˆÙ؈DŒIð ˆ ð �LŠLœC ›IÑ %�LØ �L‰L× Ñ  Ô %àˆ r')rdrerfrgr�rRÚpropertyr˜ršrœržrvr§r¯r¡r¥r Ú __classcell__©r�s@r%r‡r‡Hsbø„ñ ô:òð ñ"óð"ðñ"óð"ò$ò#ò&ò 9ò &ò*ð( *÷ r'r‡cóô‡—|dk(ry|€d}t‰dˆfd„««} tj||tj¬«S#t$r&t j |«j dk(rYy‚wxYw)Nrr'rœcó•—‰SrTr*©Úfps€r%Úzmmapread..½sø€¡rr')Úaccess)rÚmmapÚ ACCESS_READÚ ValueErrorr!ÚfstatÚst_size)rºrtÚfds` r%Úmmapreadröswø€Ø ˆq‚yðØ ˆØˆØ *Œ��X›zÓ *Ó ,€BðÜ�y‰y˜˜T¬$×*:Ñ*:Ô;Ð;øÜ òô �8‰8�B‹<× Ñ  1Ò $ÙØ ð ús¢%AÁ+A7Á5A7có´—eZdZdZdZd„Zd„Zd„ZeZd„Z d„Z d„Z d „Z d „Z d „Zd „Zd „Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zy)rŠz»A proxy around file objects that tells a watcher when events occur. This type is intended to only be used for testing purposes. Think hard before using it in important code. ©Ú_origÚ _observercó`—tj|d|«tj|d|«y©NrÆrÇ©ÚobjectÚ __setattr__)rNrsÚobservers r%rRzfileobjectproxy.__init__Ôs&€Ü×ј4 ¨"Ô-Ü×ј4 ¨hÕ7r'có~—hd£}||vrtj||«Sttj|d«|«S)N>rvÚseekÚtellržr=Úread1ÚwriteÚdetachrœÚisattyÚreadallÚreadableÚreadintor¯ÚseekableÚtruncateÚwritablerÇÚ readlinesÚ writelinesrÆ©rËÚ__getattribute__r)rNÚnameÚourss r%rÞz fileobjectproxy.__getattribute__Øs@€ò ˆð@ �4‰<Ü×*Ñ*¨4°Ó6Ð 6ä”v×.Ñ.¨t°WÓ=¸tÓDÐDr'có@—ttj|d««S©NrÆ©r—rËrÞr^s r%Ú __nonzero__zfileobjectproxy.__nonzero__þó€Ü”F×+Ñ+¨D°'Ó:Ó;Ð;r'cóB—ttj|d«|«Srâ©rrËrÞ©rNrßs r%Ú __delattr__zfileobjectproxy.__delattr__ó€Ü”v×.Ñ.¨t°WÓ=¸tÓDÐDr'cóD—ttj|d«||«Srâ©r rËrÞ©rNrßÚvalues r%rÌzfileobjectproxy.__setattr__ó€Ü”v×.Ñ.¨t°WÓ=¸tÀUÓKÐKr'cóJ—tj|d«j«Srâ)rËrÞr_r^s r%r_zfileobjectproxy.__iter__ s€Ü×&Ñ& t¨WÓ5×>Ñ>Ó@Ð@r'có¸—tj|d«}t||«|i|¤Ž}tj|d«}t||d«}|r ||g|¢­i|¤Ž|SrÉrÝ©rNrßr¬r­ÚorigÚresrÍÚfns r%Ú _observedcallzfileobjectproxy._observedcall óh€ä×&Ñ& t¨WÓ5ˆØ!Œg�d˜DÓ! 4Ð2¨6Ñ2ˆô×*Ñ*¨4°Ó=ˆÜ �X˜t TÓ *ˆÙ Ù ˆsÐ $�TÒ $˜VÒ $àˆ r'có@—tj|d«dg|¢­i|¤ŽS)Nrörž©rËrÞ©rNr¬r­s r%ržzfileobjectproxy.closeó/€Ü×&Ñ& t¨_Ó=Ø ð Øò Ø$ñ ð r'có@—tj|d«dg|¢­i|¤ŽS)Nrörœrùrús r%rœzfileobjectproxy.filenoó/€Ü×&Ñ& t¨_Ó=Ø ð Øò Ø%ñ ð r'có@—tj|d«dg|¢­i|¤ŽS)Nrör=rùrús r%r=zfileobjectproxy.flush$rûr'có@—tj|d«dg|¢­i|¤ŽS)NrörÔrùrús r%rÔzfileobjectproxy.isatty)rýr'có@—tj|d«dg|¢­i|¤ŽS)NrörÖrùrús r%rÖzfileobjectproxy.readable.ó/€Ü×&Ñ& t¨_Ó=Ø ð Øò Ø!'ñ ð r'có@—tj|d«dg|¢­i|¤ŽS)Nrör¯rùrús r%r¯zfileobjectproxy.readline3rr'có@—tj|d«dg|¢­i|¤ŽS)NrörÛrùrús r%rÛzfileobjectproxy.readlines8ó/€Ü×&Ñ& t¨_Ó=Ø ð Øò Ø"(ñ ð r'có@—tj|d«dg|¢­i|¤ŽS)NrörÏrùrús r%rÏzfileobjectproxy.seek=ó/€Ü×&Ñ& t¨_Ó=Ø ð Øò Ø#ñ ð r'có@—tj|d«dg|¢­i|¤ŽS)NrörØrùrús r%rØzfileobjectproxy.seekableBrr'có@—tj|d«dg|¢­i|¤ŽS)NrörÐrùrús r%rÐzfileobjectproxy.tellGrr'có@—tj|d«dg|¢­i|¤ŽS)NrörÙrùrús r%rÙzfileobjectproxy.truncateLrr'có@—tj|d«dg|¢­i|¤ŽS)NrörÚrùrús r%rÚzfileobjectproxy.writableQrr'có@—tj|d«dg|¢­i|¤ŽS)NrörÜrùrús r%rÜzfileobjectproxy.writelinesVó/€Ü×&Ñ& t¨_Ó=Ø ð Øò Ø#)ñ ð r'có@—tj|d«dg|¢­i|¤ŽS)Nrörvrùrús r%rvzfileobjectproxy.read[rr'có@—tj|d«dg|¢­i|¤ŽS)NrörÕrùrús r%rÕzfileobjectproxy.readall`ó/€Ü×&Ñ& t¨_Ó=Ø ð Øò Ø &ñ ð r'có@—tj|d«dg|¢­i|¤ŽS)Nrör×rùrús r%r×zfileobjectproxy.readintoerr'có@—tj|d«dg|¢­i|¤ŽS)NrörÒrùrús r%rÒzfileobjectproxy.writejrûr'có@—tj|d«dg|¢­i|¤ŽS)NrörÓrùrús r%rÓzfileobjectproxy.detachorýr'có@—tj|d«dg|¢­i|¤ŽS)NrörÑrùrús r%rÑzfileobjectproxy.read1trûr'N) rdrerfrgÚ __slots__rRrÞräÚ__bool__rérÌr_röržrœr=rÔrÖr¯rÛrÏrØrÐrÙrÚrÜrvrÕr×rÒrÓrÑr*r'r%rŠrŠÈsœ„ñð €Iò 8ò$EòL<ð€HòEòLòAò ò ò  ò  ò  ò  ò  ò  ò  ò  ò  ò  ò  ò  ò  ò  ò  ò  ò  ó  r'rŠcó:‡—eZdZdZefˆfd„ Zˆfd„Zˆfd„ZˆxZS)r‹a´A variation of bufferedinputpipe that is aware of fileobjectproxy. ``bufferedinputpipe`` makes low-level calls to ``os.read()`` that bypass ``fileobjectproxy``. Because of this, we need to make ``bufferedinputpipe`` aware of these operations. This variation of ``bufferedinputpipe`` can notify observers about ``os.read()`` events. It also re-publishes other events, such as ``read()`` and ``readline()``. c󈕗tt|� |¬«}t|jj dd«}|r |||«|S)N)rtÚosread)rŒr‹r rr‘rÇ©rNrtrôrõr�s €r%r z%observedbufferedinputpipe._fillbuffer†sAø€ÜÔ-¨tÑ@ÀdÐ@ÓKˆä �T—[‘[×*Ñ*¨H°dÓ ;ˆÙ Ù ˆs�DŒMàˆ r'c󆕗tt|� |«}t|jj dd«}|r |||«|S)NÚ bufferedread)rŒr‹rvrr‘rÇrs €r%rvzobservedbufferedinputpipe.read‘s>ø€ÜÔ-¨tÑ9¸$Ó?ˆä �T—[‘[×*Ñ*¨N¸DÓ AˆÙ Ù ˆs�DŒMàˆ r'có„•—tt|� |i|¤Ž}t|jj dd«}|r||«|S)NÚbufferedreadline)rŒr‹r¯rr‘rÇ)rNr¬r­rôrõr�s €r%r¯z"observedbufferedinputpipe.readlinešsBø€ÜÔ-¨tÑ=¸tÐNÀvÑNˆä �T—[‘[×*Ñ*Ð,>ÀÓ EˆÙ Ù ˆsŒGàˆ r') rdrerfrgr¥r rvr¯rµr¶s@r%r‹r‹zs!ø„ñ ð *õô÷ðr'r‹> ÚrecvÚsendÚsendtoÚsendallÚmakefileÚrecvfromÚ recv_intoÚ gettimeoutÚ setsockoptÚ settimeoutÚ setblockingÚ recvfrom_intocó„—eZdZdZdZd„Zd„Zd„Zd„Zd„Z e Z d„Z d „Z d „Z d „Zd „Zd „Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zy)Ú socketproxyzñA proxy around a socket that tells a watcher when events occur. This is like ``fileobjectproxy`` except for sockets. This type is intended to only be used for testing purposes. Think hard before using it in important code. rÅcó`—tj|d|«tj|d|«yrÉrÊ)rNÚsockrÍs r%rRzsocketproxy.__init__Âs&€Ü×ј4 ¨$Ô/Ü×ј4 ¨hÕ7r'có~—|tvrtj||«Sttj|d«|«Srâ)ÚPROXIED_SOCKET_METHODSrËrÞrrès r%rÞzsocketproxy.__getattribute__Æs8€Ø Ô)Ñ )Ü×*Ñ*¨4°Ó6Ð 6ä”v×.Ñ.¨t°WÓ=¸tÓDÐDr'cóB—ttj|d«|«Srârçrès r%rézsocketproxy.__delattr__Ìrêr'cóD—ttj|d«||«Srârìrís r%rÌzsocketproxy.__setattr__Ïrïr'có@—ttj|d««Srârãr^s r%räzsocketproxy.__nonzero__Òrår'có¸—tj|d«}t||«|i|¤Ž}tj|d«}t||d«}|r ||g|¢­i|¤Ž|SrÉrÝròs r%rözsocketproxy._observedcall×r÷r'c ó—tj|d«dg|¢­i|¤Ž}tj|d«}t|j||j|j |j |j|j¬«S)Nrör"rÇ©ÚreadsÚwritesÚlogdataÚ logdataapis) rËrÞÚmakeloggingfileobjectrsrßr6r7r8r9)rNr¬r­rôrÍs r%r"zsocketproxy.makefileås~€Ü×%Ñ% d¨OÓ<Ø ð Øò Ø!'ñ ˆô ×*Ñ*¨4°Ó=ˆÜ$Ø �K‰KØ Ø �M‰MØ—.‘.Ø—?‘?Ø×$Ñ$Ø ×,Ñ,ô ð r'có@—tj|d«dg|¢­i|¤ŽS)Nrörrùrús r%rzsocketproxy.recv÷rr'có@—tj|d«dg|¢­i|¤ŽS)Nrör#rùrús r%r#zsocketproxy.recvfromürr'có@—tj|d«dg|¢­i|¤ŽS)Nrör)rùrús r%r)zsocketproxy.recvfrom_intos/€Ü×&Ñ& t¨_Ó=Ø ð Ø"ò Ø&,ñ ð r'có@—tj|d«dg|¢­i|¤ŽS)NröÚ recv_inforùrús r%r$zsocketproxy.recv_intorr'có@—tj|d«dg|¢­i|¤ŽS)Nrörrùrús r%rzsocketproxy.send rr'có@—tj|d«dg|¢­i|¤ŽS)Nrör!rùrús r%r!zsocketproxy.sendallrr'có@—tj|d«dg|¢­i|¤ŽS)Nrör rùrús r%r zsocketproxy.sendtorýr'có@—tj|d«dg|¢­i|¤ŽS)Nrör(rùrús r%r(zsocketproxy.setblockings/€Ü×&Ñ& t¨_Ó=Ø ð Ø ò Ø$*ñ ð r'có@—tj|d«dg|¢­i|¤ŽS)Nrör'rùrús r%r'zsocketproxy.settimeoutr r'có@—tj|d«dg|¢­i|¤ŽS)Nrör%rùrús r%r%zsocketproxy.gettimeout$r r'có@—tj|d«dg|¢­i|¤ŽS)Nrör&rùrús r%r&zsocketproxy.setsockopt)r r'N)rdrerfrgrrRrÞrérÌrärrör"rr#r)r$rr!r r(r'r%r&r*r'r%r+r+´sr„ñð€Iò 8òEò EòLò<ð€Hò ò ò$ ò  ò  ò  ò  ò  ò  ò  ò  ò  ó  r'r+có—eZdZd„Zd„Zy)Úbaseproxyobservercó<—||_||_||_||_yrT)rsrßr8r9)rNrsrßr8r9s r%rRzbaseproxyobserver.__init__0s€ØˆŒØˆŒ ؈Œ Ø&ˆÕr'có—|jsB|jr5|jjd«|jj «yd|vr–|jr2|jjdt j |«z«n=|jjd|jt j |«fz«|jj «y|jr|jjd«|jd«}|D]?}|jjd|jt j |«fz«ŒA|jj «y)Nr©s: %s s %s> %s s: T) r8r9rsrÒr=rÚ escapestrrßÚ splitlines)rNrVÚlinesÚlines r%Ú _writedatazbaseproxyobserver._writedata6s€Ø�|Š|Ø×ÒØ—‘— ‘ ˜eÔ$Ø—‘— ‘ ”Ø ð ˜Ñ Ø×ÒØ—‘— ‘ ˜i¬*×*>Ñ*>¸tÓ*DÑDÕEà—‘— ‘ Ø# t§y¡y´*×2FÑ2FÀtÓ2LÐ&MÑMôð �G‰G�M‰MŒOØ ð × Ò Ø �G‰G�M‰M˜&Ô !à—‘ Ó%ˆÛˆDØ �G‰G�M‰MØ 4§9¡9¬j×.BÑ.BÀ4Ó.HÐ"IÑIõ ðð �‰� ‰ �r'N)rdrerfrRrOr*r'r%rHrH/s „ò'ó r'rHcóT‡—eZdZdZ d ˆfd„ Zd d„Zd d„Zd„Zd„Zd„Z d„Z d „Z ˆxZ S) ÚfileobjectobserverzLogs file object activity.cóN•—tt|� ||||«||_||_yrT)rŒrQrRr6r7)rNrsrßr6r7r8r9r�s €r%rRzfileobjectobserver.__init__Ws)ø€ô Ô  $Ñ0°°T¸7ÀKÔP؈Œ ؈� r'cóÞ—|jsy|€d}|dk(r|dk(ry|jr4|jjd|j|t |«fz«|j |«y)Nr'r€s%s> read(%d) -> %d©r6r9rsrÒrßrwrO©rNrôrts r%rvzfileobjectobserver.read^sb€Ø�zŠzØ à ˆ;؈Cà �2Š:˜# š*ð à × Ò Ø �G‰G�M‰MÐ/°4·9±9¸dÄCÈÃHÐ2MÑMÔ Nà �‰˜Õr'có¾—|jsy|jr3|jjd|jt |«fz«|j |«y)Ns%s> readline() -> %drT)rNrôÚlimits r%r¯zfileobjectobserver.readlineqsD€Ø�zŠzØ à × Ò Ø �G‰G�M‰MÐ1°T·Y±YÄÀCÃÐ4IÑIÔ Jà �‰˜Õr'có—|jsy|jr4|jjd|jt |«|fz«|�|d|nd}t |t«r|j«}|j|«y)Ns%s> readinto(%d) -> %rrr') r6r9rsrÒrßrwr‰r‚ÚtobytesrO)rNrôÚdestrVs r%r×zfileobjectobserver.readintozsr€Ø�zŠzØ à × Ò Ø �G‰G�M‰MØ)¨T¯Y©Y¼¸D» À3Ð,GÑGô ð"˜oˆt�A�c‰{°3ˆô �dœJÔ 'Ø—<‘<“>ˆDà �‰˜Õr'cóÞ—|jsy|€ |r t|«}|jr4|jj d|j t|«|fz«|j |«y)Ns%s> write(%d) -> %r)r7rwr9rsrÒrßrO)rNrôrVs r%rÒzfileobjectobserver.writeŒsX€Ø�{Š{Ø ð ˆ;™4Ü�d“)ˆCà × Ò Ø �G‰G�M‰MÐ0°D·I±I¼sÀ4»yÈ#Ð3NÑNÔ Oà �‰˜Õr'cór—|jsy|jjd|j|fz«y)Ns%s> flush() -> %r )r7rsrÒrß©rNrôs r%r=zfileobjectobserver.flushšs+€Ø�{Š{Ø à �‰� ‰ Ð,°· ± ¸3Ð/?Ñ?Õ@r'cóÀ—|jsy|jr4|jjd|j|t |«fz«|j |«y)Ns%s> bufferedread(%d) -> %drTrUs r%rzfileobjectobserver.bufferedread¡sJ€Ø�zŠzØ à × Ò Ø �G‰G�M‰MØ-°·±¸DÄ#ÀcÃ(Ð0KÑKô ð �‰˜Õr'có¾—|jsy|jr3|jjd|jt |«fz«|j |«y)Ns%s> bufferedreadline() -> %drTr]s r%rz#fileobjectobserver.bufferedreadline¬sH€Ø�zŠzØ à × Ò Ø �G‰G�M‰MØ/°4·9±9¼cÀ#»hÐ2GÑGô ð �‰˜Õr'©TTFTr) rdrerfrgrRrvr¯r×rÒr=rrrµr¶s@r%rQrQTs6ø„Ù$ðMQõóó&òò$ òAò ö r'rQFcó<—t||||||¬«}t||«S)z.Turn a file object into a logging file object.r5)rQrŠ)Úloghrsrßr6r7r8r9rÍs r%r:r:¸s/€ô "Ø Ø ØØØØô €Hô ˜2˜xÓ (Ð(r'c󆇗eZdZdZ dˆfd„ Zdd„Zdd„Zdd„Zdd„Zdd„Z dd„Z dd „Z dd „Z d „Z d „Zd „Zd„ZˆxZS)ÚsocketobserverzLogs socket activity.có\•—tt|� ||||«||_||_||_yrT)rŒrdrRr6r7Ústates) rNrsrßr6r7rfr8r9r�s €r%rRzsocketobserver.__init__Ës/ø€ô Œn˜dÑ,¨R°°wÀ ÔL؈Œ ؈Œ ؈� r'cót—|jsy|jjd|j||fz«y)Ns%s> makefile(%r, %r) ©rfrsrÒrß)rNrôÚmodeÚbufsizes r%r"zsocketobserver.makefileÚs-€Ø�{Š{Ø à �‰� ‰ Ð/°4·9±9¸dÀGÐ2LÑLÕMr'c ó—|jsy|jr5|jjd|j||t |«fz«|j |«y)Ns%s> recv(%d, %d) -> %drT©rNrôrtÚflagss r%rzsocketobserver.recvàsL€Ø�zŠzØ à × Ò Ø �G‰G�M‰MØ)¨T¯Y©Y¸¸eÄSÈÃXÐ,NÑNô ð �‰˜Õr'c óΗ|jsy|jr8|jjd|j||t |d«fz«|j |d«y)Ns%s> recvfrom(%d, %d) -> %drrTrls r%r#zsocketobserver.recvfromêsW€Ø�zŠzØ à × Ò Ø �G‰G�M‰MØ-Ø—9‘9˜d E¬3¨s°1©v«;Ð7ñ8ô ð �‰˜˜A™Õr'có—|jsy|jr/|jjd|j|||dfz«|j |d|d«y)Ns%s> recvfrom_into(%d, %d) -> %dr©r6r9rsrÒrßrO©rNrôr±rtrms r%r)zsocketobserver.recvfrom_intoösY€Ø�zŠzØ à × Ò Ø �G‰G�M‰MØ2Ø—9‘9˜d E¨3¨q©6Ð2ñ3ô ð �‰˜˜A  A¡˜Õ(r'có¶—|jsy|jr,|jjd|j|||fz«|j |d|«y)Ns%s> recv_into(%d, %d) -> %drrprqs r%r$zsocketobserver.recv_intosN€Ø�zŠzØ à × Ò Ø �G‰G�M‰MØ.°$·)±)¸TÀ5È#Ð1NÑNô ð �‰˜˜A˜c˜ Õ#r'c ó¼—|jsy|jjd|jt |«|t |«fz«|j |«y)Ns%s> send(%d, %d) -> %d)r7rsrÒrßrwrO©rNrôrVrms r%rzsocketobserver.send sG€Ø�{Š{Ø à �‰� ‰ Ø %¨¯©´C¸³I¸uÄcÈ#ÃhÐ(OÑ Oô ð �‰˜Õr'cóÀ—|jsy|jr4|jjd|jt |«|fz«|j |«y)Ns%s> sendall(%d, %d)©r7r9rsrÒrßrwrOrts r%r!zsocketobserver.sendallsJ€Ø�{Š{Ø à × Ò à �G‰G�M‰MØ&¨$¯)©)´S¸³YÀÐ)FÑFô ð �‰˜Õr'cóÒ—|jsy|r|}nd}|jr6|jjd|jt |«|||fz«|j |«y)Nrs%s> sendto(%d, %d, %r) -> %drv)rNrôrVÚflagsoraddressÚaddressrms r%r zsocketobserver.sendto"s^€Ø�{Š{Ø á Ø"‰EàˆEà × Ò Ø �G‰G�M‰MØ/Ø—9‘9œc $›i¨°¸Ð=ñ>ô ð �‰˜Õr'cór—|jsy|jjd|j|fz«y)Ns%s> setblocking(%r) rh)rNrôÚflags r%r(zsocketobserver.setblocking3s+€Ø�{Š{Ø à �‰� ‰ Ð.°$·)±)¸TÐ1BÑBÕCr'cór—|jsy|jjd|j|fz«y)Ns%s> settimeout(%r) rh)rNrôrîs r%r'zsocketobserver.settimeout9s+€Ø�{Š{Ø à �‰� ‰ Ð-°·±¸EÐ0BÑBÕCr'cór—|jsy|jjd|j|fz«y)Ns%s> gettimeout() -> %f rhr]s r%r%zsocketobserver.gettimeout?s+€Ø�{Š{Ø à �‰� ‰ Ð1°T·Y±YÀÐ4DÑDÕEr'cóx—|jsy|jjd|j||||fz«y)Ns!%s> setsockopt(%r, %r, %r) -> %r rh)rNrôÚlevelÚoptnamerîs r%r&zsocketobserver.setsockoptEs6€Ø�{Š{Ø à �‰� ‰ Ø 1Ø�y‰y˜% ¨%°Ð5ñ 6õ r'©TTTFT©NN©r)rrrT)rdrerfrgrRr"rr#r)r$rr!r r(r'r%r&rµr¶s@r%rdrdÈs\ø„Ùð ØØØØõ óNó ó  ó )ó $óó óò"Dò Dò Fö  r'rdc ó>—t|||||||¬«}t||«S)z$Turn a socket into a logging socket.)r6r7rfr8r9)rdr+) rbrsrßr6r7rfr8r9rÍs r%Úmakeloggingsocketr…Os2€ôØ Ø ØØØØØô€Hô �r˜8Ó $Ð$r'cóF— ddlm}|jS#t$rYywxYw)z(Return version information if available.r©Ú __version__sunknown)r0rˆr?Ú ImportErrorr‡s r%r?r?gs(€ðÝ!à×"Ñ"Ð"øÜ òÙðús ‚” Ÿ cóJ—|s t«}tjd|«}|sd|}}n8|jd«r|j «\}}n|jd«d}}|€J‚g}|j d«D]} |j t|««Œt|«dkr |j d«t|«dkrŒ |dk(r |d|dfS|dk(r|d|d|dfS|d k(r|d|d|d|fStjd |z«‚#t$rYŒˆwxYw) azParses a Mercurial version string into an N-tuple. The version string to be parsed is specified with the ``v`` argument. If it isn't defined, the current Mercurial version string will be parsed. ``n`` can be 2, 3, or 4. Here is how some version strings map to returned values: >>> v = b'3.6.1+190-df9b73d2d444' >>> versiontuple(v, 2) (3, 6) >>> versiontuple(v, 3) (3, 6, 1) >>> versiontuple(v, 4) (3, 6, 1, '190-df9b73d2d444') >>> versiontuple(b'3.6.1+190-df9b73d2d444+20151118') (3, 6, 1, '190-df9b73d2d444+20151118') >>> v = b'3.6' >>> versiontuple(v, 2) (3, 6) >>> versiontuple(v, 3) (3, 6, None) >>> versiontuple(v, 4) (3, 6, None, None) >>> v = b'3.9-rc' >>> versiontuple(v, 2) (3, 9) >>> versiontuple(v, 3) (3, 9, None) >>> versiontuple(v, 4) (3, 9, None, 'rc') >>> v = b'3.9-rc+2-02a8fea4289b' >>> versiontuple(v, 2) (3, 9) >>> versiontuple(v, 3) (3, 9, None) >>> versiontuple(v, 4) (3, 9, None, 'rc+2-02a8fea4289b') >>> versiontuple(b'4.6rc0') (4, 6, None, 'rc0') >>> versiontuple(b'4.6rc0+12-425d55e54f98') (4, 6, None, 'rc0+12-425d55e54f98') >>> versiontuple(b'.1.2.3') (None, None, None, '.1.2.3') >>> versiontuple(b'12.34..5') (12, 34, None, '..5') >>> versiontuple(b'1.2.3.4.5.6') (1, 2, 3, '.4.5.6') s(\d+(?:\.\d+){,2})[+-]?(.*)r'érNó.érés invalid version part request: %d) r?ÚremodÚmatchÚgroupÚgroupsÚsplitr³Úintr¿rwr ÚProgrammingError)r}ÚnÚmÚvpartsÚextraÚvintsÚis r%Ú versiontuplerœqs?€ñn Ü ‹IˆÜ � ‰ Ð3°QÓ7€A٠ؘQ�‰Ø �‰�ŒØŸ™› ‰ ˆ‘àŸ™ ›  D�ˆà Ð ÐÐ à €EØ �\‰\˜$Ö ˆð Ø �L‰Lœ˜Q›Õ ð ô ˆe‹*�qŠ.Ø � ‰ �TÔô ˆe‹*�q‹.ð ˆA‚vØ�a‘˜% ™(Ð#Ð#؈A‚vØ�a‘˜% ™( E¨!¡HÐ-Ð-؈A‚vØ�a‘˜% ™( E¨!¡H¨eÐ4Ð4ä × Ñ Ð!DÀqÑ!HÓ IÐIøôò Ú ð úsÁ=DÄ D"Ä!D"c󤇇‡—‰jjdk(r gŠˆˆfd„}|SiЉjjdk(rˆˆfd„}|Sˆˆfd„}|S)z"cache the result of function callsrcóV•—t‰«dk(r‰j‰««‰dSr))rwr³)ÚfuncÚ listcaches€€r%Úfzcachefunc..fÎs)ø€Ü�9‹~ Ò"Ø× Ñ ¡£Ô(ؘQ‘<Ð r'rcó,•—|‰vr ‰|«‰|<‰|SrTr*)ÚargÚcacherŸs €€r%r¡zcachefunc..fØs"ø€Ø˜%ÑÙ! #›Y��c‘ ؘ‘:Ð r'có&•—|‰vr‰|މ|<‰|SrTr*)r¬r¤rŸs €€r%r¡zcachefunc..fßs"ø€Ø˜5Ñ Ù" D˜k��d‘ ؘ‘;Ð r')Ú__code__Ú co_argcount)rŸr¡r¤r s` @@r%Ú cachefuncr¨ÈsWú€ð ‡}�}× Ñ  AÒ%؈ õ ð ˆØ €EØ ‡}�}× Ñ  AÒ%õ ð €Hõ  ð €Hr'có—eZdZdZd„Zd„Zy)Úcowz^helper class to make copy-on-write easier Call preparewrite before doing any writes. cól—t|dd«r&|xjdzc_|j|«S|S)z;call this before writes, return self or a copied new objectÚ_copiedrr)rr¬r�r^s r%Ú preparewritezcow.preparewriteís0€ä �4˜ AÔ &Ø �LŠL˜AÑ �Là—>‘> $Ó'Ð '؈ r'có0—t|dd«dz|_|S)zalways do a cheap copyr¬rr)rr¬r^s r%Úcopyzcow.copyõs€ä˜t Y°Ó2°QÑ6ˆŒ ؈ r'N)rdrerfrgr­r¯r*r'r%rªrªçs„ñò ór'rªcóF‡—eZdZdZˆfd„Zej rd„Zd„ZˆxZ S)Úsortdicta[a simple sorted dictionary >>> d1 = sortdict([(b'a', 0), (b'b', 1)]) >>> d2 = d1.copy() >>> d2 sortdict([('a', 0), ('b', 1)]) >>> d2.update([(b'a', 2)]) >>> list(d2.keys()) # should still be in last-set order ['b', 'a'] >>> d1.insert(1, b'a.5', 0.5) >>> d1 sortdict([('a', 0), ('a.5', 0.5), ('b', 1)]) có<•—||vr||=tt|� ||«yrT)rŒr±Ú __setitem__)rNrZrîr�s €r%r³zsortdict.__setitem__ s"ø€Ø �$‰;Ø�S� Ü Œh˜Ñ)¨#¨uÕ5r'c ó€—t|t«r|j«}|D] \}}|||<Œ |D] }||||<Œ yrT)r‰ror{)rNÚsrcr¡rQr}s r%rMzsortdict.updatesE€Ü˜#œtÔ$Ø—i‘i“k�Û‘��1Ø��Q’ðã�ؘA™$��Q’ñr'cóŽ—tt|j«««D] \}\}}||k(r|||<||k\sŒ||=|||<Œ"yrT)Ú enumerateÚlistr{)rNÚpositionrZrîr›rQr}s r%Úinsertzsortdict.insertsK€Ü$¤T¨$¯*©*«,Ó%7Ö8‰KˆQ‘��AØ�HŠ}Ø!��S‘ Ø�H‹}ؘ�GØ��Q’ñ 9r') rdrerfrgr³rÚispypyrMrºrµr¶s@r%r±r±ûs ø„ñ ô6𠇂ò ör'r±có—eZdZdZy)Úcowdicta¨copy-on-write dict Be sure to call d = d.preparewrite() before writing to d. >>> a = cowdict() >>> a is a.preparewrite() True >>> b = a.copy() >>> b is a True >>> c = b.copy() >>> c is a True >>> a = a.preparewrite() >>> b is a False >>> a is a.preparewrite() True >>> c = c.preparewrite() >>> b is c False >>> b is b.preparewrite() True N©rdrerfrgr*r'r%r½r½"s„òr'r½có—eZdZdZy)Ú cowsortdictzZcopy-on-write sortdict Be sure to call d = d.preparewrite() before writing to d. Nr¾r*r'r%rÀrÀ=s„òr'rÀcó|—eZdZdZej Zejd„«Zejd„«Z d„Z d„Z y)Ú transactionalzBBase class for making a transactional type into a context manager.có—y)z$Successfully closes the transaction.Nr*r^s r%ržztransactional.closeIó�r'có—y)zoMarks the end of the transaction. If the transaction has not been closed, it will be aborted. Nr*r^s r%Úreleaseztransactional.releaseMrÄr'có—|SrTr*r^s r%Ú __enter__ztransactional.__enter__Tó€Øˆ r'cót— |€|j«|j«y#|j«wxYwrT)ržrÆ)rNÚexc_typeÚexc_valÚexc_tbs r%Ú__exit__ztransactional.__exit__Ws)€ð ØÐØ— ‘ ” à �L‰L�NøˆD�L‰L�Nús‚%¥7N) rdrerfrgÚabcÚABCMetaÚ __metaclass__ÚabstractmethodržrÆrÈrÎr*r'r%rÂrÂDsJ„ÙLà—K‘K€Mà×Ññ3óð3ð ×Ññ óð ò ór'rÂc#óàK—|sd–—y d–—|j« |j«y#tj$r|j«‚wxYw#|j«wxYw­w)z•A context manager that closes the transaction on InterventionRequired If no transaction was provided, this simply runs the body and returns N)ržr ÚInterventionRequiredrÆ)Útrs r%ÚacceptinterventionrÖ_s[èø€ñ Û ØðÛ Ø �‰� ð � ‰ � øô × %Ñ %òØ �‰Œ Ø ðûð � ‰ � üs%‚A.‹1 A.±%AÁAÁA+Á+A.c#óK—|–—y­wrTr*)Ú enter_results r%ÚnullcontextmanagerrÙrs èø€à Óùs‚có —eZdZdZdZd„Zd„Zy)Ú _lrucachenodez�A node in a doubly linked list. Holds a reference to nodes on either side as well as a key-value pair for the dictionary entry. )ÚnextÚprevrZrîÚcostcóR—||_||_t|_d|_d|_yr))rÜrÝÚ_notsetrZrîrÞr^s r%rRz_lrucachenode.__init__€s%€ØˆŒ ؈Œ 䈌؈Œ ؈� r'có6—t|_d|_d|_y)zMark the node as emptied.Nr)ràrZrîrÞr^s r%Ú markemptyz_lrucachenode.markemptyˆs€äˆŒØˆŒ ؈� r'N)rdrerfrgrrRrâr*r'r%rÛrÛws„ñð 9€Iòór'rÛcó†—eZdZdZdd„Zd„Zd„Zd„Zd„Zdd„Z d„Z d „Z e fd „Z dd „Ze fd „Zd„Zdd„Zd„Zd„Zd„Zd„Zy )Ú lrucachedictaDict that caches most recent accesses and sets. The dict consists of an actual backing dict - indexed by original key - and a doubly linked circular list defining the order of entries in the cache. The head node is the newest entry in the cache. If the cache is full, we recycle head.prev and make it the new head. Cache accesses result in the node being moved to before the existing head and being marked as the new head node. Items in the cache can be inserted with an optional "cost" value. This is simply an integer that is specified by the caller. The cache can be queried for the total cost of all items presently in the cache. The cache can also define a maximum cost. If a cache insertion would cause the total cost of the cache to go beyond the maximum cost limit, nodes will be evicted to make room for the new code. This can be used to e.g. set a max memory limit and associate an estimated bytes size cost to each item in the cache. By default, no maximum cost is enforced. cóh—i|_t«|_d|_||_d|_||_y)Nrr)Ú_cacherÛÚ_headrmÚcapacityÚ totalcostÚmaxcost)rNr¤rês r%rRzlrucachedict.__init__¦s.€ØˆŒ ä"“_ˆŒ ؈Œ ؈Œ ؈ŒØˆ� r'có,—t|j«SrT)rwrær^s r%Ú__len__zlrucachedict.__len__¯s€Ü�4—;‘;ÓÐr'có—||jvSrT)ræ©rNrQs r%Ú __contains__zlrucachedict.__contains__²s€Ø�D—K‘KÐÐr'c#óžK—|j}tt|j««D]}|j–—|j }Œy­wrT)rçÚrangerwrærZrÜ)rNr–r›s r%r_zlrucachedict.__iter__µs9èø€à �J‰JˆÜ”s˜4Ÿ;™;Ó'Ö(ˆAØ—%‘%ŠKØ—‘‰Añ)ùs‚A A cóZ—|j|}|j|«|jSrT)ræÚ _movetoheadrî)rNrQÚnodes r%r[zlrucachedict.__getitem__¼s'€Ø�{‰{˜1‰~ˆØ ×Ñ˜ÔØ�z‰zÐr'cóè—|jj|«}|�p|xj|jzc_||_||_|xj|z c_|j |«|j r|j«y|j|jkr|j«}n|jj}|jtur6|xj|jzc_|j|j=||_ ||_||_|xj|z c_||j|<||_ |j r|j«yy)z8Insert a new item in the cache with optional cost value.N)ræÚgetrérÞrîrórêÚ_enforcecostlimitrmrèÚ _addcapacityrçrÝrZrà)rNrQr}rÞrôs r%rºzlrucachedict.insertÁs€à�{‰{�‰˜qÓ!ˆà Ð Ø �NŠN˜dŸi™iÑ '�N؈DŒJ؈DŒIØ �NŠN˜dÑ "�NØ × Ñ ˜TÔ "à�|Š|Ø×&Ñ&Ô(à à �:‰:˜Ÿ ™ Ò %Ø×$Ñ$Ó&‰Dð—:‘:—?‘?ˆDð �8‰8œ7Ñ "Ø �NŠN˜dŸi™iÑ '�NØ— ‘ ˜DŸH™HÐ%àˆŒØˆŒ ؈Œ Ø �Š˜$Ñ�؈� ‰ �A‰ðˆŒ à �<Š<Ø × "Ñ "Õ $ð r'có(—|j||«yrT)rºr|s r%r³zlrucachedict.__setitem__ès€Ø � ‰ �A�qÕr'có&—|j|«yrT)Úpoprîs r%Ú __delitem__zlrucachedict.__delitem__ës €Ø �‰�� r'có4— |jj|«}|€J‚|j}|xj |j zc_|j«|j|«|j|_ |S#t$r|tur‚|cYSwxYwrT) rærûÚKeyErrorràrîrérÞrârórÜrç)rNrQr/rôrîs r%rûzlrucachedict.popîs�€ð Ø—;‘;—?‘? 1Ó%ˆDð ÐÐÐØ— ‘ ˆØ �Š˜$Ÿ)™)Ñ#�Ø �‰Ôð ×Ñ˜ÔØ—Y‘YˆŒ àˆ øôò Øœ'Ñ!ØØŠNð ús‚BÂBÂBNcóH— |j|«S#t$r|cYSwxYwrT)r[rþ)rNrQr/s r%rözlrucachedict.gets,€ð Ø×#Ñ# AÓ&Ð &øÜò ØŠNð ús ‚“ ! !cóv— |j|}|€J‚|jS#t$r|tur‚|cYSwxYw)z½Get the specified item without moving it to the head Unlike get(), this doesn't mutate the internal state. But be aware that it doesn't mean peek() is thread safe. )rærîrþrà)rNrQr/rôs r%Úpeekzlrucachedict.peek sI€ð  Ø—;‘;˜q‘>ˆDØÐ#Ð #Ð#Ø—:‘:Ð øÜò Øœ'Ñ!ØØŠNð ús ‚!¡8·8có—|j}|jturN|xj|jzc_|j «|j }|jturŒN|jj«yrT) rçrZràrérÞrârÜræÚclear)rNr–s r%rzlrucachedict.clears[€Ø �J‰JˆØ�e‰eœ7Ñ"Ø �NŠN˜aŸf™fÑ $�NØ �K‰KŒMØ—‘ˆAð�e‰eœ7Ò"ð � ‰ ×ÑÕr'cóè—|xs |j}|xs |j}t||¬«}|jj}|j t ur;||jur-|j}|j t ur||jurŒ-tt|j««D]@}|j|j |j|j¬«|j}ŒB|S)a8Create a new cache as a copy of the current one. By default, the new cache has the same capacity as the existing one. But, the cache capacity can be changed as part of performing the copy. Items in the copy have an insertion/access order matching this instance. )rê)rÞ) rèrêrärçrÝrZràrñrwrærºrîrÞ)rNrèrêÚresultr–r›s r%r¯zlrucachedict.copy"s¼€ðÒ,˜tŸ}™}ˆØÒ)˜TŸ\™\ˆÜ˜h°Ô8ˆð �J‰J�O‰OˆØ�e‰e”wÑ 1¨D¯J©JÑ#6Ø—‘ˆAð�e‰e”wÑ 1¨D¯J©JÒ#6ô ”s˜4Ÿ;™;Ó'Ö(ˆAØ �M‰M˜!Ÿ%™% §¡¨q¯v©vˆMÔ 6Ø—‘‰Að)ðˆ r'có~—|jsy|jj}|€J‚|jtur|j}|jturŒ|€J‚|j|j }}|j|j=|xj |jzc_|j«||fS)zuRemove the oldest item from the cache. Returns the (key, value) describing the removed cache entry. N) rærçrÝrZràrîrérÞrâ)rNr–rZrîs r%Ú popoldestzlrucachedict.popoldestAsž€ð �{Š{Ø ð �J‰J�O‰Oˆàˆ}Ј}à�e‰e”wÑØ—‘ˆAð�e‰e”wÒðˆ}Ј}à—U‘U˜AŸG™GˆUˆð �K‰K˜Ÿ™Ð Ø �Š˜!Ÿ&™&Ñ �Ø � ‰ Œ à�EˆzÐr'có2—|j}|j|j_|j|j_|j|_|jj|_||j_||j_||_y)aqMark a node as the newest, making it the new head. When a node is accessed, it becomes the freshest entry in the LRU list, which is denoted by self._head. Visually, let's make ``N`` the new head node (* denotes head): previous/oldest <-> head <-> next/next newest ----<->--- A* ---<->----- | | E <-> D <-> N <-> C <-> B To: ----<->--- N* ---<->----- | | E <-> D <-> C <-> B <-> A This requires the following moves: C.next = D (node.prev.next = node.next) D.prev = C (node.next.prev = node.prev) E.next = N (head.prev.next = node) N.prev = E (node.prev = head.prev) N.next = A (node.next = head) A.prev = N (head.prev = node) N)rçrÜrÝ)rNrôÚheads r%rózlrucachedict._movetohead]sd€ð:�z‰zˆàŸ™ˆ� ‰ ŒàŸ™ˆ� ‰ Œà—I‘IˆŒ ð—I‘I—N‘NˆŒ àˆ� ‰ Œàˆ� ‰ Œàˆ� r'có¼—|j}t«}||j_|j|_||_||_|xjdz c_|S)zhAdd a node to the circular linked list. The new node is inserted before the head node. r)rçrÛrÝrÜrm)rNr rôs r%røzlrucachedict._addcapacityŒsJ€ð �z‰zˆÜ‹ˆØˆ� ‰ ŒØ—I‘IˆŒ ؈Œ ؈Œ Ø � Š �a‰� ؈ r'có2—t|«dks|j|jkryt|jdz«}|jj }|j tur|j }|j turŒt|«dkDr‚|j|kDrr|j|j =|xj|jzc_|j«|j }t|«dkDr|j|kDrŒpyyyy)Nrgè?) rwrérêr”rçrÝrZràrærÞrâ)rNÚ targetcostr–s r%r÷zlrucachedict._enforcecostlimitšsÑ€ô ˆt‹9˜Š>˜TŸ^™^¨t¯|©|Ò;Ø ô˜Ÿ™¨Ñ,Ó-ˆ à �J‰J�O‰OˆØ�e‰e”wÑØ—‘ˆAð�e‰e”wÒô�$‹i˜!Šm §¡°Ò ;Ø— ‘ ˜AŸE™EÐ"Ø �NŠN˜aŸf™fÑ $�NØ �K‰KŒMØ—‘ˆAô �$‹i˜!Šm §¡°Ô ;ˆmÐ ;ˆmr'rƒrTr))rdrerfrgrRrìrïr_r[rºr³rüràrûrörrr¯rrórør÷r*r'r%rärä�sh„ñó,ò ò òòó %%òNòð%óó,ð &ó òóò>ò8-ò^ ór'räc󊇇‡—iŠtj«Š‰jjdk(r ˆˆˆfd„}|Sˆˆˆfd„}|S)z+cache most recent results of function callsrcó°•—|‰vr+t‰«dkDr‰‰j«=‰|«‰|<n‰j|«‰j|«‰|S©Né©rwÚpopleftÚremover³)r£r¤rŸÚorders €€€r%r¡zlrucachefunc..fÁsSø€Ø˜%ÑÜ�u“: ’?ؘeŸm™m›oÐ.Ù! #›Y��c’ à— ‘ ˜SÔ!Ø �L‰L˜Ô ؘ‘:Ð r'c󪕗|‰vr(t‰«dkDr‰‰j«=‰|މ|<n‰j|«‰j|«‰|Srr)r¬r¤rŸrs €€€r%r¡zlrucachefunc..fÍsSø€Ø˜5Ñ Ü�u“: ’?ؘeŸm™m›oÐ.Ù" D˜k��d’ à— ‘ ˜TÔ"Ø �L‰L˜Ô ؘ‘;Ð r')Ú collectionsÚdequer¦r§)rŸr¡r¤rs` @@r%Ú lrucachefuncr»s@ú€à €EÜ × Ñ Ó €EØ ‡}�}× Ñ  AÒ%ö ð, €Hö ð €Hr'có —eZdZd„Zdd„Zd„Zy)Ú propertycachecó4—||_|j|_yrT)rŸrdrß)rNrŸs r%rRzpropertycache.__init__Ûs€ØˆŒ Ø—M‘Mˆ� r'NcóL—|j|«}|j||«|SrT)rŸÚ cachevalue)rNÚobjÚtypers r%Ú__get__zpropertycache.__get__ßs"€Ø—‘˜3“ˆØ �‰˜˜VÔ$؈ r'có6—||j|j<yrT)Ú__dict__rß)rNrrîs r%rzpropertycache.cachevalueäs€à"'ˆ� ‰ �T—Y‘YÒr'rT)rdrerfrRr rr*r'r%rrÚs„ò"óó (r'rcóf—tj|«}||jvr|j|=yy)z2clear a cached property value, if one has been setN)rr9r")rÚprops r%Úclearcachedpropertyr%és-€ä �?‰?˜4Ó €DØ ˆs�|‰|ÑØ �L‰L˜Ñ ðr'éc#óK—d„}g}d}|D]a}|j|«|t|«z }||k\sŒ(||kr|dz}d||«z}||kDr|}||kDr|}dj|«–—d}g}Œc|rdj|«–—yy­w)zrreturn no less than min bytes per chunk while data remains, doubling min after each chunk until it reaches maxcó4—|syd}|r |dz}|dz }|rŒ |dz S)Nrrr*)Úxr›s r%Úlog2zincreasingchunks..log2ôs2€ÙØØ ˆÙØ �!‰GˆAØ �‰FˆAòð�1‰uˆ r'rrr'N)r³rwrª)Úsourcer¦r¤r*r±ÚblenÚchunkÚnmins r%Úincreasingchunksr/ðs§èø€òð €CØ €DÛˆØ � ‰ �5ÔØ ”�E“ ÑˆØ �3‹;Ø�SŠyؘQ‘h�Ø™D ›J‘�ؘ#’:Ø�Cؘ’9Ø�CØ—(‘(˜3“-Ò ØˆD؉Cðñ Ø�h‰h�s‹mÓð ùs ‚1B´ABcó—y)NTr*©rõs r%Úalwaysr2s€Ø r'có—y©NFr*r1s r%Úneverr5s€Ø r'có‡—ˆfd„}|S)a disable garbage collector Python's garbage collector triggers a GC each time a certain number of container objects (the number being defined by gc.get_threshold()) are allocated even when marked not to be tracked by the collector. Tracking has no effect on when GCs are triggered, only on what objects the GC looks into. As a workaround, disable GC while building complex (huge) containers. This garbage collector issue have been fixed in 2.7. But it still affect CPython's performance. cóÌ•—tj«}tj« ‰|i|¤Ž|rtj«SS#|rtj«wwxYwrT)ÚgcÚ isenabledÚdisableÚenable)r¬r­Ú gcenabledrŸs €r%Úwrapperznogc..wrapper'sLø€Ü—L‘L“Nˆ Ü � ‰ Œ ð Ù˜Ð( Ñ(áÜ— ‘ • ðø‰yÜ— ‘ • ðús «A Á A#r*©rŸr=s` r%Únogcr?sø€ôð €Nr'có—|SrTr*©r)s r%r»r»5s€‘Qr'cóê—|s t|«Stjj|«rŠtjj |«dtjj |«dk7r)tjj |t|««Sdj t |«|f«}t|«|jd«}}|j«|j«|r=|r;|d|dk(r0|j«|j«|r|r |d|dk(rŒ0|j«tjj dgt|«z|z«xsdS)aareturn the relative path from one place to another. root should use os.sep to separate directories n1 should use os.sep to separate directories n2 should use "/" to separate directories returns an os.sep-separated path. If n1 is a relative path, it's assumed it's relative to root. n2 should always be relative to root. ró/r€ó..rŒ)Ú localpathr!ÚpathÚisabsÚ splitdriverªÚpconvertÚ splitpathr“ÚreverserûrÚosseprw)ÚrootÚn1Ún2ÚaÚbs r%ÚpathtorR8s€ñ ܘ‹}ÐÜ ‡w�w‡}�}�RÔÜ �7‰7× Ñ ˜dÓ # AÑ &¬"¯'©'×*<Ñ*<¸RÓ*@ÀÑ*CÒ CÜ—7‘7—<‘< ¤i°£mÓ4Ð 4Ø �Y‰Yœ ›¨Ð+Ó ,ˆÜ �R‹=˜"Ÿ(™( 4›.€q€A؇I�I„K؇I�I„KÙ ‘�a˜‘e˜q ™u’nØ �‰ŒØ �‰Œñ ‘�a˜‘e˜q ™u“nð‡I�I„KÜ �>‰>× Ñ   ¬#¨a«&Ñ 0°AÑ5Ó 6Ò >¸$Ð>r'c󇇗ˆˆfd„}|S)z5wrap a function with code to check for calling errorsc󾕗 ‰|i|¤ŽS#t$rHttjt j «d««‰k(rt j‚‚wxYw)Nr‹)Ú TypeErrorrwÚ tracebackÚ extract_tbr;Úexc_infor ÚSignatureError)r¬r­ÚdepthrŸs €€r%Úcheckzchecksignature..checkWsYø€ð Ù˜Ð( Ñ(Ð (øÜò Ü”9×'Ñ'¬¯ © «°qÑ(9Ó:Ó;¸uÒDÜ×*Ñ*Ð*Ø ð ús ƒ ‹AAr*)rŸrZr[s`` r%Úchecksignaturer\Tsù€õð €Lr'> óhfsójfsóufsóxfsózfsóNTFSóapfsóext2óext3óext4óbtrfsótmpfsóreiserfscó:—|r|rJ‚d}tjj|«r&|r|xrtj |«}t |«|r>|r< t tjj|««} | tvr |�|«d}|r' t||«|�d} tj| «‚ytjj!|«rCtj"tj$|«|«|�d} tj| «‚y t'j(||«|rt'j*||«n…t'j,||«|rm|j.ratj |«} | j1|«r;|j.t.j2dzdz} tj4|| | f«|�(t7|d¬«5}|j9|«ddd«yy#t$rd} Y�ŒŒwxYw#ttf$r1} | jtjk7r |�|«Yd} ~ �Œ�d} ~ wwxYw#1swYyxYw#t&j:$r-}tj<t?j@|««‚d}~wwxYw) afcopy a file, preserving mode and optionally other stat info like atime/mtime checkambig argument is used with filestat, and is useful only if destination file is guarded by any lock (e.g. repo.lock or repo.wlock). copystat and checkambig should be exclusive. nb_bytes: if set only copy the first `nb_bytes` of the source file. NFz7the `nb_bytes` argument is incompatible with `hardlink`z"cannot use `nb_bytes` on a symlinkréÿÿÿzr+)ri)!r!rFÚlexistsÚfilestatÚfrompathÚunlinkÚ getfstypeÚdirnameÚOSErrorÚ_hardlinkfswhitelistÚoslinkr r•ÚIOErrorÚerrnoÚEEXISTÚislinkÚsymlinkÚreadlinkÚshutilÚcopyfileÚcopystatÚcopymodeÚstatÚisambigÚST_MTIMEÚutimerrÙÚErrorrKrÚ forcebytestr)rµrZÚhardlinkr}Ú checkambigÚnb_bytesÚno_hardlink_cbÚcheck_fs_hardlinkÚoldstatÚfstyper—ÚexcÚnewstatÚadvancedr¡Úinsts r%r|r|ts5€ñ*™ZÐ(Ð (Ø€GÜ ‡w�w‡��tÔÙ Ø Ò<¤X×%6Ñ%6°tÓ%<ˆG܈tŒ ÙÑ%ð ÜœrŸw™wŸ™¨tÓ4Ó5ˆFð Ô-Ñ -ØÐ)ÙÔ ØˆHÙð !Ü �3˜Ô ØÐ#ØM�Ü×,Ñ,¨QÓ/Ð/Ø ô  ‡w�w‡~�~�cÔÜ � ‰ ”2—;‘;˜sÓ# TÔ*ð Ð Ø4ˆAÜ×(Ñ(¨Ó+Ð +ð ð =Ü �O‰O˜C Ô &Ùä—‘  TÕ*ä—‘  TÔ*Ù˜wŸ|š|Ü&×/Ñ/°Ó5�GØ—‘ wÔ/ð$ŸL™L¬¯©Ñ7¸!Ñ;Ø&ñ$'˜ôŸ™ ¨°(Ð';Ô<àÐ#ܘ$ TÕ*¨aØ—J‘J˜xÔ(÷+Ð*ð$øôSò Ø‹Fð ûôœÐ!ò !Ø�y‰yœEŸL™LÒ(¨^Ð-GÙÔ ÿùð !ú÷:+Ð*ûä�|‰|ò =Ü—+‘+œj×5Ñ5°dÓ;Ó<Ð <ûð =úsaÁ(G9Â%H ÄCIÇIÇ/IÇ9 HÈHÈ I È&IÉI ÉIÉIÉIÉJÉ-(JÊJcóJ‡‡—d}ˆˆfd„}tjj|«r牀\tj|«jtjtjj |««jk(Š|«tj |«t|«D][\}}tjj||«}tjj||«} t|| ‰‰«\Š} || z }Œ]‰|fS‰€ytjtjj |««jtjtjj |««jk(Š|«‰r t||«ntj ||«|dz }‰r‰j#«‰|fS#ttf$r?} | jtjk7rdŠtj ||«Yd} ~ Œdd} ~ wwxYw)z2Copy a directory tree using hardlinks if possible.rcóF•—‰r‰r td«n td«‰_yy)Nslinkingscopying)rLÚtopic)r…Úprogresss€€r%Úsettopiczcopyfiles..settopicÈsø€Ù Ù.6œQ˜zœ]¼A¸j»MˆH�Nð r'NFr)r!rFÚisdirrÚst_devrqÚmkdirÚlistdirrªÚ copyfilesrtrurrrvrwr{r¯Ú increment) rµÚdstr…r“Únumr”rßÚkindÚsrcnameÚdstnamer–rŒs `` r%r™r™Äsªù€à €CõJô ‡w�w‡}�}�SÔØ Ð ä—‘˜“ ×#Ñ#¤r§w¡w¬r¯w©w¯©¸sÓ/CÓ'D×'KÑ'KÑKð ñ Œ Ü �‰�Œ Ü! #ž,‰JˆD�$Ü—g‘g—l‘l 3¨Ó-ˆGÜ—g‘g—l‘l 3¨Ó-ˆGÜ# G¨W°hÀÓI‰KˆH�aØ �1‰H‰Cð 'ð6 �Sˆ=Ðð+ Ð ä—‘œŸ™Ÿ™¨Ó,Ó-×4Ñ4Ü—7‘7œ2Ÿ7™7Ÿ?™?¨3Ó/Ó0×7Ñ7ñ8ð ñ Œ á ð &Ü�s˜CÕ ô �K‰K˜˜SÔ !Ø ˆq‰ˆÙ Ø × Ñ Ô à �Sˆ=ÐøôœWÐ%ò &Ø—9‘9¤§ ¡ Ò,Ø$�Hä— ‘ ˜C ×%Ñ%ûð  &úsÆ GÇH"Ç#5HÈH">óauxóconónulóprnócom1ócom2ócom3ócom4ócom5ócom6ócom7ócom8ócom9ólpt1ólpt2ólpt3ólpt4ólpt5ólpt6ólpt7ólpt8ólpt9s:*?"<>|có—|jd«r td«Sd|vr td«S|jdd«jd«D]¼}|sŒt |«D]O}|t vrtd«|zccSt |«dksŒ,td«tj|«zccS|jd «d }|r&|j«tvrtd«|zcS|d d }|d vsŒ©|dvsŒ®td«|zcSy )aUCheck that the base-relative path is a valid filename on Windows. Returns None if the path is ok, or a UI string describing the problem. >>> checkwinfilename(b"just/a/normal/path") >>> checkwinfilename(b"foo/bar/con.xml") "filename contains 'con', which is reserved on Windows" >>> checkwinfilename(b"foo/con.xml/bar") "filename contains 'con', which is reserved on Windows" >>> checkwinfilename(b"foo/bar/xml.con") >>> checkwinfilename(b"foo/bar/AUX/bla.txt") "filename contains 'AUX', which is reserved on Windows" >>> checkwinfilename(b"foo/bar/bla:.txt") "filename contains ':', which is reserved on Windows" >>> checkwinfilename(b"foo/bar/b\07la.txt") "filename contains '\\x07', which is invalid on Windows" >>> checkwinfilename(b"foo/bar/bla ") "filename ends with ' ', which is not allowed on Windows" >>> checkwinfilename(b"../bar") >>> checkwinfilename(b"foo\\") "filename ends with '\\', which is invalid on Windows" >>> checkwinfilename(b"foo\\/bar") "directory name ends with '\\', which is invalid on Windows" ó\s3filename ends with '\', which is invalid on Windowss\/s9directory name ends with '\', which is invalid on WindowsrCs4filename contains '%s', which is reserved on Windowsés3filename contains '%s', which is invalid on WindowsrŒrr€Ns. rDs8filename ends with '%s', which is not allowed on Windows) ÚendswithrLÚreplacer“Ú_filenamebytestrÚ_winreservedcharsÚordrrKÚlowerÚ_winreservednames)rFr–ÚcÚbaseÚts r%Úcheckwinfilenamerà s*€ð2 ‡}�}�UÔÜÐHÓIÐIØ ��~ÜÐNÓOÐOØ �\‰\˜% Ó &× ,Ñ ,¨TÖ 2ˆÙØ Ü! !Ö$ˆAØÔ%Ñ%äð&óðñ ôô�1‹v˜‹|ÜØJóä×(Ñ(¨Ó+ñ,ô,ð%ð�w‰w�t‹}˜Qш٠�D—J‘J“LÔ$5Ñ5äÐIÓJØñò ð ˆbˆcˆFˆØ �Š:˜! 5š.äð"óðñ ò ñ13r'Ú perf_countercó¸— tj||«S#t$r(}|jtjk(r‚Yd}~nd}~wt $rYnwxYwtj tjztjzttdd«z}tj||«}tj||«tj|«y)z”Create a lock file atomically if possible This may leave a stale lock file if symlink isn't supported and signal interrupt is enabled. NÚO_BINARYr) r!ryrrrvrwÚAttributeErrorÚO_CREATÚO_WRONLYÚO_EXCLrrrÒrž)ÚinfoÚpathnameÚwhyrmÚlds r%ÚmakelockrÏWsŸ€ð  Ü�z‰z˜$ Ó)Ð)øÜ òØ �9‰9œŸ ™ Ò $Ø ô %ûä ò Ù ð úô �J‰JœŸ™Ñ $¤r§y¡yÑ 0´7¼2¸zÈ1Ó3MÑ M€EÜ �‰�˜5Ó !€B܇H�HˆR�Ô܇H�HˆR…Ls‚˜ A¡AÁ AÁAcó— t|«S#t$r7}|jtjtjfvr‚Yd}~nd}~wt $rYnwxYwt |d«5}|j«cddd«S#1swYyxYw©Nórb)rzrrrvÚEINVALÚENOSYSrÇÚ posixfilerv)rÌrÍrºs r%ÚreadlockrÖkso€ð ܘÓ!Ð!øÜ òØ �9‰9œUŸ\™\¬5¯<©<Ð8Ñ 8Ø ô 9ûä ò Ù ð úä �8˜UÔ # rØ�w‰w‹y÷ $× #Ò #ús&‚ � A–-AÁ AÁAÁ&BÂB có¦— tj|j««S#t$r"tj|j «cYSwxYw)z1stat file object that may not have fileno method.)r!rÀrœrÇrrßr¹s r%rÀrÀxs>€ð Ü�x‰x˜Ÿ ™ › Ó$Ð$øÜ ò Ü�w‰w�r—w‘wÓÒð ús‚"%¥(AÁAcó^—tj|«}tjj|«\}}|j «}||k(r|j «}||k(rytjj ||«} tj|«}||k(ryy#t$rYywxYw)z¤ Return true if the given path is on a case-sensitive filesystem Requires a path (like /foo/.hg) ending with a foldable final directory component. TF)r!ÚlstatrFr“Úupperr¾rªrr)rFÚs1ÚdrQÚb2Úp2Ús2s r%Úfscasesensitiveràƒs“€ô �‰�$‹€BÜ �7‰7�=‰=˜Ó �D€A€qØ �‰‹€B؈B‚wØ �W‰W‹YˆØ �Š7ØÜ �‰�‰�a˜Ó €BðÜ �X‰X�b‹\ˆØ �Š8ØØøÜ òÙðúsÂB  B,Â+B,có—|SrTr*rAs r%r»r»œs€‘qr'cóB—t€tj«tS)z0return True is re2 is available, False otherwise)Ú_re2Ú_reÚ _checkre2r*r'r%Úhas_re2ræ¥s€ä €|Ü � ‰ ŒÜ €Kr'có4—eZdZed„«Zdd„Zed„«Zy)räcóB—t�yd}d} ttj||««ay#t$rdaYyt $r\t j|«}t j|«}ttj||««at jaYywxYw)Ns \[([^\[]+)\]s[ui]F) rãr—Úre2r�r‰rUrr9Ú _re2_input)Ú check_patternÚ check_inputs r%råz _re._checkre2­s‰€ô Ð à à(ˆ ؈ ð )䜟 ™  -°Ó=Ó>‰DøÜò ØŠDÜò )ô%ŸO™O¨MÓ:ˆMÜ"Ÿ/™/¨+Ó6ˆKÜœŸ ™  -°Ó=Ó>ˆDÜ!Ÿ™ŠJð  )ús�-­ BºA!BÂBcó†—t€|j«trw|tjtjzzdk(rO|tjzrd|z}|tjzrd|z} t j t|««Stj ||«S#t j$rYŒ+wxYw)zãCompile a regular expression, using re2 if possible For best performance, use only re2-compatible regexp features. The only flags from the re module that are re2-compatible are IGNORECASE and MULTILINE.rs(?i)s(?m)) rãrår�Ú IGNORECASEÚ MULTILINEréÚcompilerêr )rNÚpatrms r%rðz _re.compileÄs£€ô ˆ<Ø �N‰NÔ Ý �Uœu×/Ñ/´%·/±/ÑAÐBÑBÀqÒHØ”u×'Ñ'Ò'Ø ‘m�Ø”u—‘Ò&Ø ‘m�ð Ü—{‘{¤:¨c£?Ó3Ð3ô�}‰}˜S %Ó(Ð(øô—9‘9ò Ùð úsÁ6B*Â*CÂ?Ccóz—t€|j«trtjStjS)zÛReturn the version of escape corresponding to self.compile. This is imperfect because whether re2 or re is used for a particular function depends on the flags, etc, but it's the best we can do. )rãråréÚescaper�r^s r%róz _re.escape×s*€ô ˆ<Ø �N‰NÔ Ý Ü—:‘:Ð ä—<‘<Ð r'Nrƒ)rdrerfrhrårðrrór*r'r%rärä¬s-„Øñ)óð)ó,)ð&ñ  óñ  r'räcó˜—d„}tj}tjr|tjz}|jdd«t j d||fz«}t jj|«}g}|j|«D]£\}}|r|j|«Œ|tvr||«t|<t|} | j|«} | s"||«xt|<} | j|«} |j| xs|«t jj||«}Œ¥dj|«S)a4Get name in the case stored in the filesystem The name should be relative to root, and be normcase-ed for efficiency. Note that this function is unnecessary, and should not be called, for case-sensitive filesystems (simply because it's expensive). The root should be normcase-ed, too. cóf—tj|«D�cic]}t|«|“Œc}Scc}wrT)r!r˜Únormcase)Údirr–s r%Ú_makefspathcacheentryz%fspath.._makefspathcacheentryøs*€Ü(*¯ © °3¬Ó8© 1”˜“ ˜Q‘¨Ñ8Ð8ùÒ8s˜.r·s\\s([^%s]+)|([%s]+)r')rrLÚosaltseprºr�rðr!rFÚnormpathÚfindallr³Ú _fspathcacherörª) rßrMrøÚsepsÚpatternr÷rÚpartÚsepÚcontentsÚfounds r%Úfspathrìs€ò9ô �>‰>€DÜ×ÒØ”h×'Ñ'Ñ'ˆà‡L�L�˜Ô Ü�m‰mÐ0°D¸$°<Ñ?Ó@€GÜ �'‰'× Ñ ˜4Ó €CØ €FØ—_‘_ TÖ*‰ ˆˆcÙ Ø �M‰M˜#Ô Ø à ”lÑ "Ù 5°cÓ :ŒL˜Ñ Ü Ñ$ˆà— ‘ ˜TÓ"ˆÙñ,AÀÓ+EÐ EŒL˜Ñ  Ø—L‘L Ó&ˆEà� ‰ �e’m˜tÔ$Ü�g‰g�l‰l˜3 Ó%‰ð#+ð& �8‰8�FÓ Ðr'cóø—d\}}} tjdtjj |«zdtjj |«¬«\}}tj |«d|ddz}t||«t|«}t|«dkD|�|j «||fD]} |�tj|«ŒS#t$rYŒ)wxYw#t$rEY|�|j «||fD])} |�tj|«Œ#t$rYŒ'wxYwy wxYw#|�|j «||fD])} |�tj|«Œ#t$rYŒ'wxYwwxYw) z5check whether hardlink count reporting works properly)NNNó.%s-s1~©ÚprefixÚsuffixr÷s%s2~NéþÿÿÿrF) rÚmkstempr!rFÚbasenamerqržrtrÕÚnlinksrorr)ÚtestfileÚf1Úf2rºrÂr¡s r%Ú checknlinkr sr€ð "�J€BˆˆBðÜ×!Ñ!ØœRŸW™W×-Ñ-¨hÓ7Ñ7ØÜ—‘—‘ Ó)ô ‰ˆˆBô �‰�Œ Ø �r˜#˜2�wÑ ˆäˆr�2Œô�r‹]ˆÜ�b‹z˜A‰~ð ˆ>Ø �H‰HŒJØ�b“ˆAð Ø�=Ü—I‘I˜a”Løñøôò Ùð ûô òØà ˆ>Ø �H‰HŒJØ�b“ˆAð Ø�=Ü—I‘I˜a”LùÜò Ùð úñ ð ûð ˆ>Ø �H‰HŒJØ�b“ˆAð Ø�=Ü—I‘I˜a”LùÜò Ùð úñ úslˆBC$Â;Cà C!à C!Ã$ D2Ã-D5ÄD Ä D,Ä+D,Ä1D2Ä2D5Ä5E9ÅE(Å'E9Å( E4 Å1E9Å3E4 Å4E9có¸—t|jtj«xs1tjxr|jtj««S)z)Check path ends with os.sep or os.altsep.)r—r¹rrLrù©rFs r%Ú endswithsepr; sF€ô Ø � ‰ ”h—n‘nÓ%ò -Ü × Ñ ò -Ø �M‰Mœ(×+Ñ+Ó ,ó ðr'có@—|jtj«S)zâSplit path by os.sep. Note that this function does not use os.altsep because this is an alternative of simple "xxx.split(os.sep)". It is recommended to use os.path.normpath() before using this function if need.)r“rrLrs r%rJrJE s€ð �:‰:”h—n‘nÓ %Ð%r'cót—tjj|«\}}tjd|zd|¬«\}}tj |«t ||||«|r|S t|d«}t|d«} t|«D]} | j| «Œ|j «| j «|S#t$r>} | jtjk(r|cYd} ~ St| dd«s|| _ ‚d} ~ wwxYw# tj|«‚#t $rY‚wxYwxYw)aCreate a temporary file with the same contents from name The permission bits are copied from the original file. If the temporary file is going to be truncated immediately, you can use emptyok=True as an optimization. Returns the name of the temporary file. ró~rrÒNÚfilenameówb)r!rFr“rr ržr~rÕrurvÚENOENTrrÚ filechunkiterrÒrorr) rßÚemptyokÚ createmodeÚenforcewritablerÜrõrÂÚtempÚifpr�Úofpr-s r%Ú mktempcopyr!O s€ô �G‰G�M‰M˜$Ó �E€A€rÜ×Ñ w°¡|¸DÀaÔH�H€BˆÜ‡H�HˆR„Lô ˆT�4˜ _Ô5áØˆ ðð ܘD %Ó(ˆCô˜˜eÓ$ˆÜ" 3Ö'ˆEØ �I‰I�eÕ ð(à � ‰ Œ Ø � ‰ Œ ð €Køô#ò Ø�z‰zœUŸ\™\Ò)Ø• ܘ4 ¨TÔ2Ø $�” Ø ûð  ûðð Ü �I‰I�dŒOð øôò Ø Ø ð ýsaÁ* CÁ6A Dà D ÃDÃ,D Ã-DÃ2DÄD Ä DÄD7ÄD(Ä'D7Ä( D4Ä1D7Ä3D4Ä4D7cóf—eZdZdZd„Zed„«Zed„«ZejZ d„Z d„Z d„Z d„Z y ) rmzæhelp to exactly detect change of a file 'stat' attribute is result of 'os.stat()' if specified 'path' exists. Otherwise, it is None. This can avoid preparative 'exists()' examination on client side of this class. có—||_yrT)r)rNrs r%rRzfilestat.__init__‚ s €Øˆ� r'có`— tj|«}||«S#t$rd}YŒwxYwrT)r!rÚFileNotFoundError)rŽrFrs r%rnzfilestat.frompath… s6€ð Ü—7‘7˜4“=ˆDñ�4‹yÐøô!ò ØŠDð ús ‚Ÿ -¬-cóX—tj|j««}||«SrT)r!rÀrœ)rŽrºrs r%Úfromfpzfilestat.fromfp� s €ä�x‰x˜Ÿ ™ › Ó$ˆÙ�4‹yÐr'cóÌ— |jj|jjk(xrx|jtj|jtjk(xr;|jtj|jtjk(S#t$rYnwxYw |jduxr|jduS#t$rYywxYwr4)rrÁÚST_CTIMEr�rÇ©rNÚolds r%Ú__eq__zfilestat.__eq__” s€ð ð — ‘ ×!Ñ! S§X¡X×%5Ñ%5Ñ5òHØ—I‘IœdŸm™mÑ,°·±¼¿¹Ñ0GÑGòHà—I‘IœdŸm™mÑ,°·±¼¿¹Ñ0GÑGð øô ò Ù ð úð Ø—9‘9 Ð$Ò9¨¯©°TÐ)9Ð 9øÜò Ùð ús$‚B&B)Â) B5Â4B5Â9Cà C#Ã"C#có˜— |jtj|jtjk(S#t$rYywxYw)aExamine whether new (= self) stat is ambiguous against old one "S[N]" below means stat of a file at N-th change: - S[n-1].ctime < S[n].ctime: can detect change of a file - S[n-1].ctime == S[n].ctime - S[n-1].ctime < S[n].mtime: means natural advancing (*1) - S[n-1].ctime == S[n].mtime: is ambiguous (*2) - S[n-1].ctime > S[n].mtime: never occurs naturally (don't care) - S[n-1].ctime > S[n].ctime: never occurs naturally (don't care) Case (*2) above means that a file was changed twice or more at same time in sec (= S[n-1].ctime), and comparison of timestamp is ambiguous. Base idea to avoid such ambiguity is "advance mtime 1 sec, if timestamp is ambiguous". But advancing mtime only in case (*2) doesn't work as expected, because naturally advanced S[n].mtime in case (*1) might be equal to manually advanced S[n-1 or earlier].mtime. Therefore, all "S[n-1].ctime == S[n].ctime" cases should be treated as ambiguous regardless of mtime, to avoid overlooking by confliction between such mtime. Advancing mtime "if isambig(oldstat)" ensures "S[n-1].mtime != S[n].mtime", even if size of a file isn't changed. F)rr)rÇr*s r%r€zfilestat.isambig¥ s>€ð< Ø—9‘9œTŸ]™]Ñ+¨s¯x©x¼¿ ¹ Ñ/FÑFÐ FøÜò Ùð ús‚:=½ A ÁA cóš—|jtjdzdz} tj|||f«y#t$rYywxYw)aLChange file stat of specified path to avoid ambiguity 'old' should be previous filestat of 'path'. This skips avoiding ambiguity, if a process doesn't have appropriate privileges for 'path'. This returns False in this case. Otherwise, this returns True, as "ambiguity is avoided". rrkFT)rr�r!r‚ÚPermissionError)rNrFr+rŽs r%Ú avoidambigzfilestat.avoidambigÈ sS€ð—H‘HœTŸ]™]Ñ+¨aÑ/°:Ñ=ˆð Ü �H‰H�T˜H hÐ/Ô 0ð øô ò ñð ús¥>¾ A Á A có—||k( SrTr*)rNÚothers r%Ú__ne__zfilestat.__ne__Ü s€Ø˜5‘=Ð Ð r'N)rdrerfrgrRÚ classmethodrnr'rËÚ__hash__r,r€r0r3r*r'r%rmrmz sT„ñòðñóððñóðð�‰€Hòò"!òFó(!r'rmcó6—eZdZdZd d„Zd„Zd„Zd„Zd„Zd„Z y) Úatomictempfileawritable file object that atomically updates a file All writes will go to a temporary copy of the original file. Call close() when you are done writing, and atomictempfile will rename the temporary copy to the original name, making the changes visible. If the object is destroyed without being closed, all your writes are discarded. checkambig argument of constructor is used with filestat, and is useful only if target file is guarded by any lock (e.g. repo.lock or repo.wlock). NcóÊ—||_t|d|v|d|v¬«|_t|j|«|_||_|jj |_|jj|_|jj|_|jj|_ |jj|_ |jj|_ y)Nów)rrr) Ú_atomictempfile__namer!Ú _tempnamerÕÚ_fpÚ _checkambigrvrÒrÜrÏrÐrœ)rNrßrirr†s r%rRzatomictempfile.__init__î s£€ØˆŒ Ü#Ø Ø˜T�\Ø!Ø! T˜\ô  ˆŒô˜TŸ^™^¨TÓ2ˆŒØ%ˆÔð—H‘H—M‘MˆŒ Ø—X‘X—^‘^ˆŒ ØŸ(™(×-Ñ-ˆŒØ—H‘H—M‘MˆŒ Ø—H‘H—M‘MˆŒ Ø—h‘h—o‘oˆ� r'có—|jjsð|jj«t|j«}|j xrt j|«}|r…|jryt|j|«t j|«}|j|«r<|jtjdzdz}tj|||f«yyt|j|«yy)Nrrk)r<ršržrEr:r=rmrnrÚrenamer;r€r�r!r‚)rNrrŠr�rŽs r%ržzatomictempfile.close sÀ€Ø�x‰x�ŠØ �H‰H�N‰NÔ Ü  §¡Ó-ˆHØ×&Ñ&ÒF¬8×+<Ñ+<¸XÓ+FˆGÙ˜7Ÿ<š<Ü�t—~‘~ xÔ0Ü"×+Ñ+¨HÓ5�Ø—?‘? 7Ô+à '§ ¡ ¬T¯]©]Ñ ;¸aÑ ?À:ÑM�HÜ—H‘H˜X¨°(Ð';Õ<ð,ô �t—~‘~ xÕ0ðr'cóÄ—|jjs; tj|j«|jj «yy#t $rYŒ'wxYwrT)r<ršr!ror;rrržr^s r%Údiscardzatomictempfile.discard sK€Ø�x‰x�Šð Ü— ‘ ˜$Ÿ.™.Ô)ð �H‰H�N‰NÕ ð øôò Ùð ús˜AÁ AÁAcó>—t|d«r|j«yy)Nr<)Ú safehasattrrAr^s r%Ú__del__zatomictempfile.__del__ s€Ü �t˜UÔ #Ø �L‰L�Nð $r'có—|SrTr*r^s r%rÈzatomictempfile.__enter__ rÉr'cóJ—|�|j«y|j«yrT)rArž)rNÚexctypeÚexcvaluerVs r%rÎzatomictempfile.__exit__ s€Ø Ð Ø �L‰L�Nà �J‰J�Lr')sw+bNF) rdrerfrgrRržrArDrÈrÎr*r'r%r7r7à s%„ñ ó&ò( 1òòòór'r7cóÈ— t|«y#t$rJ}|jtjk7r#|jtjk7r‚Yd}~yYd}~yd}~wwxYwrT)Ú removedirsrrrvrÚ ENOTEMPTY)r¡Úes r%ÚtryrmdirrM' sI€ðÜ�1� øÜ òØ �7‰7”e—l‘lÒ " q§w¡w´%·/±/Ò'AØ ô(BÔ "ûðús‚ Ž A!—;AÁA!có¬—|r t|«n t|«|r* ttjj |««yy#t $rYywxYw)z.unlink and remove the directory if it is emptyN)Ú tryunlinkrorJr!rFrqrr)r¡Ú ignoremissingÚrmdirs r%Ú unlinkpathrR/ sK€ñÜ�!� äˆqŒ Ù ð Ü ”r—w‘w—‘ qÓ)Õ *ð øôò Ù ð ús�(AÁ AÁAcó:— t|«y#t$rYywxYw)z5Attempt to remove a file, ignoring FileNotFoundError.N)ror%)r¡s r%rOrO> s €ð ܈q� øÜ ò Ù ð ús ‚ Ž ™có— t||«|�t j||«yy#t$rÍ}|jtjk(rYd}~y|jtjk7s|s‚t j jt|««}||k(r‚t|||« t||«n8#t$r,}|jtjk(r Yd}~Yd}~y‚d}~wwxYwYd}~Œëd}~wwxYw)zàrecursive directory creation with parent mode inheritance Newly created directories are marked as "not to be indexed by the content indexing service", if ``notindexed`` is specified for "write" mode access. N) Úmakedirrrrvrwrr!rFrqÚabspathÚmakedirsÚchmod)rßriÚ notindexedÚerrÚparents r%rWrWG s΀ðÜ��jÔ!ð" ÐÜ �‰��tÕðøô! òØ �9‰9œŸ ™ Ò $Ü Ø �9‰9œŸ ™ Ò $©DØ Ü—‘—‘¤¨£Ó/ˆØ �TŠ>Ø Ü�˜˜zÔ*ð Ü �D˜*Õ %øÜò à�y‰yœEŸL™LÒ(ß�Ø ûð  úô &ûðúsK‚ (¨ C>±C9ÁAC9Â/ B<Â;C9Â< C1ÃC,Ã"C9Ã+C,Ã,C1Ã1C9Ã9C>cóf—t|d«5}|j«cddd«S#1swYyxYwrÑ)rrv)rFrºs r%Úreadfiler]e s#€ä ˆd�EÔ ˜bØ�w‰w‹y÷ × Ò ús�'§0cóh—t|d«5}|j|«ddd«y#1swYyxYw)Nr©rrÒ©rFÚtextrºs r%Ú writefilerbk ó%€ä ˆd�EÔ ˜bØ �‰�Œ÷ × Ñ úó�(¨1cóh—t|d«5}|j|«ddd«y#1swYyxYw)Nsabr_r`s r%Ú appendfilerfq rcrdcó—eZdZdZd„Zdd„Zy)Ú chunkbufferzoAllow arbitrary sized chunks of data to be efficiently read from an iterator over chunks of arbitrary size.cód—d„}||«|_tj«|_d|_y)z?in_iter is the iterator that's iterating over the input chunks.c3óœK—|D]C}t|«dkDr/d}|t|«ksŒ"|dz}|||–—|}|t|«krŒŒ@|–—ŒEy­w)Néré©rw)Úchunksr-ÚposÚends r%Úsplitbigz&chunkbuffer.__init__..splitbig~ s\èø€Û�Ü�u“: Ò'Ø�Cؤ E£ Ó*Ø! G™m˜Ø# C¨˜nÒ,Ø!˜ð¤ E£ Ô*ð  “Kñ ùs‚$A §A ÁA rN)r]rrÚ_queueÚ _chunkoffset)rNÚin_iterrqs r%rRzchunkbuffer.__init__{ s-€ò ñ˜WÓ%ˆŒ Ü!×'Ñ'Ó)ˆŒ ؈Õr'Ncó‚—|€dj|j«S|}g}|j}|dkDrý|sÔ*Ø$%�Õ!ð— ‘ ˜5 ¨&°4©-Ð8Ô9Ø×!Ò! TÑ)Õ!ؘÑ&�ð[�Q‹hð^�x‰x˜‹}Ðr'rT)rdrerfrgrRrvr*r'r%rhrhw s„ñ/òô$:r'rhc#ó¨K—|dk\sJ‚|�|dk\sJ‚ |€|}n t||«}|xr|j|«}|sy|r|t|«z}|–—Œ>­w)aYCreate a generator that produces the data in the file size (default 131072) bytes at a time, up to optional limit (default is to read all data). Chunks may be less than size bytes if the chunk is the last chunk in the file, or the file is a socket or some other type of file that sometimes reads less data than is requested.rN)r¦rvrw)r¡rtrWÚnbytesrPs r%rrÊ spèø€ð �1Š9Ј9Ø ˆ=˜E QšJÐ&Ð &Ø Ø ˆ=؉F䘠Ó%ˆFØ Ò %�q—v‘v˜f“~ˆÙØ Ù Ø ”S˜“V‰OˆEØŠð ùs‚AAcó$—eZdZdZd„Zdd„Zd„Zy)Ú cappedreaderaÍA file object proxy that allows reading up to N bytes. Given a source file object, instances of this type allow reading up to N bytes from that source file object. Attempts to read past the allowed limit are treated as EOF. It is assumed that I/O is not performed on the original file object in addition to I/O that is performed by this instance. If there is, state tracking will get out of sync and unexpected results will ensue. có —||_||_y)z,Allow reading up to bytes from .N)rlÚ_left)rNrsrWs r%rRzcappedreader.__init__ì s€àˆŒØˆ� r'cóþ—|jsy|dkr |j}|jjt||j««}|xjt |«zc_|jdk\sJ‚|S)Nr'r)r�rlrvr¦rw)rNr–rVs r%rvzcappedreader.readñ s`€Ø�zŠzØà ˆqŠ5Ø— ‘ ˆAà�x‰x�}‰}œS  D§J¡JÓ/Ó0ˆØ � Š ”c˜$“iÑ� Ø�z‰z˜QŠÐˆàˆ r'cón—|jt|««}|€y||dt|«t|«Sr))rvrw)rNrQrôs r%r×zcappedreader.readintoþ s4€Ø�i‰iœ˜A›ÓˆØ ˆ;Øàˆˆ!Œc�#‹hˆÜ�3‹xˆr'Nr)rdrerfrgrRrvr×r*r'r%rrà s„ñ òó ór'rcó‡—ˆfd„}|S)z@return a function that renders a readable count of some quantitycóx•—‰D]*\}}}t|«||zk\sŒ||t|«z zcS‰dd|zS)Nr€r‹)ÚabsÚfloat)ÚcountÚ multiplierÚdivisorÚformatÚ unittables €r%Úgozunitcountfn..go sOø€Û+4Ñ 'ˆJ˜ Ü�5‹z˜W zÑ1Ó1Ø ¬¨w«Ñ!7Ñ8Ò8ð,5ð˜‰}˜QÑ %Ñ'Ð'r'r*)rŒr�s` r%Ú unitcountfnrŽ sø€ô(ð €Ir'có¢—||z dkrtjtd««‚|dkrtjtd««‚|dz |fS)aŠCheck that linerange : makes sense and return a 0-based range. >>> processlinerange(10, 20) (9, 20) >>> processlinerange(2, 1) Traceback (most recent call last): ... ParseError: line range must be positive >>> processlinerange(0, 5) Traceback (most recent call last): ... ParseError: fromline must be strictly positive rsline range must be positivers"fromline must be strictly positive)r Ú ParseErrorrL)ÚfromlineÚtolines r%Úprocesslineranger“ sU€ð �ј1ÒÜ×ÑœqÐ!?Ó@ÓAÐAØ�!‚|Ü×ÑœqÐ!FÓGÓHÐHØ �a‰<˜Ð Ðr'édé@s%.0f GBé s%.1f GBs%.2f GBrks%.0f MBs%.1f MBs%.2f MBs%.0f KBs%.1f KBs%.2f KBs %.0f bytescó(—eZdZdZd„Zd„Zd„Zd„Zy)Útransformingwriterz3Writable file wrapper to transform data by functioncó —||_||_yrT)r<Ú_encode)rNrºÚencodes r%rRztransformingwriter.__init__; s€ØˆŒØˆ� r'có8—|jj«yrT)r<ržr^s r%ržztransformingwriter.close? ó€Ø �‰�‰Õr'có8—|jj«yrT)r<r=r^s r%r=ztransformingwriter.flushB r�r'cóV—|jj|j|««SrT)r<rÒrš)rNrVs r%rÒztransformingwriter.writeE s€Ø�x‰x�~‰~˜dŸl™l¨4Ó0Ó1Ð1r'N)rdrerfrgrRržr=rÒr*r'r%r˜r˜8 s„Ù=òòòó2r'r˜s\r*\ncó.—tjd|«S)Nr©©Ú_eolreÚsub©rPs r%Útolfr¥O s€ä �:‰:�e˜QÓ Ðr'có.—tjd|«S)Nó r¡r¤s r%Útocrlfr¨T s€ä �:‰:�g˜qÓ !Ð!r'có"—t|t«SrT)r˜r¨r¹s r%Ú _crlfwriterrªY s€Ü ˜b¤&Ó )Ð)r'r§có—|SrTr*r¹s r%Úiterfiler¬h s€Ø €Ir'c#óLK—|D]}|j«D]}|–—ŒŒy­wrT)rL)Úiteratorr-rNs r%Ú iterlinesr¯l s(èø€ãˆØ×$Ñ$Ö&ˆDØ‹Jñ'ñùs‚"$cóz—tjjtjj|««SrT)r!rFÚ expanduserÚ expandvarsrs r%Ú expandpathr³s s&€ä �7‰7× Ñ œbŸg™g×0Ñ0°Ó6Ó 7Ð7r'cóü‡‡—‰xsd„Šdj‰j««}|r#|d|zz }t|«dkDr|dd}n|}|‰|<tjd||fz«}|j ˆˆfd„|«S)aÂReturn the result of interpolating items in the mapping into string s. prefix is a single character string, or a two character string with a backslash as the first character if the prefix needs to be escaped in a regular expression. fn is an optional function that will be applied to the replacement text just before replacement. escape_prefix is an optional flag that allows using doubled prefix for its escaping. có—|SrTr*r¤s r%r»zinterpolate..… s€™!r'ó|rNs%s(%s)có<•—‰‰|j«dd«S)Nr)r‘)r)rõÚmappings €€r%r»zinterpolate..� sø€™2˜g a§g¡g£i°° mÑ4Ô5r')rªrqrwr�rðr£)rr¸rPrõÚ escape_prefixÚpatternsÚ prefix_charÚrs ` ` r%Ú interpolater½x sƒù€ð Ò ‘ €BØ�y‰y˜Ÿ™›Ó(€HÙØ�D˜6‘MÑ!ˆÜ ˆv‹;˜Š?Ø   ˜*‰Kà ˆKØ*ˆ� ÑÜ � ‰ �j F¨HÐ#5Ñ5Ó6€AØ �5‰5Ô5°qÓ 9Ð9r'g@�@s%.0f ss%.1f ss%.2f ss%.3f sgü©ñÒMbP?s%.1f mss%.2f mss%.3f msg�íµ ÷ư>s%.1f uss%.2f uss%.3f usg•Ö&è .>s%.1f nss%.2f nss%.3f nscóΗeZdZdZej ej d„«¬«Zej d¬«Zej d¬«Z d„Z e je «Z y)Ú timedcmstatszFStats information produced by the timedcm context manager on entering.có—t«SrT)Útimerr*r'r%r»ztimedcmstats.© s€´´r')r/rrcóH—|jrt|j«SdS)Ns )ÚelapsedÚ timecountr^s r%Ú __bytes__ztimedcmstats.__bytes__° s€Ø*.¯,ª,Œy˜Ÿ™Ó&ÐH¸LÐHr'N)rdrerfrgrÚibÚFactoryÚstartrÃrrÅr Ú strmethodÚ__str__r*r'r%r¿r¿£ s^„áPð ˆD�G‰G˜L˜DŸL™L©Ó9Ô :€Eðˆd�g‰g˜aÔ €Gà ˆD�G‰G˜AÔ €EòIð!ˆh× Ñ  Ó+�Gr'r¿c'ó°K—txjdz c_ttj¬«} tj|g|¢­Ž5|–—ddd«t «|j z |_txjdzc_y#1swYŒ?xYw#t «|j z |_txjdzc_wxYw­w)z«A context manager that produces timing information for a given context. On entering a timedcmstats instance is produced. This context manager is reentrant. r)rN)ÚtimedcmÚ_nestedr¿r ÚlogrÁrÈrÃ)Ú whencefmtÚ whenceargsÚ timing_statss r%rÌr̶ s˜èø€ô ‡O‚O�qÑ…Oܤg§o¡oÔ6€LðÜ �[‰[˜Ð 0 ZÔ 0ØÒ ÷1ô %›w¨×);Ñ);Ñ;ˆ ÔÜ�Š˜1ÑŽ÷ 1Ð 0ûô %›w¨×);Ñ);Ñ;ˆ ÔÜ�Š˜1ÑŽüs4‚4C·BÁ BÁBÁ6CÂBÂBÂ7CÃCcó‡—ˆfd„}|S)zâReport the execution time of a function call to stderr. During development, use as a decorator when you need to measure the cost of a function, e.g. as follows: @util.timed def foo(a, b, c): pass có:•—ttj‰j««5}‰|i|¤Ž}ddd«tj }|j ddjzdztj‰j«|fz«S#1swYŒ_xYw)Ns %s%s: %s ó r‹)rÌrÚbytestrrdrr<rÒr)r¬r­Ú time_statsrr<rŸs €r%r=ztimed..wrapperØ sŠø€Ü ”X×%Ñ% d§m¡mÓ4Ô 5¸Ù˜4Ð* 6Ñ*ˆF÷6ä—‘ˆØ� ‰ Ø à�z×'Ñ'Ñ'¨!Ñ+Ü× Ñ  §¡Ó/Øðñ ô ðˆ ÷6Ð 5ús ª BÂBr*r>s` r%Útimedr×Í sø€ô ð €Nr'))ómrk)ókr&)ógr•)skbr&)smbrk)sgbr•)óbrc ó<—|j«j«} tD]<\}}|j|«sŒt t |dt |« «|z«cSt |«S#t$r"tjtd«|z«‚wxYw)zšConvert a space specifier to a byte count. >>> sizetoint(b'30') 30 >>> sizetoint(b'2.2kb') 2252 >>> sizetoint(b'6M') 6291456 Nscouldn't parse size: %s) Ústripr¾Ú _sizeunitsr¹r”r‡rwr¿r r�rL)rPrÂrQÚus r%Ú sizetointràô sŽ€ð �‰‹ �‰Ó€AðB߉DˆAˆqØ�z‰z˜!�}Üœ5  9¤c¨!£f W Ó.°Ñ2Ó3Ò3ðô�1‹vˆ øÜ òBÜ×ÑœqÐ!;Ó<¸qÑ@ÓAÐAðBús A0¾%A0Á$ A0Á0+Bcó"—eZdZdZd„Zd„Zd„Zy)Úhooksz¦A collection of hook functions that can be used to extend a function's behavior. Hooks are called in lexicographic order, based on the names of their sources.có—g|_yrT)Ú_hooksr^s r%rRzhooks.__init__ s €Øˆ� r'có>—|jj||f«yrT)rär³)rNr+Úhooks r%Úaddz hooks.add s€Ø � ‰ ×јF D˜>Õ*r'có”—|jjd„¬«g}|jD]\}}|j||Ž«Œ|S)Ncó —|dSr)r*rAs r%r»z hooks.__call__.. s€ q¨¢tr')rZ)räÚsortr³)rNr¬Úresultsr+ræs r%Ú__call__zhooks.__call__ sC€Ø � ‰ ×Ñ™^ÐÔ,ØˆØ ŸKœK‰LˆF�DØ �N‰N™4 ˜;Õ 'ð(àˆr'N)rdrerfrgrRrçrìr*r'r%rârâ s„ñ,òò+ór'râc #óLK—tj«d| dz D����cgc]6\}}}}|tj|«|fztj|«f‘Œ8c}}}}| d}|r1t d„|D««} |D]\} }|€| | |f–—Œ|| | |fz–—Œyycc}}}}w­w)aªYields lines for a nicely formatted stacktrace. Skips the 'skip' last entries, then return the last 'depth' entries. Each file+linenumber is formatted according to fileline. Each line is formatted according to line. If line is None, it yields: length of longest filepath+line number, filepath+linenumber, function Not be used in production code but very convenient while developing. Nrc3ó8K—|]}t|d«–—Œy­w©rNrm)Ú.0Úentrys r%Ú z!getstackframes..- sèø€Ð7©w e”C˜˜a™—M©wùs‚)rVÚ extract_stackrÚsysbytesr¤) ÚskiprNÚfilelinerZrõÚlnrŸÚ_textÚentriesÚfnmaxÚfnlns r%Úgetstackframesrü sÈèø€ô$-×#:Ñ#:Ó#<¸[À¸uÀq¹yÑ#Iöá#IÑ ˆB��D˜%ð ”X×&Ñ& rÓ*¨BÐ/Ñ /´×1BÑ1BÀ4Ó1HÒIØ#Iôð €f€gð€GñÜÑ7©wÓ7Ó7ˆÛ!‰JˆD�$؈|ؘd DÐ)Ó)à˜e T¨4Ð0Ñ0Ó0ñ "ðùõ ùs‚!B$£;B ÁAB$s stacktracer'cóâ—|r|j«|jd||j«fz«t|dz|¬«D]}|j||z«Œ|j«y)aWWrites a message to f (stderr) with a nicely formatted stacktrace. Skips the 'skip' entries closest to the call, then show 'depth' entries. By default it will flush stdout first. It can be used everywhere and intentionally does not require an ui object. Not be used in production code but very convenient while developing. s %s%s at: r)rZN)r=rÒÚrstriprü)r>rõr¡ÚotherfrZrrNs r%Údebugstacktracer5 sZ€ñØ� ‰ ŒØ‡G�GˆM˜V S§Z¡Z£\Ð2Ñ 2Ô3ܘt a™x¨u×5ˆØ �‰�˜‘ Õð6à‡G�G…Ir'cóœ—|€ t«}d||fz}||vr||vr|Stjd«D]}d|||fz}||vsŒ||vsŒ|cSy)aÀ Generate a name that it is safe to rename f to in the given context. f: filename to rename tag: a string tag that will be included in the new name ctx: a context, in which the new name must not exist others: a set of other filenames that the new name must not be in Returns a file name of the form oldname~tag[~number] which does not exist in the provided context and is not in the set of other names. Ns%s~%srs%s~%s~%s)ÚsetÚ itertoolsrˆ)r¡ÚtagÚctxÚothersrõr–s r%ÚsafenamerO sg€ð€~Ü“ˆà �Q˜�HÑ €BØ ��}˜ 6Ñ)؈ Ü �_‰_˜QÖ ˆØ ˜A˜s A˜;Ñ &ˆØ �SŠ=˜R vÒ-ØŠIñ r'cóœ—|j|«}t|«|kr,tjt d«t|«|fz«‚|S)z=read n bytes from stream.read and abort if less was availables5stream ended unexpectedly (got %d bytes, expected %d))rvrwr rKrL)Ústreamr–rPs r%Ú readexactlyr g sK€à� ‰ �A‹€AÜ ˆ1ƒv�‚zÜ�k‰kÜ ÐFÓ GÜ�1‹v�qˆkñ ó ð ð €Hr'có*—|dkrtjd|z«‚|dz}|dz}g}|r4|jtjd|z««|dz}|dz}|rŒ4|jtj|««dj |«S)aiEncode an unsigned integer value to a varint. A varint is a variable length integer of 1 or more bytes. Each byte except the last has the most significant bit set. The lower 7 bits of each byte store the 2's complement representation, least significant group first. >>> uvarintencode(0) '\x00' >>> uvarintencode(1) '\x01' >>> uvarintencode(127) '\x7f' >>> uvarintencode(1337) '\xb9\n' >>> uvarintencode(65536) '\x80\x80\x04' >>> uvarintencode(-1) Traceback (most recent call last): ... ProgrammingError: negative value for uvarint: -1 rsnegative value for uvarint: %dééé€r')r r•r³rÚbytechrrª)rîr,Úbytess r%Ú uvarintencoderr s•€ð. ˆq‚yÜ×$Ñ$Ð%FÈÑ%NÓOÐOØ �4‰<€DØ ˆa�K€EØ €EÙ Ø � ‰ ”X×%Ñ% d¨T¡kÓ2Ô3Ø�t‰|ˆØ �!‰ ˆò ð ‡L�L”×!Ñ! $Ó'Ô(à �8‰8�E‹?Ðr'cóf—d}d} tt|d««}||dz|zz}|dzs|S|dz }Œ-)aZDecode an unsigned variable length integer from a stream. The passed argument is anything that has a ``.read(N)`` method. >>> from io import BytesIO >>> uvarintdecodestream(BytesIO(b'\x00')) 0 >>> uvarintdecodestream(BytesIO(b'\x01')) 1 >>> uvarintdecodestream(BytesIO(b'\x7f')) 127 >>> uvarintdecodestream(BytesIO(b'\xb9\n')) 1337 >>> uvarintdecodestream(BytesIO(b'\x80\x80\x04')) 65536 >>> uvarintdecodestream(BytesIO(b'\x80')) Traceback (most recent call last): ... Abort: stream ended unexpectedly (got 0 bytes, expected 1) rrr rr )r½r )rsrÚshiftÚbytes r%Úuvarintdecodestreamr— sO€ð*€FØ €EØ Ü”;˜r 1Ó%Ó&ˆØ�4˜$‘; 5Ñ(Ñ(ˆØ�t’ ؈MØ �‰ ˆð r'c#óˆK—tjtjd«}|dk(rO tjtjd«d–—tjtj|«yd–—y#tj$rYŒCwxYw#tjtj|«wxYw­w)NÚCr0)ÚlocaleÚ setlocaleÚLC_CTYPErƒ)Úoldlocs r%Ú with_lc_ctyperÁ s�èø€ä × Ñ œfŸo™o¨tÓ 4€FØ �‚}ð 6ð Ü× Ñ ¤§¡°"Ô5ó ä × Ñ œVŸ_™_¨fÕ 5ä øô—<‘<ò ñð ûô × Ñ œVŸ_™_¨fÕ 5üs:‚*C®$BÁBÁ*CÂBÂBÂBÂBÂ&B?Â?Ccóà‡‡ —tjjd«rcddlmŠmŠ ddlm}m}m }m }Gˆˆ fd„d|«}|«}||«|_ |jj||««|jS tj tj"d«}tj tj"d«}||zS#t$$rYy t&$rYy wxYw) z…Provide an estimate for the available system memory in Bytes. If no estimate can be provided on the platform, returns None. swinr)Úc_longÚ c_ulonglong)Ú StructureÚbyrefÚsizeofÚwindllc óZ•—eZdZdW°fdW°fdW°fdW°fdW°fdW°fdW°fdW°fd W°fg Zy ) ú'_estimatememory..MEMORYSTATUSEXÚdwLengthÚ dwMemoryLoadÚ ullTotalPhysÚ ullAvailPhysÚullTotalPageFileÚullAvailPageFileÚullTotalVirtualÚullAvailVirtualÚullExtendedVirtualN)rdrerfÚ_fields_)ÚDWORDÚ DWORDLONGs€€r%ÚMEMORYSTATUSEXr%ã sRø„à™UÐ#Ø¡Ð'Ø¡Ð+Ø¡Ð+Ø#¡YÐ/Ø#¡YÐ/Ø"¡IÐ.Ø"¡IÐ.Ø%¡yÐ1ð ‰Hr'r2Ú SC_PAGE_SIZEÚ SC_PHYS_PAGESN)rÚ sysplatformÚ startswithÚctypesrrÚctypes.wintypesr r!r"r#r&Úkernel32ÚGlobalMemoryStatusExr)r!ÚsysconfÚ sysconf_namesrrrþ) r r!r"r#r2r)ÚpagesizeÚpagesr0r1s @@r%Ú_estimatememoryr?Ó sÆù€ô ×Ñ×&Ñ& vÔ.çD÷ ó ÷ ˜Yô ñ Ó ˆÙ˜A“YˆŒ Ø�‰×,Ñ,©U°1«XÔ6Ø�~‰~Ðð  Ü—:‘:œb×.Ñ.¨~Ñ>Ó?ˆÜ— ‘ œ2×+Ñ+¨OÑ<Ó=ˆØ˜%ÑÐøÜ ò Ù Ü ò Ù ð úsÂACà C-Ã"C-Ã,C-)rrïrTr`r�)NrŽ)r&i)FFFNNTr‚)FNF)FTr4)iN)rs %-*s in %s s%s:%dr)ürgrÏrÚ contextlibrvr8ÚhashlibÚiorrr½r!ÚpickleÚrer�r{rr;ÚtimerVr7rôrÚ thirdpartyrrrrrr Úhgdemandimportr r0r r r rrÚutilsrrrrÚ TYPE_CHECKINGÚtypingrrrrrÚ importmodrrÚ b85decodeÚ b85encodeÚ cookielibÚhttplibrCÚ socketserverÚBytesIOÚbytesioÚstringioÚ xmlrpclibÚ httpserverÚurlerrÚurlreqrÕr»r rr#rrLrVÚbindunixsocketÚ cachestatÚ checkexecÚ checklinkr~Ú expandglobsÚgetfsmountpointrpÚ get_passwordÚ groupmembersÚ groupnameÚisexecÚisownerr˜rEÚ lookupregrUr rúröÚ normcasespecÚnormcasefallbackÚ openhardlinksrtÚparsepatchoutputrIÚpollrÕrzr?rJÚ samedeviceÚsamefileÚsamestatÚsetflagsr“rÚ statisexecÚ statislinkr"roÚusernamer&Ú compenginesÚ SERVERROLEÚ CLIENTROLErËràr.r—Úenvironrör6Úfilterwarningsr:rAÚmd5Úsha1Úsha512rJrarQrFrjr…Ú NameErrorr¥r‡rÃrŠr‹r/r+rHrQr:rdr…r?rœr¨rªÚ OrderedDictr±ror½rÀrÂÚcontextmanagerrÖrÙrÛrärrr%r/r2r5r?r»rRr\rsr|r™r¿r¼rÃrÁÚcheckosfilenameÚclockrÏrÖrÀràrêrérãr‰rærärürrrrJr!rmr7rMrRrOrWr]rbrfrhrrrŽr“Ú bytecountr˜rðr¢r¥r¨rªÚ oslinesepÚ tonativeeolÚ fromnativeeolÚnativeeolwriterÚidentityr¬r¯r³r½rÄrPr¿rÌrÍr×rÞràrârür<Ústdoutrr›rr rrrr?r*r'r%Úr„sù ðñó ÛÛÛ Û ÛÛ ÛÛ Û Û Û ÛÛ Û Û Û ÛÛåÝ÷óõ #÷÷÷óð ×Ò÷õð ˆ× Ñ ˜(Ó #€Ø ˆ× Ñ ˜(Ó #€à × Ñ € Ø × Ñ € à × Ñ € Ø × Ñ €Ø×"Ñ"€ Ø×$Ñ$€ Ø �*‰*€à €Ø × Ñ € à × $Ñ $€ Ø × Ñ €Ø × Ñ €ð×#Ñ#Ðà ×ÒÞ%å#à‡F�F€à × Ñ €Ø×(Ñ(€Ø × Ñ € Ø × Ñ € Ø × Ñ € Ø × Ñ €Ø×"Ñ"€ Ø×*Ñ*€Ø × Ñ € Ø×$Ñ$€ Ø×$Ñ$€ Ø × Ñ € Ø �‰€Ø × Ñ €Ø �.‰.€Ø × Ñ € Ø × Ñ € Ø × Ñ €Ø �‰€Ø × Ñ €Ø × Ñ €Ø×$Ñ$€ Ø×,Ñ,ÐØ×&Ñ&€ Ø �‰€Ø×,Ñ,ÐØ × Ñ €Ø‡}�}€Ø × Ñ € Ø × Ñ €Ø �‰€Ø × Ñ € Ø × Ñ € Ø × Ñ €Ø × Ñ €Ø × Ñ €Ø�‰€Ù �F˜K¨×);Ñ);Ó <€ Ø × Ñ € Ø × Ñ € Ø�‰€Ø �‰€Ø × Ñ €ò)ð×%Ñ%€ Ø × #Ñ #€ Ø × #Ñ #€ ñ ‹(€òñ ˆx×Ñ×#Ñ#Ð$5Ó6Ó 7€Ù ð€H×јI rÐ+=¸{ÔKØ€H×јI rÐ+=¸wÔGØ€H×јI rÐ+=¸zÔJÙ à€H×ÑØ�,Ð 2°Kôð€H×ÑØÐ+Ð-?Àôð€H×ÑØØ&ØØô ó ð �KŠKØ �]Š]Ø�~Š~ñ €ò 3Ðã €AØ �Š<Ј<ð ÷-ñ-÷`"ñ"ðJ.Ø €Fð€ ÷kñkó\÷$o ño ôd'Ð 1ô'òT Ð÷ x ñx ÷v"ñ"ôJaÐ*ôaðJIMó )ô D Ð&ôD ðV Ø Ø Ø Øó%ò0óTJòn ÷>ñô($ˆ{×&Ò&ô$ôNˆc�4ôô6�#�xô÷ñð6 ×Òòóðð$ ×Òòóð÷ñ÷0iñiòX  ÷> (ñ (òóòBòòð4 ‡?ƒ?á €Dò?ó8 òÐð(Ø ØØ ØØóM=ó`*òZÐð0Ðò;ñ| ��n dÓ+€à ×ÒØ&€OÙ Ø— ’ ‰ð×.Ò.€OÙ Ø— ‘ ˆòò( ò òñ2€ ðÛà €Dò ÷8 ñ8 ñv ƒU€à€ ò*òZòDò&ó(÷Vc!ñc!÷LDñDòNó ò óò<ò ò ÷ PñPóf÷,$ñ$òN ò ñ. ؈'‘1�Z“=Ð!؈‘!�J“-Р؈‘�:“ÐØˆ'‘1�Z“=Ð!؈‘!�J“-Р؈‘�:“ÐØˆ'‘1�Z“=Ð!؈‘!�J“-Р؈‘�:“ÐØˆ‰1ˆ]Ó Ðó € ÷2ñ2ð( ˆ�Š�yÓ !€ò ò "ò *ð ×Ò˜Ò Ø€KØ€MØ!�Oà×#Ò#€KØ×%Ò%€MØ×'Ò'€Oòòò8ó :ñ4 ؈‰Qˆy‹\ÐØˆ!‰Qˆy‹\ÐØˆ‰Aˆi‹LÐØˆ‰1ˆY‹<ÐØˆ%‘�:“ÐØˆ‘�*“ ÐØˆ‰q�‹}ÐØˆ(‘A�j“MÐ"؈‘1�Z“=Ð!؈‘!�J“-Р؈+‘q˜“}Ð%؈‘a˜ “mÐ$؈ ‘Q�z“]Ð#ó € ð"‡‚÷,ð,óð,ð$ ×Òñóðð&€„òð8€ òB÷*ñó&1ð4 Ø Ø‡o‚oØ �?Š?Ø Ø ó ð.€óò0 ò"òJðT ×Òñóðó", øðm\ò.ö.ð.ûðH;òØ ƒDðús$Ò/b&Ø<b6â& b3â2b3â6cãc