Ë ±é·ßsœÕíã ó|—ddlZddlZddlZddlZddlZddlmZmZddl m Z ddl m Z ddl mZmZmZej"d«ZeD�cic]}e|«d|zj)d «“Œc}ZeD�cic]}|d|z“Œ c}Zed ed efd „«Zed ed efd „«Zd„ZdAdededed efd„ZdAdededefd„Zd efd„Zd efd„Zded efd„Z defd„Z!dBdedefd„Z"dCdedefd„Z#d ed efd!„Z$d ed efd"„Z%d#ed efd$„Z&d#ed efd%„Z'e jPd¬&«Gd'„d(««Z)d)„Z*d*„Z+d#ed efd+„Z,ejZd,«Z.d#ed efd-„Z/d.ed efd/„Z0dDd.ed0ed efd1„Z1ded efd2„Z2ded efd3„Z3d4„Z4ded efd5„Z5d6„a6 dEd7ed8ed9ed:ed ef d;„Z7ddddddddddd<œ Z8ded eefd=„Z9d>eefd?„Z:defd@„Z;ycc}wcc}w)FéN)ÚOptionalÚoverloadé)Ú_)Úattr)ÚencodingÚerrorÚpycompats()[]{}?*+-|^$\.&~# ó\Úlatin1ÚpatÚreturncó—y©N©©r s ú>usr/lib/python3.12/site-packages/mercurial/utils/stringutil.pyÚreescaper&ó€àócó—yrrrs rrr+rrcó —d}t|t«rd}|jd«}|jt«}|r|S|j d«S)z"Drop-in replacement for re.escape.TFr )Ú isinstanceÚbytesÚdecodeÚ translateÚ_regexescapemapÚencode)r Úwantunis rrr0sK€ð €GÜ�#”uÔØˆØ�j‰j˜Ó"ˆØ �-‰-œÓ (€CÙØˆ Ø �:‰:�hÓ ÐrFÚbprefixÚindentÚlevelcó>—djt||||¬««S)zPretty print an object.r©r r!r")ÚjoinÚ pprintgen)Úor r!r"s rÚpprintr(?s€à �8‰8”I˜a¨¸ÀuÔMÓ NÐNrc#óÖK—t|t«r$|rdt|«z–—ydt|«z–—yt|t«rdtt|««z–—yt|t«rŒ|sd–—yd–—|r|dz }d–—d ||zz–—t |«D]D\}}t ||||¬ «D]}|–—Œ|dzt|«ksŒ0|rd –—d ||zz–—ŒAd –—ŒF|r|dz}d–—d ||zz–—d –—yt|t«rÂ|sd–—yd–—|r|dz }d–—d ||zz–—t t|j«««D]c\}\}}t ||||¬ «D]}|–—Œd–—t ||||¬ «D]}|–—Œ|dzt|«ksŒO|rd –—d ||zz–—Œ`d –—Œe|r|dz}d–—d ||zz–—d–—yt|t«r•|sd–—yd–—|r|dz }d–—d ||zz–—t t|««D]D\}}t ||||¬ «D]}|–—Œ|dzt|«ksŒ0|rd –—d ||zz–—ŒAd –—ŒF|r|dz}d–—d ||zz–—d–—yt|t«rŒ|sd–—yd–—|r|dz }d–—d ||zz–—t |«D]D\}}t ||||¬ «D]}|–—Œ|dzt|«ksŒ0|rd –—d ||zz–—ŒAd –—ŒF|r|dz}d–—d ||zz–—d–—yt|tj«rƒ t|«} d–—|r|dz }d–—d ||zz–—d} | s@| } t|«} t | |||¬ «D]}|–—Œ| s|rd –—d ||zz–—nd –—| sŒ@|r|dz}d–—d ||zz–—d –—yt#j$|«–—y#t $rd–—YywxYw#t $rd} YŒ„wxYw­w)a’Pretty print an object to a generator of atoms. ``bprefix`` is a flag influencing whether bytestrings are preferred with a ``b''`` prefix. ``indent`` controls whether collections and nested data structures span multiple lines via the indentation amount in spaces. By default, no newlines are emitted. ``level`` specifies the initial indent level. Used if ``indent > 0``. sb'%s's'%s'sbytearray['%s']s[]Nó[éó ó r$s, s, ó]s{}ó{s: ó}sset([])sset([s])s()ó(ó)sgen[]sgen[FT)rrÚ escapestrÚ bytearrayÚlistÚ enumerater&ÚlenÚdictÚsortedÚitemsÚsetÚtupleÚtypesÚ GeneratorTypeÚnextÚ StopIterationr Úbyterepr) r'r r!r"ÚiÚaÚchunkÚkÚvÚnextitemÚlastÚcurrents rr&r&Ds˜èø€ô�!”UÔÙ ØœY q›\Ñ)Ó )àœI a›LÑ(Ó (Ü �A”yÔ !ð!¤9¬U°1«XÓ#6Ñ6Ó6Ü �A”tÔ ÙØŠKØ àŠ á Ø �Q‰JˆEØŠKؘ% &™.Ñ)Ò )ä˜a–L‰DˆAˆqÜ"ؘ7¨6¸÷�ð“ ðð �1‰u”s˜1“v‹~ÙØ ’LØ %¨&¡.Ñ1Ó1à“Kð!ñ Ø �Q‰JˆEØŠKؘ% &™.Ñ)Ò )à‹ Ü �A”tÔ ÙØŠKØ àŠ á Ø �Q‰JˆEØŠKؘ% &™.Ñ)Ò )ä"¤6¨!¯'©'«)Ó#4Ö5‰IˆA‰v��1Ü"ؘ7¨6¸÷�ð“ ðð ŠKä"ؘ7¨6¸÷�ð“ ðð �1‰u”s˜1“v‹~ÙØ ’LØ %¨&¡.Ñ1Ó1à“Kð%6ñ( Ø �Q‰JˆEØŠKؘ% &™.Ñ)Ò )à‹ Ü �A”sÔ ÙØÒ Ø àŠá Ø �Q‰JˆEØŠKؘ% &™.Ñ)Ò )äœf Q›iÖ(‰DˆAˆqÜ"ؘ7¨6¸÷�ð“ ðð �1‰u”s˜1“v‹~ÙØ ’LØ %¨&¡.Ñ1Ó1à“Kð)ñ Ø �Q‰JˆEØŠKؘ% &™.Ñ)Ò )à‹ Ü �A”uÔ ÙØŠKØ àŠ á Ø �Q‰JˆEØŠKؘ% &™.Ñ)Ò )ä˜a–L‰DˆAˆqÜ"ؘ7¨6¸÷�ð“ ðð �1‰u”s˜1“v‹~ÙØ ’LØ %¨&¡.Ñ1Ó1à“Kð!ñ Ø �Q‰JˆEØŠKؘ% &™.Ñ)Ò )à‹ Ü �A”u×*Ñ*Ô +ð ܘA“wˆHð Š á Ø �Q‰JˆEØŠKؘ% &™.Ñ)Ò )àˆá؈Gð Ü ›7�ô#Ø °¸u÷�ð“ ðñ ÙØ ’LØ %¨&¡.Ñ1Ó1à’Kò%ñ( Ø �Q‰JˆEØŠKؘ% &™.Ñ)Ò )à‹ ä×Ñ Ó"Ó"øôQò ØŠNÙ ð ûô$!ò Ø’ð üsp‚C O)à CO)ÆB$O)ÉBO)ËA O)Ì+ OÌ6O)Í OÍ!1O)Î2O)Ï OÏO)ÏOÏO)Ï O&Ï#O)Ï%O&Ï&O)có$—g}tj|«}dx}}|t|«krÐd}|jd|dz«}|dkr t|«}n6||dzkDr.|j d|dz «r|j d|dz|dz «}|dkr|}n|dz }|j dd|«|j dd|«z }|dk\sJ‚|j||||j«f«||}}|t|«krŒÐdjd „|D««S) z9Pretty print a representation of a possibly-nested objectréÿÿÿÿór,c3ó2K—|]\}}d|z|z–—Œy­w)s Nr)Ú.0ÚlÚss rÚ zprettyrepr..(sèø€Ð6±©¨¨1�e˜a‘i !•m±ùs‚) r rAr7ÚfindÚ startswithÚrfindÚcountÚappendÚrstripr%)r'ÚlinesÚrsÚp0Úp1Úq0Úq1rQs rÚ prettyreprr` s!€à €EÜ × Ñ ˜1Ó €BØ€K€BˆØ Œs�2‹wŠ,ðˆØ �W‰W�T˜2 ™6Ó "ˆØ �Š6Ü�R“‰Bð�"�q‘&Š[˜RŸ]™]¨4°°a±Ô8𗑘$  Q¡¨¨Q©Ó/ˆBØ �Š6؉Bà �!‰GˆBØ �H‰H�T˜1˜bÓ ! B§H¡H¨T°1°bÓ$9Ñ 9ˆØ�AŠvˆ ˆvØ � ‰ �a˜˜B˜r˜×)Ñ)Ó+Ð,Ô-Ø�RˆBˆð- Œs�2‹w‹,ð. �:‰:Ñ6±Ó6Ó 6Ð6rcóà—|€yt|t«r-|dtjtj|dd«zSt|t «r|St |«r|«St|«S)arFormat an optional printable representation from unexpanded bits ======== ================================= type(r) example ======== ================================= tuple ('', other) bytes '' callable lambda: '' % sorted(b) object other ======== ================================= Nrrr+)rr<r ÚrapplyÚ maybebytestrrÚcallabler()Úrs rÚ buildreprrf+sc€ð €yØÜ �A”uÔ Ø�‰t”h—o‘o¤h×&;Ñ&;¸Q¸q¸r¸UÓCÑCÐCÜ �A”uÔ ØˆÜ �!ŒÙ‹sˆ ä�a‹yÐrrRcó$—t|xrd|v«S)z&return true if a string is binary dataó)Úbool©rRs rÚbinaryrkCs€ä �Ò �e˜q�jÓ !Ð!rÚpatterncój—|jd«rd|ddfS|jd«rd|ddfSd|fS)Nsre:óreésliteral:óliteralé)rU)rls rÚ _splitpatternrrHsK€Ø×ј&Ô!Ø�g˜a˜b�kÐ!Ð!Ø × Ñ ˜KÔ (ؘ7 1 2˜;Ð&Ð&Ø �wÐ ÐrTÚ casesensitivec󾇗t|«\}}|dk(r: d}|stj}tj||«}|||jfS|dk(r.|r |j}ntj|«Šˆfd„}|||fSt jd|z«‚#tj$r/}t j t d«t|«z«‚d}~wwxYw)a¥ accepts a string, possibly starting with 're:' or 'literal:' prefix. returns the matcher name, pattern, and matcher function. missing or unknown prefixes are treated as literal matches. helper for tests: >>> def test(pattern, *tests): ... kind, pattern, matcher = stringmatcher(pattern) ... return (kind, pattern, [bool(matcher(t)) for t in tests]) >>> def itest(pattern, *tests): ... kind, pattern, matcher = stringmatcher(pattern, casesensitive=False) ... return (kind, pattern, [bool(matcher(t)) for t in tests]) exact matching (no prefix): >>> test(b'abcdefg', b'abc', b'def', b'abcdefg') ('literal', 'abcdefg', [False, False, True]) regex matching ('re:' prefix) >>> test(b're:a.+b', b'nomatch', b'fooadef', b'fooadefbar') ('re', 'a.+b', [False, False, True]) force exact matches ('literal:' prefix) >>> test(b'literal:re:foobar', b'foobar', b're:foobar') ('literal', 're:foobar', [False, True]) unknown prefixes are ignored and treated as literals >>> test(b'foo:bar', b'foo', b'bar', b'foo:bar') ('literal', 'foo:bar', [False, False, True]) case insensitive regex matches >>> itest(b're:A.+b', b'nomatch', b'fooadef', b'fooadefBar') ('re', 'A.+b', [False, False, True]) case insensitive literal matches >>> itest(b'ABCDEFG', b'abc', b'def', b'abcdefg') ('literal', 'ABCDEFG', [False, False, True]) rnróinvalid regular expression: %sNrpcó4•—‰tj|«k(Sr)rÚlower)rRÚipats €rÚzstringmatcher..‡sø€˜d¤h§n¡n°QÓ&7Ò7róunhandled pattern kind: %s) rrÚremodÚIÚcompiler Ú ParseErrorrÚ forcebytestrÚsearchÚ__eq__rrwÚProgrammingError)rlrsÚkindÚflagsÚregexÚeÚmatchrxs @rÚ stringmatcherrˆPsÚø€ôL" 'Ó*�M€Dˆ'Ø ˆu‚}ð ØˆEÙ ÜŸ™�Ü—M‘M '¨5Ó1ˆEð �W˜eŸl™lÐ*Ð*Ø �Ò Ù Ø—N‘N‰Eä—>‘> 'Ó*ˆDÛ7ˆEØ�W˜eÐ#Ð#ä × Ñ Ð!>ÀÑ!EÓ FÐFøô�{‰{ò Ü×"Ñ"ÜÐ3Ó4´|ÀA³ÑFóð ûð ús–*BÂCÂ-*CÃCr„cól—t|«\}}|dk(r tj||«S|dk(r)tjtj|«|«Stjd|z«‚#tj$r/}tjt d«t |«z«‚d}~wwxYw)a¤Build a regexp object from a string pattern possibly starting with 're:' or 'literal:' prefix. helper for tests: >>> def test(pattern, *tests): ... regexp = substringregexp(pattern) ... return [bool(regexp.search(t)) for t in tests] >>> def itest(pattern, *tests): ... regexp = substringregexp(pattern, remod.I) ... return [bool(regexp.search(t)) for t in tests] substring matching (no prefix): >>> test(b'bcde', b'abc', b'def', b'abcdefg') [False, False, True] substring pattern should be escaped: >>> substringregexp(b'.bc').pattern '\\.bc' >>> test(b'.bc', b'abc', b'def', b'abcdefg') [False, False, False] regex matching ('re:' prefix) >>> test(b're:a.+b', b'nomatch', b'fooadef', b'fooadefbar') [False, False, True] force substring matches ('literal:' prefix) >>> test(b'literal:re:foobar', b'foobar', b're:foobar') [False, True] case insensitive literal matches >>> itest(b'BCDE', b'abc', b'def', b'abcdefg') [False, False, True] case insensitive regex matches >>> itest(b're:A.+b', b'nomatch', b'fooadef', b'fooadefBar') [False, False, True] rnruNrprz) rrr{r}r r~rrÚescaper‚)rlr„rƒr†s rÚsubstringregexpr‹�s¦€ôL" 'Ó*�M€Dˆ'Ø ˆu‚}ð Ü—=‘= ¨%Ó0Ð 0ð �Ò Ü�}‰}œUŸ\™\¨'Ó2°EÓ:Ð:ä × Ñ Ð!>ÀÑ!EÓ FÐFøô�{‰{ò Ü×"Ñ"ÜÐ3Ó4´|ÀA³ÑFóð ûð ús•A1Á1B3Â*B.Â.B3Úusercóä—|jd«}|dk\r|d|}|jd«}|dk\r||dzd}|jd«}|dk\r|d|}|jd«}|dk\r|d|}|S)z>Return a short representation of a user name or email address.ó@rNrLr+r-ó.©rT©rŒÚfs rÚ shortuserr“Ás‡€à � ‰ �$‹€A؈A‚vØ�B�QˆxˆØ � ‰ �$‹€A؈A‚vØ�A˜‘E�Gˆ}ˆØ � ‰ �$‹€A؈A‚vØ�B�QˆxˆØ � ‰ �$‹€A؈A‚vØ�B�QˆxˆØ €Krcóx—|jd«}|dk\r|d|}|jd«}|dk\r||dzd}|S)z,Return the user portion of an email address.rŽrNrLr+r�r‘s rÚ emailuserr•ÒsI€à � ‰ �$‹€A؈A‚vØ�B�QˆxˆØ � ‰ �$‹€A؈A‚vØ�A˜‘E�Gˆ}ˆØ €KrÚauthorcó`—|jd«}|dk(rd}||jd«dz|S)zget email of author.rNrKNrLr+r�)r–res rÚemailr˜Ýs7€à� ‰ �DÓ€A؈B‚wØ ˆØ �&—+‘+˜dÓ# aÑ'¨!Ð ,Ð,rcóΗd|vr|S|jd«}|dk7r$|d|jd«jdd«S|jd«}|d|jdd «S) aÛReturns the name before an email address, interpreting it as per RFC 5322 >>> person(b'foo@bar') 'foo' >>> person(b'Foo Bar ') 'Foo Bar' >>> person(b'"Foo Bar" ') 'Foo Bar' >>> person(b'"Foo "buz" Bar" ') 'Foo "buz" Bar' >>> # The following are invalid, but do exist in real-life ... >>> person(b'Foo "buz" Bar ') 'Foo "buz" Bar' >>> person(b'"Foo Bar ') 'Foo Bar' rŽrLrKNs "s\"ó"r�r-)rTÚstripÚreplace)r–r’s rÚpersonr�åsq€ð& �6ÑØˆ Ø� ‰ �DÓ€A؈B‚wØ�b�qˆz×Ñ Ó&×.Ñ.¨v°tÓ<Ð<Ø� ‰ �DÓ€AØ �"�1ˆ:× Ñ ˜d DÓ )Ð)r)ÚhashcóX—eZdZdZej «Zej d¬«Zy)Ú mailmappingz>Represents a username/email key or value in a mailmap fileN)Údefault)Ú__name__Ú __module__Ú __qualname__Ú__doc__rÚibr˜Únamerrrr r s&„ñð ˆD�G‰G‹I€EØ ˆ4�7‰7˜4Ô �Drr có2—| xs| xrt|«dkS)auReturns True if the parsed names and emails in a mailmap entry are invalid. >>> # No names or emails fails >>> names, emails = [], [] >>> _ismailmaplineinvalid(names, emails) True >>> # Only one email fails >>> emails = [b'email@email.com'] >>> _ismailmaplineinvalid(names, emails) True >>> # One email and one name passes >>> names = [b'Test Name'] >>> _ismailmaplineinvalid(names, emails) False >>> # No names but two emails passes >>> names = [] >>> emails = [b'proper@email.com', b'commit@email.com'] >>> _ismailmaplineinvalid(names, emails) False r)r7)ÚnamesÚemailss rÚ_ismailmaplineinvalidr« s €ð,ˆ:Ò 6˜U˜Ò6¤s¨6£{°Q¡Ð6rcóh—i}|€|S|j«D�]}|j«jd«rŒ$gg}}g}|j«D]‘}|jd«rn~|jd«rZ|j d«rI|j |dd«|r"|j dj |««g}t|«dkDsŒn|j |«Œ“t||«rŒÛt|dt|«dk(r|dnd¬ «}t|d |r|d nd¬ «||<�Œ|S) axParses data in the .mailmap format >>> mmdata = b"\n".join([ ... b'# Comment', ... b'Name ', ... b' ', ... b'Name ', ... b'Name Commit ', ... ]) >>> mm = parsemailmap(mmdata) >>> for key in sorted(mm.keys()): ... print(key) mailmapping(email='commit1@email.xx', name=None) mailmapping(email='commit2@email.xx', name=None) mailmapping(email='commit3@email.xx', name=None) mailmapping(email='commit4@email.xx', name='Commit') >>> for val in sorted(mm.values()): ... print(val) mailmapping(email='commit1@email.xx', name='Name') mailmapping(email='name@email.xx', name=None) mailmapping(email='proper@email.xx', name='Name') mailmapping(email='proper@email.xx', name='Name') Nó#rLrNr+rKr-r)r˜r§r) Ú splitlinesÚlstriprUÚsplitÚendswithrXr%r7r«r )ÚmailmapcontentÚmailmapÚliner©rªÚ namebuilderÚelementÚ mailmapkeys rÚ parsemailmapr¸#s<€ð0€GàÐØˆà×)Ñ)×+ˆð �;‰;‹=× #Ñ # DÔ )Ø ð˜BˆvˆØˆ à—z‘z–|ˆGØ×!Ñ! $Ô'áà×#Ñ# DÔ)¨g×.>Ñ.>¸tÔ.Dð— ‘ ˜g a¨˜mÔ,áØ—L‘L §¡¨;Ó!7Ô8Ø"$�Kô�v“; “?Ùð×"Ñ" 7Õ+ð+$ô4 ! ¨Ô /Ø ä Ø˜‘*Ü! %›j¨Ašo��r’°4ô ˆ ô *ؘ‘)Ù"��q’¨ô ˆ� Óð],ðf €Nrcóˆ—t|«r|s|Stt|«t|«¬«} ||}d|j r |j n |j |jr|jfzS|jfzS#t$r5t|j¬«}|j |tdd««}YŒ‹wxYw)a.Returns the author field according to the mailmap cache, or the original author field. >>> mmdata = b"\n".join([ ... b'# Comment', ... b'Name ', ... b' ', ... b'Name ', ... b'Name Commit ', ... ]) >>> m = parsemailmap(mmdata) >>> mapname(m, b'Commit ') 'Name ' >>> mapname(m, b'Name ') 'Name ' >>> mapname(m, b'Commit ') 'Name ' >>> mapname(m, b'Commit ') 'Name ' >>> mapname(m, b'Unknown Name ') 'Unknown Name ' )r§r˜)r˜Ns%s <%s>)Úisauthorwellformedr r�r˜ÚKeyErrorÚgetr§)r³r–ÚcommitÚproperÚcommit2s rÚmapnamerÀvs¹€ô2 ˜fÔ %©W؈ ôœf V›n´E¸&³MÔ B€Fð?à˜‘ˆð Ø—{’{ˆ� Š ¨¯ © ØŸ š ˆ� ‰ ðñ ðà*0¯,©,ðñ ðøô ò?ô F§L¡LÔ1ˆØ—‘˜W¤k°$¸Ó&=Ó>Šð ?ús°BÂ;CÃCs^[^<]+\s<[^<>]+@[^<>]+>$có0—tj|«duS)a&Return True if the author field is well formed (ie "Contributor Name ") >>> isauthorwellformed(b'Good Author ') True >>> isauthorwellformed(b'Author ') True >>> isauthorwellformed(b'Bad Author') False >>> isauthorwellformed(b'Bad Author >> isauthorwellformed(b'Bad Author author@author.com') False >>> isauthorwellformed(b'') False >>> isauthorwellformed(b'Bad Author ') False N)Ú_correctauthorformatr‡)r–s rrºrº©s€ô& × %Ñ % fÓ -°TÐ 9Ð9rÚtextcó~—|jd«}|dk7r|d|} |j«dS#t$rYywxYw)z"Return the first line of the inputr,rKNrr)rTr®Ú IndexError)rÃrBs rÚ firstlinerÆ¿sM€ð � ‰ �%Ó€A؈B‚wØ�B�QˆxˆðØ�‰Ó  Ñ#Ð#øÜ òÙðús �0° <»<Ú maxlengthcó2—tj||d¬«S)zCTrim string to at most maxlength (default: 400) columns in display.s...)Úellipsis)rÚtrim)rÃrÇs rrÉrÉËs€ä �=‰=˜˜y°6Ô :Ð:rcóh—t|t«r t|«}tj|«dS©Nr)rÚ memoryviewrÚcodecsÚ escape_encoderjs rr3r3Ðs-€ä�!”ZÔ Ü �!‹Hˆô × Ñ  Ó " 1Ñ %Ð%rcó2—tj|«dSrÌ)rÎÚ escape_decoderjs rÚ unescapestrrÒÛs€ä × Ñ  Ó " 1Ñ %Ð%rcó®— tj|«S#t$r4tjtjt |«««cYSwxYw)zLPortably format an arbitrary object (e.g. exception) into a byte string.)r ÚbytestrÚUnicodeEncodeErrorrÚ strtolocalÚstr)Úobjs rrrásG€ð?Ü×Ñ Ó$Ð$øÜ ò?ä×Ñ¤× 3Ñ 3´C¸³HÓ =Ó>Ò>ð?ús‚—:AÁAcór—tjtj|««jdd«S)Ns\\r )r rArÔrœrjs rÚuireprrÚës+€ä × Ñ œX×-Ñ-¨aÓ0Ó 1× 9Ñ 9¸'À5Ó IÐIrc óH—Gd„dtj«}|a|di|¤ŽS)Ncó"—eZdZdZd„Zd„Zd„Zy)ú_MBTextWrapper..twa8 Extend TextWrapper for width-awareness. Neither number of 'bytes' in any encoding nor 'characters' is appropriate to calculate terminal columns for specified string. Original TextWrapper implementation uses built-in 'len()' directly, so overriding is needed to use width information of each characters. In addition, characters classified into 'ambiguous' width are treated as wide in East Asian area, but as narrow in other. This requires use decision to determine width of such characters. cóž—d}tj}tt|««D]!}||||«z }||ksŒ|d|||dfcS|dfS)Nrr)rÚ ucolwidthÚranger7)ÚselfÚucstrÚ space_leftrQÚcolwidthrBs rÚ_cutdownz#_MBTextWrapper..tw._cutdownsb€ØˆAÜ×)Ñ)ˆHÜœ3˜u›:Ö&�Ø‘X˜e A™hÓ'Ñ'�Ø “>Ø! " 1˜I u¨Q¨R yÐ1Ò1ð'ð˜#�:Ð rcóÜ—t||z d«}|jr/|j|d|«\}}|j|«||d<y|s |j|j ««yy)Nr+rK)ÚmaxÚbreak_long_wordsrårXÚpop)ráÚreversed_chunksÚcur_lineÚcur_lenÚwidthrãÚcutÚress rÚ_handle_long_wordz,_MBTextWrapper..tw._handle_long_word sg€Ü˜U W™_¨aÓ0ˆJà×$Ò$ØŸ=™=¨¸Ñ)<¸jÓI‘��SØ—‘ Ô$Ø&)� Ò#ÙØ—‘ × 3Ñ 3Ó 5Õ6ðrcó¾—tj}g}|jdkrtd|jz«‚|j «|�rg}d}|r |j }n |j }|jt|«z }|jr|dj«dk(r|r|d=|r<||d«}||z|kr%|j|j««||z }nn|rŒ<|r"||d«|kDr|j||||«|jr|r|dj«dk(r|d=|r#|j|dj|«z«|r�Œ|S)Nrsinvalid width %r (must be > 0)rKÚ)rrßríÚ ValueErrorÚreverseÚsubsequent_indentÚinitial_indentr7Údrop_whitespacer›rXrérðr%) ráÚchunksrärZrërìr!rírQs rÚ _wrap_chunksz'_MBTextWrapper..tw._wrap_chunkssh€Ü×)Ñ)ˆHàˆEØ�z‰z˜QŠÜ Ð!BÀTÇZÁZÑ!OÓPÐPð �N‰NÔ âð�Ø�ñØ!×3Ñ3‘Fà!×0Ñ0�F🠙 ¤S¨£[Ñ0�ð×'Ò'¨F°2©J×,<Ñ,<Ó,>À"Ò,DÉØ˜r˜ áÙ  ¨¡Ó,�Að ‘{ eÒ+Ø Ÿ™¨¯ © « Ô5Ø 1™ ™ðòñ™h v¨b¡zÓ2°UÒ:Ø×*Ñ*¨6°8¸WÀeÔLð×(Ò(Ù Ø  ™ ×*Ñ*Ó,°Ò3à  ˜ ñØ—L‘L ¨"¯'©'°(Ó*;Ñ!;Ô<ócðfˆLrN)r¢r£r¤r¥rårðrùrrrÚtwrÝòs„ñ ò ò 7ó> rrúr)ÚtextwrapÚ TextWrapperÚ_MBTextWrapper)Úkwargsrús rrýrýñs*€ôdŒX× !Ñ !ôdðN€NÙ ‰<�‰<Ðrr´ríÚ initindentÚ hangindentcóü—tt|«t|««}||krtd|dz«}|jtjt j «tjt j ««}|jtjt j «tjt j ««}|jtjt j «tjt j ««}t|||¬«}|j|«jtjt j ««S)NéNr+)rírörõ) rçr7rr ÚsysstrrÚ encodingmoderýÚfillr)r´rírÿrÚ maxindentÚwrappers rÚwrapr]s €ô”C˜ “O¤S¨£_Ó5€IØ � Òä�B˜  A™ Ó&ˆØ �;‰;Ü�‰œ×)Ñ)Ó*Ü�‰œ×-Ñ-Ó.ó €Dð×"Ñ"Ü�‰œ×)Ñ)Ó*Ü�‰œ×-Ñ-Ó.ó€Jð×"Ñ"Ü�‰œ×)Ñ)Ó*Ü�‰œ×-Ñ-Ó.ó€JôØ JÀ*ô€Gð �<‰<˜Ó × $Ñ $¤X§_¡_´X×5FÑ5FÓ%GÓ HÐHr) ó1syesstruesonsalwaysó0snosfalsesoffsnevercóJ—tj|j«d«S)zLParse s into a boolean. If s is not a valid boolean, returns None. N)Ú _booleansr¼rwrjs rÚ parseboolr „s€ô �=‰=˜Ÿ™› DÓ )Ð)rÚvaluecóއ‡‡—ˆˆfd„Šˆˆfd„Šˆfd„Š|�(t|t«r‰|jd««}n|}|xsgS)z parse a configuration value as a list of comma/space separated strings >>> parselist(b'this,is "a small" ,test') ['this', 'is', 'a small', 'test'] cóì•—d}|t|«krY|||dzj«s |||dzdk(r8d}|dz }|t|«kr#|||dzj«rŒ,|||dzdk(rŒ8|t|«k\rd||fS|r|jd«|||dzdk(r |ds‰||dzfS|||dzdk(r'|ddddk(r|ddd|||dzz|d<‰||dzfS|dxx|||dzz cc<‰||dzfS) NFr+ó,TrršrKr )r7ÚisspacerX)ÚpartsrRÚoffsetÚ whitespaceÚ _parse_plainÚ _parse_quotes €€rrzparselist.._parse_plain”sVø€Øˆ Ø”s˜1“vŠoØ ˆf�v ‘zÐ "× *Ñ *Ô ,°°&¸6ÀA¹:Ð0FÈ$Ò0NàˆJØ �a‰KˆFð ”s˜1“vŠoØ ˆf�v ‘zÐ "× *Ñ *Õ ,°°&¸6ÀA¹:Ð0FÈ$Ó0Nð ”S˜“VÒ Ø˜ Ð&Ð &Ù Ø �L‰L˜Ô Ø ˆV�f˜q‘jÐ ! TÒ )°%¸²)Ø ¨°© Ð2Ð 2Ø ˆv˜ ™ Ð # tÒ +°°b± ¸"¸#°À%Ò0Gؘb™  # 2˜¨¨6°F¸Q±JÐ)?Ñ?ˆE�"‰IØ ¨°© Ð2Ð 2Ø ˆb‹ �Q�v ¨¡ Ð+Ñ+‹ ؘU F¨Q¡JÐ.Ð.rcóü•—|t|«kr‹|||dzdk(r€|jd«|dz }|t|«krW|||dzj«s |||dzdk(r6|dz }|t|«kr#|||dzj«rŒ*|||dzdk(rŒ6‰||fS|t|«krz|||dzdk7ro|||dzdk(r2|dzt|«kr!||dz|dzdk(r|dz }|dxxdz cc<n|dxx|||dzz cc<|dz }|t|«kr |||dzdk7rŒo|t|«k\r9‰|d«}|sd|d<n!d|dz|d<|dd}|j|«d||fS|dz }|t|«kr(|||dzd vr|dz }|t|«kr |||dzd vrŒ|t|«krA|dzt|«k(r|||dzdk(r|dxxdz cc<|dz }n|jd«nd||fS‰||fS) Nr+ršrrr rrKr)r-r)r7rXrÚextend)rrRrÚ real_partsÚ _configlistrs €€rrzparselist.._parse_quote§s€ø€Ø ”C˜“FŠ?˜q ¨&°1©*Ð5¸Ò=Ø �L‰L˜Ô Ø �a‰KˆFØœ3˜q›6’/Ø�&˜6 A™:Ð&×.Ñ.Ô0Ø�V˜f q™jÐ)¨TÒ1à˜!‘ �ð œ3˜q›6’/Ø�&˜6 A™:Ð&×.Ñ.Õ0Ø�V˜f q™jÐ)¨TÓ1ð  ¨Ð.Ð .à”s˜1“vŠo ! F¨V°a©ZÐ"8¸DÒ"@à�&˜6 A™:Ð&¨%Ò/ؘQ‘J¤ Q£Ò'Ø�f˜q‘j 6¨A¡:Ð.°$Ò6à˜!‘ �Ø�b“ ˜TÑ!” à�b“ ˜Q˜v¨°© Ð3Ñ3“ Ø �a‰KˆFð”s˜1“vŠo ! F¨V°a©ZÐ"8¸DÓ"@ð ”S˜“VÒ Ù$ U¨2¡YÓ/ˆJÙØ ��b’ à $ z°!¡}Ñ 4� ˜1‘ ؘc˜r˜ �Ø— ‘ ˜ZÔ(ؘ Ð&Ð &à�!‰ ˆØ”s˜1“vŠo ! F¨V°a©ZÐ"8¸LÑ"HØ �a‰KˆFð”s˜1“vŠo ! F¨V°a©ZÐ"8¸LÒ"Hð ”C˜“FŠ?ؘ‰zœS ›VÒ#¨¨&°6¸A±:Ð(>À$Ò(FØ�b“ ˜TÑ!“ ؘ!‘ ‘à— ‘ ˜SÕ!à˜ Ð&Ð &à˜U FÐ*Ð*rcóf•—|jd«}|sgS‰dgd}}}|r||||«\}}}|rŒ|S)Ns ,rr)rY)rRÚparserrrrs €rrzparselist.._configlist×sIø€Ø �H‰H�U‹OˆÙ؈IØ ,¨s¨e°Q�v�ˆÙÙ$*¨5°!°VÓ$<Ñ !ˆF�E˜6òàˆ rs , )rrr¯)rÚresultrrrs @@@rÚ parselistr�sFú€õ/õ&.+ô`ð МZ¨¬uÔ5Ù˜UŸ\™\¨'Ó2Ó3‰àˆØ Š<�RÐrcóJ—tj|jd««S)z8Evaluate a string containing a Python literal expressionr )ÚastÚ literal_evalrrjs rÚevalpythonliteralr#çs€ô × Ñ ˜AŸH™H XÓ.Ó /Ð/r)Frr)T)r)i�)rr)r,sKðó Û ÛÛÛ ÷õ Ý÷ñðˆX× Ñ Ð?Ó @€ ÙAKÓLÁ¸A‘3�q“6˜E A™I×-Ñ-¨hÓ7Ñ7ÀÑL€Ù/9Ó:©z¨!�q˜5 1™9‘}¨zÑ:Ðð ð�%ð˜Eòó ðð ð�#ð˜#òó ðò  ñO�tðO¨SðO¸SðOÈóOñ E#˜$ðE#°ðE#ÀóE#ðP7�Uó7ð>�Eóð0"ˆeð"˜ó"ð ˜5óñ:G˜5ð:G°ó:Gñz1G˜Uð1G¨3ó1Gðh�Eð˜eóð"�Eð˜eóð-�%ð-˜Eó-ð*�5ð*˜Uó*ð8€‡�ˆTÔ÷!ð!óð!ò7ò2Pðf-˜Uð- uó-ð`%�u—}‘}Ð%AÓBÐð:˜uð:¨ó:ð, �Eð ˜eó ñ;�5ð; Sð;°5ó;ð &�ð&˜5ó&ð&�5ð&˜Uó&ò ?ðJˆeðJ˜óJò iðZKNñIØ ðIØðIØ).ðIØBGðIà óIð4 Ø Ø Ø ØØ Ø ØØ Øñ € ð*�ð*˜8 D™>ó*ðW�X˜e‘_óWðt0˜ô0ùòKMùÚ:s Á "F4Á2 F9