3OdZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl ZddlZddlZddlZddlmZddlZddlmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$ddl%m&Z&ddl'm(Z(ddl)m*Z*ddl+m,Z,dd l-m.Z.d d l/m0Z0m1Z1ej2d Z3ej2d ej4Z5ej2dZ6ej2dej4j7Z8d9Z:gdZ;dZdj>ej?eZ@dZAdZBdZCd3dZDd3dZEd3dZFdedfdZGdZHej2dej4ZI eHdZJGd d!ZKGd"d#eKZLGd$d%eZMej2d&jNZOd'ZPd(ZQd4d)ZRd*ZSGd+d,ZTGd-d.e jUZVejWjXfd/ZYd0ZZeRe<eYZYd1Z[d2Z\dS)5z$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)log)DistutilsError) translate)Wheelunique_everseen)_read_utf8_with_fallback_cfg_read_utf8_with_fallbackz^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>, ' ' :DDD   k3 / / "R%[F:DDD ^^, - - :DDD   os 3 3 "R%[F:DD  ctj|}|\}}}}}}tj|dd}|dkr>|dkr8tj|dd}d|vr|dd\}}||fS)N/zsourceforge.netdownload#r)urllibr$urlparseunquotesplit) urlpartsschemeserverpath parametersqueryfragmentr2s r(egg_info_for_urlrHhs L ! !# & &E8=5FFD*eX <   3 3 4 4D """tz'9'9|##DJJsOOB$788 d{{C++h >r5c#Kt|\}}t|||Ed{V|rOt|}|r5t ||d|t Ed{VdSdSdS)zEYield egg or source distribution objects that might be found at a URLNr) precedence)rHdistros_for_location EGG_FRAGMENTmatchrgroupr)r@metadatar2rGrMs r(rrss%c**ND(#Cx888888888""8,,  ,U[[^^X-           r5c|dr |dd}|drd|vrtj|||gS|drOd|vrKt|}|sgSt||j|jtdzgS|d r.t|\}}}|t||||t|StD]B}||r+|dt| }t|||cSCgS) z:Yield egg or source distribution objects based on basename.egg.zipNr-z.egg-z.whlr)location project_nameversionrJr+) r/r from_locationr is_compatiblerTrUrrrr EXTENSIONSlen)rSbasenamerOwheelwin_baser3platformexts r(rKrKs$$!CRC=  JSH__*8XxHHII   SH__h""$$ I !"/ #a<        %8%B%B"&(  ((Hfk8  GG   S ! ! G 3s88) ,H(8XFF F F F G Ir5cxtt|tj||S)zEYield possible egg or source distribution objects based on a filename)rKrosrDrZ)filenamerOs r(distros_for_filenamerbs3 x  "'"2"28"<"z(interpret_distro_name..s.KKAbh|Q77KKKKKKr5Nr) py_versionrJr])r?anyrangerYisdigitrjoin)rSrZrOrjrJr]rArgs r(rrs  NN3  E #KKqrrKKKKK3u::   8BQB<   ! !  E  JJ  rr qrr   r5c<tfd}|S)zs Wrap a function returning an iterable such that the resulting iterable only ever yields unique items. c.t|i|SNr)argskwargsfuncs r(wrapperzunique_values..wrappers ttT4V44555r5r)rtrus` r( unique_valuesrvs5  4[[6666[6 Nr5z3<([^>]*\srel\s{0,10}=\s{0,10}['"]?([^'" >]+)[^>]*)>c #Kt|D]}|\}}tt t j|d}d|vsd|vr_t|D]D}tj |t|dVEdD]|}||}|dkr_t||}|rBtj |t|dV}dS)zEFind rel="homepage" and rel="download" links in `page`, yielding URLs,homepager9r)z Home PagezDownload URLr8N)RELfinditergroupssetmapstrstripr.r?HREFr<r$urljoin htmldecoderNfindsearch)r@pagerMtagrelrelsposs r(find_external_linksrsMd##LL<<>>S3sy#))++"3"3C"8"899::   t!3!3s++ L Ll**3 5;;q>>0J0JKKKKKK4LLiinn "99KKc**E Ll**3 5;;q>>0J0JKKKKK LLr5c$eZdZdZdZdZdZdS)ContentCheckerzP A null content checker that defines the interface for checking content cdS)z3 Feed a block of data to the hash. Nselfblocks r(feedzContentChecker.feeds  r5cdS)zC Check the hash. Return False if validation fails. Trrs r(is_validzContentChecker.is_valids tr5cdS)zu Call reporter with information about the checker (hash name) substituted into the template. Nr)rreportertemplates r(reportzContentChecker.reports r5N)__name__ __module__ __qualname____doc__rrrrr5r(rrsK  r5rc\eZdZejdZdZedZdZ dZ dZ dS) HashCheckerzK(?Psha1|sha224|sha384|sha256|sha512|md5)=(?P[a-f0-9]+)cT||_tj||_||_dSrq) hash_namehashlibnewhashexpected)rrrs r(__init__zHashChecker.__init__s%"K **   r5ctj|d}|stS|j|}|stS|di|S)z5Construct a (possibly null) ContentChecker from a URLr8r)r<r$r=rpatternr groupdict)clsr@rGrMs r(from_urlzHashChecker.from_urls{<((--b1 $!## # ""8,, $!## #s''U__&&'''r5c:|j|dSrq)rupdaters r(rzHashChecker.feed s r5cF|j|jkSrq)r hexdigestrrs r(rzHashChecker.is_valid#sy""$$ 55r5c,||jz}||Srq)r)rrrmsgs r(rzHashChecker.report&s'x}}r5N) rrrrecompilerr classmethodrrrrrr5r(rr sbj #G !!! (([(   666r5rc<eZdZdZ d+fd ZfdZd,d Zd,d Zd,d Zd Z d Z dZ dZ dZ d-dZdZd-fd ZdZdZdZdZdZ d.dZd/dZdZdZdZdZd-dZd Zed!Zd"Z d#Z!d$Z"d%Z#d&Z$ed'Z%d(Z&d)Z'd*Z(xZ)S)0rz;A distribution index that scans web pages for download URLshttps://pypi.org/simple/*NTcrtj|i||dd|d z|_i|_i|_i|_tjd tt|j |_ g|_tjj|_dS)Nr7|)superrr/ index_url scanned_urls fetched_urls package_pagesrerrnr~rrMallowsto_scanr<requesturlopenopener)rrhosts ca_bundle verify_sslrrkw __class__s r(rzPackageIndex.__init__.s $%"%%%"S)Fy/A/A#/F/F+F)F%GGj#i*?*?!@!@AAG  n, r5c t|jn#t$rYdSwxYwt|Srq)rrU Exceptionradd)rdistrs r(rzPackageIndex.add@sS  $, ' ' ' '   44 ww{{4   s  &&Fc ||jvr|sdSd|j|<t|s||dStt |}|r-||sdS|d||s |r ||jvr$tt|j |dS||s d|j|<dS| d|d|j|<d}| |||z}|dSt|tjjr(|jdkr| d|jzd|j|j<d|jd d vr|dS|j}|}t|t0sTt|tjjrd }n|jd pd }||d }|t6|D]W} tj|t?| d} |!| X|"|j#r-tI|dddkr|%||}dSdSdS)z>$. ) ) 1ga.F.F#.M.M%%c400DDD 1 1.M.Mr5c tj|s|d|dStj|rl|sjtj|}tj|D]6}|tj||d7t|}|r:| d|tt|j |dSdS)Nz Not found: %sTz Found: %s)r`rDexistswarnisdirrealpathlistdirrrnrbrrr~r)rfnnestedrDitemrs r(rzPackageIndex.process_filename~sw~~b!!  IIor * * * F 7==   FV F7##B''D 4(( F F%%bgll4&>&>EEEE$R((  ' JJ{B ' ' ' TXu%% & & & & & ' 'r5cNt|}|o*|ddk}|s8|tj|drdSd}|rt||z|||dS)NrfileTz Note: Bypassing %s (disallowed host; see https://setuptools.pypa.io/en/latest/deprecated/easy_install.html#restricting-downloads-with-allow-hosts for details). F) rrNr.rr<r$r=rr)rr@fatalsis_filers r(rzPackageIndex.url_oks sOO4 ((**f4  dkk&,"7"7"<".sm  D))  ~~k**  5M       r5)filterr`rDrr itertoolsstarmap scan_egg_link)r search_pathdirs egg_linkss r(scan_egg_linkszPackageIndex.scan_egg_linkssYbgm[11     Y t19 = =>>>>>r5c ttj||}t t dt tj| }t|dkrdS|\}}ttj||D]?}tjj|g|R|_ t|_||@dS)Nri)rr`rDrnrrr~rr splitlinesrYr rSr rJr)rrDrcontentlinesegg_path setup_pathrs r(rzPackageIndex.scan_egg_links*27<<e+D+DEEVD#ci1C1C1E1E"F"FGGHH u::?? F$*&rw||D('C'CDD  DGL6666DM)DO HHTNNNN  r5c d}||js|Stttjj|t|jdd}t|dks d|dvr|St|d}t|d}d|j | i|<t|t|fS)N)NNr7rir;rrT)r0rrr~r<r$r>rYr?r r r setdefaultr.r)rrNO_MATCH_SENTINELrApkgvers r(_scanzPackageIndex._scans&t~.. %$ $S-tC4G4G4I4I/J/P/PQT/U/UVVWW u::??cU1Xoo$ $a!!58$$?C%%ciikk266t<3S!1!111r5c \t|D]f} |tj|t |dW#t$rYcwxYw||\}}|sdSt||D]c}t|\}}| dr%|s#|r |d|d|z }n| || |dtd|S)z#Process the contents of a PyPI pagerr.pyz#egg=rRc6d|dddzS)Nz%srri)rN)ms r(z,PackageIndex.process_index..s2QWWQ15E5EEr5)rr{rr<r$rrrNr%rrHr/need_version_infoscan_urlPYPI_MD5sub) rr@rrMrrnew_urlr2frags r(rzPackageIndex.process_indexsN]]4((  E  6<//Z A5O5OPPQQQQ    ::c??S 2+355 # #G)'22JD$}}U## 0D 00GsssCC88GG**3/// MM' " " " "|| E Et   sAA22 A?>A?c2|d|dS)NzPPage at %s links to .py file(s) without version info; an index scan is required.)scan_allrr@s r(rzPackageIndex.need_version_infos*       r5c|j|jvr%|r|j|g|R|d||jdS)Nz6Scanning index of all packages (this may take a while))rrrrrrrrrs r(r zPackageIndex.scan_allsa >!2 2 2 & #%%%%% IIN O O O dn%%%%%r5c||j|jzdz|j|js%||j|jzdz|j|js||t|j|jdD]}||dS)Nr7r) rr unsafe_namerrkeyrTnot_found_in_indexr)r requirementr@s r( find_packageszPackageIndex.find_packagess dn{'>>DEEE!%%ko66 K MM$.;+CCcI J J J!%%ko66 1  # #K 0 0 0*..{CCDD  C MM#      r5c|||||jD]!}||vr|cS|d||"t ||S)Nz%s does not match %s)prescanr)r&rrobtain)rr( installerrrs r(r,zPackageIndex.obtains  ;''') B BD{"" JJ-{D A A A Aww~~k9555r5c2||jd|z|sd|t j|t |jjdtj |ddS)z- checker is a ContentChecker zValidating %%s checksum for %sz validation failed for z; possible download problem?N) rrrrr`unlinkrrr1rDrZ)rcheckerratfps r( check_hashzPackageIndex.check_hash s tz#Ch#NOOO!!  IIKKK Ih    <$$$bg&6&6x&@&@&@&@B   r5c|D]y}|j@t|r1|dstt |r||_|j|zdS)z;Add `urls` to the list that will be prescanned for searchesNfile:)rrr0rrrappend)rurlsr@s r(add_find_linkszPackageIndex.add_find_linkss ) )C $!#%>>'**%,,--%  c"""" ##C(((( ) )r5cp|jr'tt|j|jd|_dS)z7Scan urls scheduled for prescanning (e.g. --find-links)N)rrr~rrs r(r+zPackageIndex.prescan(s3 < 3 T]DL11 2 2 2 r5c||jr |jd}}n |jd}}|||j|dS)Nz#Couldn't retrieve index page for %rz3Couldn't find index page for %r (maybe misspelled?))r&rrr%r )rr(methrs r(r'zPackageIndex.not_found_in_index.sX     #H#DD ED S+)*** r5ct|tst|}|rV|||}t |\}}|dr||||}|Stj |r|St|}t| ||ddS)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. rrSN) rrr _download_urlrHr/ gen_setupr`rDrr)rfetch_distribution)rr&tmpdirrBfoundr2rGs r(r9zPackageIndex.download9s$$ ,, 3%%F 3**488!1$!7!7h==''D NN5(FCCE %% 3 ,T22t..tV<.findys{CG  $ $?l22:27** D  D)))s{U;(F(Tf*$-- v>>C-0D*w~~d&<==$# 4r5z:No local packages or working download links found for %s%sza source distribution of rzBest match: %s)rSrq)rr}r+r)rrclonerC) rr(r? force_scanrJrH local_indexrrrIs ` ` `` @r(r>zPackageIndex.fetch_distribution[sm4 $k222%%          0  % LLNNN   { + + +4 $$D 2 /4 [11D <|' 4 $$D < <   { + + +4 $$D < IIL77=2    4 II& - - -::t'=:>> >r5cH|||||}||jSdS)a3Obtain 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)r>rS)rr(r?rLrJrs r(fetchzPackageIndex.fetchs0&&{FJOO  = tr5c t|}|r.dt||ddDpg}t |dkrZt j|}t j||krvt j ||}t j |r t j ||stj |||}tt j |ddd5}|d|djd |djd t j|dd dddn #1swxYwY|S|rt'd |d |t'd)Nc g|] }|j | Sr)rU)rfds r( z*PackageIndex.gen_setup..s09r5rzsetup.pywzutf-8)encodingz(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.)rLrMrrNrYr`rDrZdirnamernrsamefileshutilcopy2openwriterTrUsplitextr) rrarGr?rMrrZdstrs r(r=zPackageIndex.gen_setups""8,,  .xQNN    u::??w''11Hwx((F22gll6844s++#0@0@30O0O#L3///"Hbgll6:66gNNN RV a---a(((((221555                O   .&.XXuu6  !G s AF..F25F2i c|d|d} t|}||}t |t jjr"td|d|j d|j |}d}|j }d}d|vrP| d} ttt| }||||||t#|d 5} ||} | rI|| | | |d z }||||||nnb|||| dddn #1swxYwY||r|SS#|r|wwxYw) NzDownloading %szCan't download :  rr8zcontent-lengthzContent-LengthwbTr)rrrrrr<rrrrr dl_blocksizeget_allmaxr~int reporthookrZrrr[r2r) rr@rafpr0rblocknumbssizesizesr1rs r( _download_tozPackageIndex._download_tos "C(((  !**3//Gs##B"fl455 $n25##rwwwGggiiGH"BD7**(8993sE??++XxTBBBh%% 8GGBKKE U+++ %((( A XxTJJJJ3777 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8   r   s1C3F8 A;F F8FF8FF88GcdSrqr)rr@rarhblksizerjs r(rfzPackageIndex.reporthooks r5c|drt|S t||jS#tt jjf$r]}dd|j D}|r| ||nt|d||Yd}~dSd}~wtj j$r }|cYd}~Sd}~wtj j$rD}|r| ||jntd|d|j|Yd}~dSd}~wt jj$rC}|r| ||jnt|d|j|Yd}~dSd}~wt jjt(f$r:}|r| ||ntd|d||Yd}~dSd}~wwxYw)Nr4r`c,g|]}t|Sr)r)rfargs r(rSz)PackageIndex.open_url..s777CHH777r5zDownload error for r_z7 returned a bad status line. The server might be down, )r0 local_openopen_with_authrr%httpclient InvalidURLrnrrrrr<rrURLErrorreason BadStatusLineline HTTPExceptionOSError)rr@warningvrs r(rzPackageIndex.open_urlsm >>' " " #c?? " T!#t{33 3DK23 B B B((7777788C B '3''''$SS%9::A('''''|%   HHHHHH|$     '18,,,,$n3633A-,,,,, {(     '16****$"%##qvv/+*****  )73 T T T T '1%%%%$nCCC%KLLRSS&%%%%% TsL;GAB..GC G G#9D""G98E77G/G  Gcjt|\}}|r3d|vr.|dddd}d|v.nd}|dr |dd}tj||}|||p|||S)Nz...\___downloaded__rQr-)rHreplacer/r`rDrn _download_vcs_download_other)rr@r?r1rGras r(r<zPackageIndex._download_url4s*#..h  $$,,||D#..66tSAA$,,$D == $ $ 9D7<<--!!#x00WD4H4Hh4W4WWr5ctj|j}|d\}}}t ddgdgt |zz}tt|h|zdS)a  >>> rvcs = PackageIndex._resolve_vcs >>> rvcs('git+http://foo/bar') 'git' >>> rvcs('hg+https://foo/bar') 'hg' >>> rvcs('git:myhost') 'git' >>> rvcs('hg:myhost') >>> rvcs('http://foo/bar') +svngithgN) r<r$urlsplitrB partitionr}boolnextiter)r@rBpreseppostalloweds r( _resolve_vcszPackageIndex._resolve_vcsEsv&&s++2))#..S$uenvS '99::D#))4000r5c ||}|sdS|dkrtd||d\}}}||\}}|d|d|d|t j|dd||gt|d |d d|g|d |d d d |dg}|2|d|t j|||S)Nrz/Invalid config, SVN download is not supported: r;zDoing z clone from z to rKz--quietz-Ccheckoutz--cwdupz-rz-q)rrz Checking out )rrr_vcs_split_rev_from_urlr subprocess check_calldict)rr@ spec_filenamevcsrarrev co_commandss r(rzPackageIndex._download_vcsXs6$$ 4 %<< G#GG '0055!Q//44S ?3??C??X??@@@sGYXFGGGdHj)SAWhdD#tD    ? II+c++ , , ,  !+c"2 3 3 3r5c0tj|j}|dkrAtjtj|jS||d| ||S)NrT) r<r$rrBr url2pathnamer=rDr_attempt_download)rr@rarBs r(rzPackageIndex._download_otherqsx&&s++2 V  >..v|/D/DS/I/I/NOO O C%%c8444r5c2||ddS)NT)rr!s r(rzPackageIndex.scan_urlys d#####r5c|||}d|ddvr||||S|S)Nrrr)rlrr._invalid_download_html)rr@rars r(rzPackageIndex._attempt_download|sY##C22 W[[44::<< < <..sGXFF FOr5cNtj|td|)NzUnexpected HTML page found at )r`r/r)rr@rras r(rz#PackageIndex._invalid_download_htmls) (CcCCDDDr5cftj|}|jddd}|jd\}}}|d\}}}|r||fn|df\}} |||d } | | fS) a Given a possible VCS URL, return a clean URL and resolved revision if any. >>> vsrfu = PackageIndex._vcs_split_rev_from_url >>> vsrfu('git+https://github.com/pypa/setuptools@v69.0.0#egg-info=setuptools') ('https://github.com/pypa/setuptools', 'v69.0.0') >>> vsrfu('git+https://github.com/pypa/setuptools#egg-info=setuptools') ('https://github.com/pypa/setuptools', None) >>> vsrfu('http://foo/bar') ('http://foo/bar', None) rrr8r;@Nr)rBrDrG) r<r$rrBr?rDr rpartition_replacegeturl) r@rA clean_schemeno_fragment_pathrrrr clean_pathrresolveds r(rz$PackageIndex._vcs_split_rev_from_urls %%c**|))#q11"5 "'!5!5c!:!:!Q)44S99S$),>3++4, C>> "  &(( }r5c*tj|g|RdSrq)rrr#s r(rzPackageIndex.debugs  #r5c*tj|g|RdSrq)rrr#s r(rzPackageIndex.info  tr5c*tj|g|RdSrq)rrr#s r(rzPackageIndex.warnrr5)rrNT)Frq)FFFN)FF)*rrrrrrrrrrrrrrr r)r,r2r7r+r'r9r>rOr=rbrlrfrr< staticmethodrrrrrrrrrr __classcell__rs@r(rr+sEE- ------$!!!!!31313131j''''  ??? 222    :   &&&&   666666    ) ) )    P P PLP?P?P?P?d    ,,,\L"""H    T T T TDXXX"11\1$2555$$$EEE\>r5rz!&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?cT|d}tj|S)Nr)rNrunescape)rMwhats r( decode_entityrs! ;;q>>D =  r5c,tt|S)a 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 * **r5cfd}|S)Ncfd}|S)Nctj}tj |i|tj|S#tj|wxYwrq)socketgetdefaulttimeoutsetdefaulttimeout)rrrs old_timeoutrttimeouts r(_socket_timeoutz@socket_timeout.._socket_timeout.._socket_timeoutsd 244K  $W - - - 6tT,V,,(5555(5555s AAr)rtrrs` r(rz'socket_timeout.._socket_timeouts* 6 6 6 6 6 6r5r)rrs` r(socket_timeoutrs$      r5ctj|}|}t j|}|}|ddS)a9 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_authrs[\ ! !$ ' 'FJ$Z00M""$$G ??4 $ $$r5c$eZdZdZdZdZdZdS) Credentialz: A username/password pair. Use like a namedtuple. c"||_||_dSrqusernamepassword)rrrs r(rzCredential.__init__s    r5c#.K|jV|jVdSrqrrs r(__iter__zCredential.__iter__s(mmr5c&dt|zS)Nz%(username)s:%(password)s)varsrs r(__str__zCredential.__str__s*T$ZZ77r5N)rrrrrrrrr5r(rrsK!!!88888r5rc@eZdZfdZedZdZdZxZS) PyPIConfigc`tgdd}t|tjtjdd}tj|rt||dSdS)z% Load from ~/.pypirc )rr repositoryr~z.pypircN) rfromkeysrrr`rDrn expanduserrr)rdefaultsrcrs r(rzPyPIConfig.__init__s==!G!G!GLL """ W\\"',,S119 = = 7>>"   3 (r 2 2 2 2 2 3 3r5cfdD}ttj|S)Ncdg|],}|d*|-S)r)rr)rfsectionrs r(rSz2PyPIConfig.creds_by_repository.. sI& & & xx..4466& & & & r5)sectionsrr~_get_repo_cred)rsections_with_repositoriess` r(creds_by_repositoryzPyPIConfig.creds_by_repositorysR& & & & ==??& & & " C+-GHHIIIr5c||d}|t||d||dfS)Nrrr)rrr)rrrepos r(rzPyPIConfig._get_repo_credstxx..4466Z HHWj ) ) / / 1 1 HHWj ) ) / / 1 1    r5cv|jD]\}}||r|cSdS)z If the URL indicated appears to be a repository defined in this config, return the credential for that repository. N)ritemsr0)rr@rcreds r(find_credentialzPyPIConfig.find_credentialsN !% 8 > > @ @   J~~j))   tr5) rrrrpropertyrrrrrs@r(rrst 3 3 3 3 3JJXJ   r5rctj|}|\}}}}}}|drtjd|dvrt|\} } nd} | sMt |} | r*t| } | j |f} tj dg| R| rodt| z} || ||||f} tj| }tj|}|d| ntj|}|dt&||}| rctj|j\}}}}}}||kr2|| kr,||||||f} tj| |_|S) z4Open a urllib2 request, handling HTTP authentication:znonnumeric port: '')rthttpsNz*Authenticating as %s for %s (from .pypirc)zBasic Authorizationz User-Agent)r<r$r=r/rtrurv _splituserrrrrrrr urlunparserRequest add_header user_agentr@)r@rparsedrBnetlocrDparamsrFrraddressrrrArrrgs2h2path2param2query2frag2s r(rsrs$s\ " "3 ' 'F06-FFD&%s<k$$%:;;; """"6** gg J||++C00  Jt99D=#%D HA ID I I I I .,t,,,vud:,))%00.((11?D1111.((-- |Z000 B 406|/D/DRV/L/L,Bvvu < 'user[:passwd]', 'host[:port]'.rN)r)hostuserdelims r(rrSs0,,D% #DDtd **r5c|Srqr)r@s r( fix_sf_urlr^s Jr5ctj|\}}}}}}tj|}t j|rtj|S| drt j |rg}t j |D]} t j || } | dkrt| } nzt j | r| dz } |d| d} | |d |} d\} }nd \} }} d d i}t!j| }tj|| |||S) z7Read a local path, with special support for directoriesr7z index.htmlz{name})r1zB{url}{files}r)r@files)OK)rzPath not foundz Not foundrz text/html)r<r$r=rrr`rDisfilerr/rrrnrr5formatioStringIOrr)r@rBrCrDparamrFrrarrfilepathbodyrstatusmessager body_streams r(rrrrbs/5|/D/DS/I/I,FFD%~**400H w~~hC~%%c*** s  C h 7 7CH%% @ @Aw||Ha00HL  /99x(( S LL6==1=EE F F F FWD;;3dii.>.>;??D# B{+G+d##K < ! !#vw M MMr5rq)r )]rsysrr`rerrXrrrr configparserr http.clientrt urllib.parser<urllib.request urllib.error functoolsrr" pkg_resourcesrrrrr r r r r rrrrr distutilsrdistutils.errorsrfnmatchrsetuptools.wheelr setuptools.extern.more_itertoolsr unicode_utilsrrrrLIrrrMrr?rX__all___SOCKET_TIMEOUT_tmplr version_inforr)rrHrrKrbrrvrzrrrrrrrrrrrRawConfigParserrrrrsrrrrrr5r(r1s**    ++++++""""""<<<<<<QQQQQQQQrz677 rz3RT:: 2:J  RZ,bd 3 3 9 . 4 4 6 6    F \\ W^S- .: 0        F.2kTXD   bjKRTRR LLL$2.BC C C C C ;C C C PRZ< = = A  + + +    %%%*88888888"%%%%%-%%%P &~5++++^+++100@@NNNNNr5