a0biɕ$SrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK r SSK r SSK r SSK r SSKrSSKrSSKrSSKJr SSKrSSKJrJrJrJrJrJrJrJrJrJrJ r J!r!J"r"J#r# SSK$J%r% SSK&J'r' SSK(J)r) SSK*J+r+ SS K,J-r- \R\"S 5r/\R\"S \R`5r1\R\"S 5r2\R\"S \R`5Rfr4SRk5r6/SQr7Sr8Sr9\9RuSRt"\Rv6\S9rSr?S1Sjr@S1SjrAS1SjrBS\S4SjrCSrD\R\"S\R`5rE\DS5rF"SS5rG"S S!\G5rH"S"S#\5rI\R\"S$5RrKS%rLS&rMS2S'jrNS(rO"S)S*5rP"S+S,\ R5rR\RR4S-jrUS.rV\N"\85"\U5rUS/rWS0rXg)3z$PyPI and direct package downloading.Nwraps) CHECKOUT_DIST Distribution BINARY_DISTnormalize_path SOURCE_DIST Environmentfind_distributions safe_name safe_version to_filename Requirement DEVELOP_DISTEGG_DIST parse_version)logDistutilsError) translate)Wheelunique_everseenz^egg=([-A-Za-z0-9_.+!]+)$zhref\s*=\s*['"]?([^'"> ]+)z([^<]+)\n\s+\(md5\)z([-+.a-z0-9]{2,}):z.tar.gz .tar.bz2 .tar .zip .tgz) PackageIndexdistros_for_urlparse_bdist_wininstinterpret_distro_namez  && CG I  s 727cfUR5nSup#nURS5(aURS5(aUSSnSnOeURSS5(a US S nUSSnSnOAURS 5(aUSS nS nO#URSS5(a US S nUSSnS nX#U4$)z=Return (base,pyversion) or (None,None) for possible .exe name)NNN.exez .win32.exeNiwin32z .win32-pyiiz.win-amd64.exeiz win-amd64z .win-amd64-pyi)lowerendswith startswith)namer,basepy_verplats r&rrMs JJLE)D$ ~~f >>, ' ':DD   k3 / /"R[F:DD ^^, - -:DD   os 3 3"R[F:DD  cb[RRU5nUup#pEpg[RRUR S5S5nUS:Xa7US:Xa1[RRUR S5S5nSU;aUR SS5upX4$)N/zsourceforge.netdownload#)urllibr"urlparseunquotesplit) urlpartsschemeserverpath parametersqueryfragmentr0s r&egg_info_for_urlrGes LL ! !# &E8=5FDe <<   3 3 4D ""tz'9||##DJJsOB$78 d{C+ >r3c## [U5up#[XU5HnUv M U(aG[RU5nU(a*[ XR S5U[ S9HnUv M ggg7f)zEYield egg or source distribution objects that might be found at a URLr:) precedenceN)rGdistros_for_location EGG_FRAGMENTmatchrgroupr)r?metadatar0rFdistrLs r&rrpsl%c*ND$S9 :""8, -[[^X-  sA4A6cbURS5(aUSSnURS5(aSU;a[R"XU5/$URS5(aPSU;aJ[U5nUR 5(d/$[UUR UR [S-S9/$URS 5(a#[U5upEnUb[XX%[U5$[H6nURU5(dMUS[U5*n[XU5s $ /$) z:Yield egg or source distribution objects based on basename.egg.zipNr+z.egg-z.whlr:)location project_nameversionrIr)) r-r from_locationr is_compatiblerTrUrrrr EXTENSIONSlen)rSbasenamerNwheelwin_baser1platformexts r&rJrJ~s,$$CR=  SH_**8xHII  SH_h""$$I !"// #a<      %8%B"(  (Hk8     S ! ! 3s8),H(XF F Ir3ch[[U5[RR U5U5$)zEYield possible egg or source distribution objects based on a filename)rJrosrCrZ)filenamerNs r&distros_for_filenamerbs* x "''"2"28"(interpret_distro_name..sKAbhh|Q77s$&Nr:) py_versionrIr])r>anyrangerYisdigitrjoin)rSrZrNrkrIr]r@rgs r&rrs NN3 E #KqrKKK3u:  8BQ<   ! !  J  r r s A#B-)AB-c0^[T5U4Sj5nU$)zg Wrap a function returning an iterable such that the resulting iterable only ever yields unique items. c&>[T"U0UD65$Nr)argskwargsfuncs r&wrapperunique_values..wrapperstT4V455r3r)rurvs` r& unique_valuesrxs"  4[66 Nr3z3<([^>]*\srel\s{0,10}=\s{0,10}['"]?([^'" >]+)[^>]*)>c ## [RU5HnUR5up4[[ [ R UR5RS555nSU;dSU;dMc[RU5H=n[RRU[URS555v M? M SHtnURU5nUS:wdM[R!X5nU(dM:[RRU[URS555v Mv g7f)zEFind rel="homepage" and rel="download" links in `page`, yielding URLs,homepager7r:)z Home PagezDownload URLr6N)RELfinditergroupssetmapstrstripr,r>HREFr;r"urljoin htmldecoderMfindsearch)r?pagerLtagrelrelsposs r&find_external_linksrsd#<<>3syy#))+"3"3C"89:  t!3s+ll**3 5;;q>0JKK, $5iin "9KK*Eull**3 5;;q>0JKK 5sA5E;A4E3E?Ec*\rSrSrSrSrSrSrSrg)ContentCheckerzH A null content checker that defines the interface for checking content cg)z# Feed a block of data to the hash. Nselfblocks r&feedContentChecker.feeds r3cg)z3 Check the hash. Return False if validation fails. Trrs r&is_validContentChecker.is_validsr3cg)z] Call reporter with information about the checker (hash name) substituted into the template. Nr)rreportertemplates r&reportContentChecker.reports r3rN) __name__ __module__ __qualname____firstlineno____doc__rrr__static_attributes__rr3r&rrs  r3rc`\rSrSr\R "S5rSr\S5r Sr Sr Sr Sr g ) HashCheckeri zK(?Psha1|sha224|sha384|sha256|sha512|md5)=(?P[a-f0-9]+)cRXl[R"U5UlX lgrr) hash_namehashlibnewhashexpected)rrrs r&__init__HashChecker.__init__s"KK *  r3c[RRU5SnU(d [5$URR U5nU(d [5$U"S0UR 5D6$)z5Construct a (possibly null) ContentChecker from a URLr6r)r;r"r<rpatternr groupdict)clsr?rFrLs r&from_urlHashChecker.from_urls^<<((-b1!# # ""8,!# #'U__&''r3c:URRU5 grr)rupdaters r&rHashChecker.feeds r3cPURR5UR:H$rr)r hexdigestrrs r&rHashChecker.is_valid"syy""$ 55r3c.X R-nU"U5$rr)r)rrrmsgs r&rHashChecker.report%s'}r3)rrrN)rrrrrecompilerr classmethodrrrrrrr3r&rr s=jj #G ! (( 6r3rcJ^\rSrSrSrS(U4SjjrU4SjrS)SjrS)SjrS)Sjr Sr S r S r S r S rS*S jrSrS*U4SjjrSrSrSrSrSrS+SjrS,SjrSrSrSrSrS*SjrSrSrSr Sr!S r"\#S)S!j5r$S"r%S#r&S$r'S%r(S&r)S'r*U=r+$)-ri*z;A distribution index that scans web pages for download URLscb>[TU]"U0UD6 USSURS5(+-Ul0Ul0Ul0Ul[R"SR[[U555RUl /Ul[R R"Ulg)Nr5|)superrr- index_url scanned_urls fetched_urls package_pagesrerrorrrLallowsto_scanr;requesturlopenopener)rrhosts ca_bundle verify_sslrskw __class__s r&rPackageIndex.__init__-s $%"%"S)Fy/A/A#/F+F%GGjj#i*?!@AGG  nn,, r3cn>[UR5 [TU]U5$![a gf=frr)rrU Exceptionradd)rrOrs r&rPackageIndex.add?s9  $,, 'w{4     s ' 44c NXR;aU(dgSURU'[U5(dURU5 g[[ U55nU(a)UR U5(dgUR SU5 U(dU(aXR;a [[URU55 gUR U5(dSURU'gURSU5 SURU'SnURXU-5nUcg[U[RR5(a.UR S:XaURSUR"-5 SURUR$'SUR&R)S S 5R+5;aUR-5 gUR$nUR/5n[U[05(db[U[RR5(aS nO$UR&R3S 5=(d S nUR5US 5nUR-5 [6R9U5HLn [R:R=U[?U RAS555n URCU 5 MN UREURF5(a$[IUSS5S:waURKX5nggg)z>$.. ) )ga.F#.M%%c0D/N )r3c&[RRU5(dURSU5 g[RR U5(arU(dk[RR U5n[R "U5H2nUR[RRX45S5 M4 [U5nU(a2URSU5 [[URU55 gg)Nz Not found: %sTz Found: %s)r`rCexistswarnisdirrealpathlistdirrrorbrrrr)rfnnestedrCitemrs r&rPackageIndex.process_filename}sww~~b!! IIor *  77==  V77##B'D 4(%%bggll4&>E)%R(  JJ{B ' TXXu% & r3c:[U5nU=(a" URS5R5S:HnU(d6UR[R R U5S5(agSnU(a [XQ-5eURXQ5 g)Nr:fileTz Note: Bypassing %s (disallowed host; see https://setuptools.pypa.io/en/latest/deprecated/easy_install.html#restricting-downloads-with-allow-hosts for details). ) rrMr,rr;r"r<rr)rr?fatalsis_filers r&rPackageIndex.url_oks| sO4 ((*f4 dkk&,,"7"7"n[R"U5H nURS5(dMX4v M" M@ g7f)z .egg-linkN)r`rr-)rfrCentrys r&rh.PackageIndex.scan_egg_links..s= D)~~k* TM) s 4AA)filterr`rCrr itertoolsstarmap scan_egg_link)r search_pathdirs egg_linkss r&scan_egg_linksPackageIndex.scan_egg_linkssBbggmm[1  Y  t119 =>r3c [[RRX55n[ [ S[ [RU555nSSS5 [W5S:wagUupV[[RRX55HEn[RR"U/UQ76Ul [Ul URU5 MG g!,(df  N=f)Nrj)openr`rCrorrrrrrYr rSr rIr)rrCr  raw_lineslinesegg_path setup_pathrOs r&rPackageIndex.scan_egg_links "'',,t+ , c#))Y&?@AE- u:? $&rww||D'CDDGGLL66DM)DO HHTNE- ,s .C%% C3c SnURUR5(dU$[[[R R U[UR5SRS555n[U5S:wd SUS;aU$[US5n[US5nSURRUR505U'[U5[U54$)N)NNr5rjr9r:rT)r.rrrr;r"r=rYr>r r r setdefaultr,r)rrNO_MATCH_SENTINELr@pkgvers r&_scanPackageIndex._scans&t~~..$ $S--tC4G4I/J/P/PQT/UVW u:?cU1Xo$ $a!58$?C%%ciik26t<3S!111r3c 8[RU5HKnUR[RR U[ URS5555 MM URU5upEU(dg[X5Hdn[U5upxURS5(a-U(d&U(aUSU<SU<3- nOURU5 URU5 Mf [RSU5$![a GMf=f)z#Process the contents of a PyPI pager:r.pyz#egg=rRc.SURSSS5-$)Nz%sr:rj)rM)ms r&,PackageIndex.process_index..s2QWWQ15EEr3)rr}r#r;r"rrrMr#rrGr-need_version_infoscan_urlPYPI_MD5sub) rr?rrLr!r"new_urlr0frags r&rPackageIndex.process_indexs]]4(E  6<<//Z A5OPQ) ::c?+35G)'2JD}}U##DsC88G**3/ MM' "6|| Et  %  sAD  DDc(URSU5 g)NzPPage at %s links to .py file(s) without version info; an index scan is required.)scan_allrr?s r&r,PackageIndex.need_version_infos   r3cURUR;a+U(aUR"U/UQ76 URS5 UR UR5 g)Nz6Scanning index of all packages (this may take a while))rrrrr-rrrss r&r4PackageIndex.scan_allsE >>!2!2 2 #%% IIN O dnn%r3cURURUR-S-5 URR UR 5(d+URURUR -S-5 URR UR 5(dURU5 [URR UR S55HnURU5 M g)Nr5r) r-r unsafe_namerrkeyrTnot_found_in_indexr)r requirementr?s r& find_packagesPackageIndex.find_packagess dnn{'>'>>DE!!%%koo66 MM$..;+C+CCcI J!!%%koo66  # #K 0**..{CDC MM# Er3c>UR5 URU5 XRHnX1;aUs $URSX5 M [[ U]X5$)Nz%s does not match %s)prescanr?r<rrrobtain)rr> installerrOrs r&rCPackageIndex.obtainsY  ;')D" JJ-{ A*\4/ GGr3c@URURSU-5 UR5(djUR5 [R "U5 [ URR<S[RRU5<S35eg)z checker is a ContentChecker zValidating %%s checksum for %sz validation failed for z; possible download problem?N) rrrrr`unlinkrrr/rCrZ)rcheckerratfps r& check_hashPackageIndex.check_hash sx tzz#Ch#NO!! IIK IIh  <<$$bgg&6&6x&@B "r3c UH}nURb?[U5(a/URS5(d[[ U55(aUR U5 MbURR U5 M g)z;Add `urls` to the list that will be prescanned for searchesNfile:)rrr.rrr-append)rurlsr?s r&add_find_linksPackageIndex.add_find_linkss`C $!#>>'**,-- c" ##C(r3cUR(a)[[URUR55 SUlg)z7Scan urls scheduled for prescanning (e.g. --find-links)N)rrrr-rs r&rBPackageIndex.prescan&s' << T]]DLL1 2 r3cXR(aURSp2O URSp2U"X1R5 UR 5 g)Nz#Couldn't retrieve index page for %rz3Couldn't find index page for %r (maybe misspelled?))r<rrr;r4)rr>methrs r&r=PackageIndex.not_found_in_index,sB   #H# E S))* r3c[U[5(d[U5nU(aXURUR S5X5n[ U5upVUR S5(aURXFU5nU$[RRU5(aU$[U5n[URX5SS5$)aLocate and/or download `spec` to `tmpdir`, returning a local path `spec` may be a ``Requirement`` object, or a string containing a URL, an existing local filename, or a project/version requirement spec (i.e. the string form of a ``Requirement`` object). If it is the URL of a .py file with an unambiguous ``#egg=name-version`` tag (i.e., one that escapes ``-`` as ``_`` throughout), a trivial ``setup.py`` is automatically created alongside the downloaded file. If `spec` is a ``Requirement`` object or a string containing a project/version requirement spec, this method returns the location of a matching distribution (possibly after downloading it to `tmpdir`). If `spec` is a locally existing file or directory name, it is simply returned unchanged. If `spec` is a URL, it is downloaded to a subpath of `tmpdir`, and the local filename is returned. Various errors may be raised if a problem occurs during downloading. r:r&rSN)rrr _download_urlrMrGr- gen_setupr`rCrr'rfetch_distribution)rr$tmpdirrAfoundr0rFs r&r7PackageIndex.download7s$$ ,,%F**6<<?DI!1$!7=='' NN5FCE %% ,T2t..tUcTnXRHnUR[:Xa&T(dUT;aTRSU5 STU'M=X ;=(a! UR[:*=(d T(+nU(dMrTR UR T 5nXBl[RRUR5(dMUs $ g)Nz&Skipping development or system egg: %sr:) r<rIrrr r7rSdownload_locationr`rCr) reqenvrOtestloc develop_okrskippedsourcer[s r&r-PackageIndex.fetch_distribution..findws{GG ??l2:7* D )* {U;(F(Tf*4-- v>C-0*ww~~d&<&<==# %r3z:No local packages or working download links found for %s%sza source distribution of rzBest match: %s)rSrr)rrBr?rrcloner`) rr>r[ force_scanrgre local_indexrOrrfs ` ` `` @r&rZPackageIndex.fetch_distributionYs4 $k2 $ $,  LLN   { + $D / 1D <||'  $D <   { + $D < IIL77=2  II& -::t'='=:> >r3cFURXX45nUb UR$g)a Obtain a file suitable for fulfilling `requirement` DEPRECATED; use the ``fetch_distribution()`` method now instead. For backward compatibility, this routine is identical but returns the ``location`` of the downloaded distribution instead of a distribution object. N)rZrS)rr>r[rjrgrOs r&fetchPackageIndex.fetchs)&&{JO  == r3c [RU5nU=(a? [XRS5S5Vs/sHnUR(dMUPM sn=(d /n[ U5S:XGaN[ RRU5n[ RRU5U:wa[ RRX75n[ RRU5(a$[ RRX5(d[R"X5 Un[[ RRUS5S5n U R!SUSR"<SUSR<S[ RR%U5S<S35 SSS5 U$U(a['S U<S U<35e['S 5es snf!,(df  U$=f) Nr:zsetup.pywz(from setuptools import setup setup(name=rz , version=z, py_modules=[z]) z9Can't unambiguously interpret project/version identifier zI; any dashes in the name or version should be escaped using underscores. zpCan't process plain .py files without an '#egg=name-version' suffix to enable automatic setup script generation.)rKrLrrMrUrYr`rCrZdirnamerorsamefileshutilcopy2rwriterTsplitextr) rrarFr[rLdrrZdstrs r&rYPackageIndex.gen_setups""8,  /xQNNA99N    u:?ww''1Hwwx(F2ggll64s++0@0@0O0OLL/"Hbggll6:6< a--a((((215 =O  &.u6  !G K$=<OsG*G*"AG// G>i crURSU5 Sn[RU5nURU5n[ U[ R R5(a+[SU<SUR<SUR<35eUR5nSnURnSnSU;a=URS5n [[[U 55nUR!XXgU5 [#US 5n UR%U5n U (a;UR'U 5 U R)U 5 US - nUR!XXgU5 OOMVUR+XBU 5 SSS5 UU(aUR-5 $$!,(df  N(=f!U(aUR-5 ff=f) NzDownloading %szCan't download :  rr6zcontent-lengthzContent-Lengthwbr:)rrrrrr;rrrrr dl_blocksizeget_allmaxrint reporthookrrrrvrJr) rr?rafprHrblocknumbssizesizesrIrs r& _download_toPackageIndex._download_tosh "C(  !**3/Gs#B"fll4455$25rwwGggiGH""BD7*(893sE?+xTBh%GGBKE U+ %( A xTJ37& &% s%C)F?A*F ) F FFF6cgrrr)rr?rarblksizers r&rPackageIndex.reporthook s r3c 4URS5(a [U5$[XR5$![[ R R4apnSRURVs/sHn[U5PM Os snfsn5nU(aURX%5 SnAg[U<SU<35UeSnAf[RRa nUsSnA$SnAf[RR aJnU(a URX#R"5 SnAg[SU<SUR"<35UeSnAf[ R R$aInU(a URX#R&5 SnAg[U<SUR&<35UeSnAf[ R R([*4a6nU(aURX#5 SnAg[SU<SU<35UeSnAff=f)NrMr}zDownload error for r|z7 returned a bad status line. The server might be down, )r. local_openopen_with_authrr#httpclient InvalidURLrorsrrrr;rrURLErrorreason BadStatusLineline HTTPExceptionOSError)rr?warningvargrs r&rPackageIndex.open_url s >>' " "c? " T!#{{3 3DKK223 B((7CH78C '''$S%9:A||%% H||$$  '88,,$36A{{((  '66**$"%qvv/ ))73 T '%%$C%KLRSS  Tso8$HC5B %C4C!H(C/)H/!H"E7E!H6"F:F::'H!H>HHc[U5upEU(a1SU;a*URSS5RSS5nSU;aM*OSnURS5(aUSSn[RR X45nUS:XdUR S 5(aURX&5$US :XdUR S 5(aURX&5$UR S 5(aURX&5$US :Xa?[RR[RRU5S5$URUS5 UR!X&5$)Nz...\___downloaded__rQr+svnzsvn+gitzgit+zhg+rrjT)rGreplacer-r`rCror. _download_svn _download_git _download_hgr;r url2pathnamer"r<r_attempt_download)rrAr?r[r/rFras r&rXPackageIndex._download_url/s8*#. $,||D#.66tSA$,$D == $ $9D77<<- U?f//77%%c4 4 u_ 1 1& 9 9%%c4 4   u % %$$S3 3 v >>..v||/D/DS/I!/LM M KKT "))#8 8r3c(URUS5 g)NT)rr5s r&r-PackageIndex.scan_urlLs d#r3cURX5nSURSS5R5;aURXU5$U$)Nrrr)rrr,_invalid_download_html)rr?rars r&rPackageIndex._attempt_downloadOsF##C2 W[[4::< <..sXF FOr3cJ[R"U5 [SU35e)NzUnexpected HTML page found at )r`rGr)rr?rras r&r#PackageIndex._invalid_download_htmlVs! (=cUCDDr3c[SU35e)Nz/Invalid config, SVN download is not supported: r)rr? _filenames r&rPackageIndex._download_svnZsNseTUUr3c[RRU5up#pEnURSS5SnURSS5SnSnSU;aUR SS5upG[RR X#XES45nX4$)N+r:r6r9r@r)r;r"urlsplitr>rsplit urlunsplit)r? pop_prefixrAnetlocrCrEr1revs r&_vcs_split_rev_from_url$PackageIndex._vcs_split_rev_from_url]s,2LL,A,A#,F)Tc1%b)zz#q!!$ $; C+IDll%%vtB&GHxr3cURSS5SnURUSS9upURSX5 [R"SU<SU<35 Ub0URS U5 [R"S U<S U<35 U$) Nr9r:rTrzDoing git clone from %s to %szgit clone --quiet r}zChecking out %szgit -C z checkout --quiet r>rrr`systemrr?rars r&rPackageIndex._download_gitos>>#q)!,///E 13A sH=> ? II' - II r3cURSS5SnURUSS9upURSX5 [R"SU<SU<35 Ub1URS U5 [R"S U<S U<S 35 U$) Nr9r:rTrzDoing hg clone from %s to %szhg clone --quiet r}zUpdating to %sz hg --cwd z up -C -r z -qrrs r&rPackageIndex._download_hgs>>#q)!,///E 0#@ c8<= ? II& , II r3c2[R"U/UQ76 grr)rrr8s r&rPackageIndex.debugs #r3c2[R"U/UQ76 grr)rrr8s r&rPackageIndex.info tr3c2[R"U/UQ76 grr)rrr8s r&rPackageIndex.warnrr3)rrrrrrr)zhttps://pypi.org/simple/)*NT)Frr)FFFN)FF),rrrrrrrrrrrrr#rr,r4r?rCrJrPrBr=r7rZrnrYrrrrrXr-rrr staticmethodrrrrrrr __classcell__rs@r&rr*sE- -$!31j'  ? 2  : & H  )  PLM?^ ,\L"H  TD9:$EV"&&r3rz!&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?cPURS5n[R"U5$)Nr)rMrunescape)rLwhats r& decode_entityrs ;;q>D == r3c"[[U5$)z Decode HTML entities in the given text. >>> htmldecode( ... 'https://../package_name-0.1.2.tar.gz' ... '?tokena=A&tokenb=B">package_name-0.1.2.tar.gz') 'https://../package_name-0.1.2.tar.gz?tokena=A&tokenb=B">package_name-0.1.2.tar.gz' ) entity_subr)texts r&rrs mT **r3c^U4SjnU$)Nc>^UU4SjnU$)Nc>[R"5n[R"T5 T"U0UD6[R"U5 $![R"U5 f=frr)socketgetdefaulttimeoutsetdefaulttimeout)rsrt old_timeoutrutimeouts r&_socket_timeout@socket_timeout.._socket_timeout.._socket_timeoutsN 224K  $ $W - 6T,V,((5((5s A A$r)rurrs` r&r'socket_timeout.._socket_timeouts 6r3r)rrs` r&socket_timeoutrs  r3c[RRU5nUR5n[R "U5nUR 5nURSS5$)a Encode auth from a URL suitable for an HTTP header. >>> str(_encode_auth('username%3Apassword')) 'dXNlcm5hbWU6cGFzc3dvcmQ=' Long auth strings should not cause a newline to be inserted. >>> long_auth = 'username:' + 'password'*10 >>> chr(10) in str(_encode_auth(long_auth)) False  r)r;r"r=encodebase64 b64encoderr)authauth_s auth_bytes encoded_bytesencodeds r& _encode_authrsR\\ ! !$ 'FJ$$Z0M""$G ??4 $$r3c*\rSrSrSrSrSrSrSrg) Credentializ2 A username/password pair. Use like a namedtuple. cXlX lgrrusernamepassword)rrrs r&rCredential.__init__s   r3c#D# URv URv g7frrrrs r&__iter__Credential.__iter__smmmms cS[U5-$)Nz%(username)s:%(password)s)varsrs r&__str__Credential.__str__s*T$Z77r3)rrN) rrrrrrrrrrr3r&rrs!8r3rcD^\rSrSrU4Sjr\S5rSrSrSr U=r $) PyPIConfigic:>[R/SQS5n[TU] U5 [R R [R RS5S5n[R RU5(aURU5 gg)z Load from ~/.pypirc )rr repositoryr~z.pypircN) dictfromkeysrrr`rCro expanduserrr)rdefaultsrcrs r&rPyPIConfig.__init__si==!GL " WW\\"'',,S19 = 77>>"   IIbM r3cUR5Vs/sH,nURUS5R5(dM*UPM. nn[[ UR U55$s snf)Nr)sectionsrrrr_get_repo_cred)rsectionsections_with_repositoriess r&creds_by_repositoryPyPIConfig.creds_by_repositorysa ==?& *xx.446 * #& C++-GHII & s )A'A'cURUS5R5nU[URUS5R5URUS5R554$)Nrrr)rrr)rrrepos r&r PyPIConfig._get_repo_creds]xx.446Z HHWj ) / / 1 HHWj ) / / 1   r3c~URR5Hup#URU5(dMUs $ g)zt If the URL indicated appears to be a repository defined in this config, return the credential for that repository. N)ritemsr.)rr?rcreds r&find_credentialPyPIConfig.find_credentials5 !% 8 8 > > @ J~~j)) !Ar3r) rrrrrpropertyrr rrrrs@r&rrs- JJ r3rc[RRU5nUup4pVpxURS5(a[R R S5eUS;a[U5upOSn U (dP[5RU5n U (a0[U 5n U RU4n [R"S/U Q76 U (aeS[U 5-n UW XVXx4n [RRU 5n[R R#U5nUR%SU 5 O[R R#U5nUR%S[&5 U"U5nU (ah[RRUR(5unnnnnnUU:Xa2UW :Xa,UUUUUU4n [RRU 5UlU$) z4Open a urllib2 request, handling HTTP authentication:znonnumeric port: '')rhttpsNz*Authenticating as %s for %s (from .pypirc)zBasic Authorizationz User-Agent)r;r"r<r-rrr _splituserrrrrrrr urlunparserRequest add_header user_agentr?)r?rparsedrArrCparamsrEr1raddressrrr@r0rrs2h2path2param2query2frag2s r&rrs\\ " "3 'F06-FD%skk$$%:;; """6* g |++C0 t9D==#%D HHA ID I ,t,,u:,,))%0..((1?D1..((- |Z0 B 06||/D/DRVV/L,Bvvu  'user[:passwd]', 'host[:port]'.rN) rpartition)hostuserdelims r&rr@s,,DD **td **r3cU$rrr)r?s r& fix_sf_urlr3Ks Jr3c[RRU5upp4pV[RR U5n[ R RU5(a[RRU5$URS5(a[ R RU5(a/n[ R"U5Hn [ R RXy5n U S:Xa'[U S5n U R5n SSS5 Ol[ R RU 5(aU S- n URSR!U S95 M Sn U R!USRU5S 9n S upOS upn S S 0n["R$"W 5n[R&R)XUUU5$!,(df  N=f)z7Read a local path, with special support for directoriesr5z index.htmlrNz{name})r/zB{url}{files}r)r?files)OK)rzPath not foundz Not foundrz text/html)r;r"r<rrr`rCisfilerr-rrrorrrNformatioStringIOrr)r?rArBrCparamrEr1rar6rfilepathrbodyrstatusmessager body_streams r&rrOsy/5||/D/DS/I,FD~~**40H ww~~h~~%%c** s   h 7 7H%Aww||H0HL (C(B779D)x((S LL6==1=E F&X ;;3dii.>;?D# B{+G++d#K << ! !#w MM#)(s G G' rr)r)Yrsysr`rer;rtrrrr configparserr http.clientr urllib.parser;urllib.request urllib.error functoolsrr pkg_resourcesrrrrr r r r r rrrrr distutilsrdistutils.errorsrfnmatchrsetuptools.wheelr setuptools.extern.more_itertoolsrrrKIrr.rLrr>rX__all___SOCKET_TIMEOUT_tmplr: version_infor#r'rrGrrJrbrrxr|rrrrr/rrrrrrRawConfigParserrrrrrr3rrr3r&rVs *   +"<zz67  zz3RTT: ::J ZZ,bdd 3 9 9 . 4 4 6  F \\ ^^S-- .: 0  F.2kTXD  jjKRTTR LL$2.Br ;r nZZ< = A A  + %*88"$--$N &~~55+^+ 0@Nr3