a iŽ5hä¢ã@sždZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlmZddlZddlmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$ddlm%Z%ddl&m'Z'ddl(m)Z)ddl*m+Z+dd l,m-Z-e .d ¡Z/e .d ej0¡Z1e .d ¡Z2e .d ej0¡j3Z4d 5¡Z6gd¢Z7dZ8dZ9e9j:dj:ej;ŽedZdd„Z?dDdd„Z@dEdd„ZAdFdd„ZBdedfd d!„ZCdGd"d#„ZDd$d%„ZEe .d&ej0¡ZFeEd'd(„ƒZGGd)d*„d*ƒZHGd+d,„d,eHƒZIGd-d.„d.eƒZJe .d/¡jKZLd0d1„ZMd2d3„ZNdHd4d5„ZOd6d7„ZPGd8d9„d9ƒZQGd:d;„d;e jRƒZSejTjUfdd?„ZWeOe8ƒeVƒZVd@dA„ZXdBdC„ZYdS)Iz#PyPI and direct package downloadingéN©Úwraps) Ú CHECKOUT_DISTÚ DistributionÚ BINARY_DISTÚnormalize_pathÚ SOURCE_DISTÚ EnvironmentÚfind_distributionsÚ safe_nameÚ safe_versionÚ to_filenameÚ RequirementÚ DEVELOP_DISTÚEGG_DIST)Ú ssl_support)Úlog)ÚDistutilsError)Ú translate)ÚWheelz^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)Ú PackageIndexÚdistros_for_urlÚparse_bdist_wininstÚinterpret_distro_nameézr#) r&rZ from_locationrZ is_compatiblerHrIrrrrÚ EXTENSIONSÚlen)rGÚbasenamerCZwheelZwin_baser*ÚplatformZextr r r!r?ps2  û  ÿ r?cCstt|ƒtj |¡|ƒS)zEYield possible egg or source distribution objects based on a filename)r?rÚosr9rL)ÚfilenamerCr r r!Údistros_for_filename‘sÿrPc cs|| d¡}|s,tdd„|dd…Dƒƒr,dStdt|ƒdƒD]8}t||d |d|…¡d ||d…¡|||dVq>dS)zØGenerate alternative interpretations of a source distro name Note: if `location` is a filesystem filename, you should call ``pkg_resources.normalize_path()`` on it before passing it to this routine! rFcss|]}t d|¡VqdS)z py\d\.\d$N)ÚrerA)Ú.0Úpr r r!Ú ¯óz(interpret_distro_name..éNr0)Ú py_versionr>rM)r4ÚanyÚrangerKrÚjoin)rGrLrCrWr>rMr6rSr r r!r˜s $ýrccsdtƒ}|j}|dur8t |j|¡D]}||ƒ|Vq"n(|D]"}||ƒ}||vr<||ƒ|Vq.wrapperr)rjrkr rir!Ú unique_valuesÎsrlz3<([^>]*\srel\s{0,10}=\s{0,10}['"]?([^'" >]+)[^>]*)>c csºt |¡D]d}| ¡\}}tttj| ¡ d¡ƒƒ}d|vsDd|vr t  |¡D]}t j   |t | d¡ƒ¡VqNq dD]@}| |¡}|dkrtt  ||¡}|rtt j   |t | d¡ƒ¡VqtdS)zEFind rel="homepage" and rel="download" links in `page`, yielding URLsú,Zhomepager-r0)z Home PagezDownload URLr,N)ÚRELÚfinditerÚgroupsr[ÚmapÚstrÚstripr%r4ÚHREFr1rÚurljoinÚ htmldecoderBÚfindÚsearch)r5ÚpagerAÚtagZrelZrelsÚposr r r!Úfind_external_linksßs   r|c@s(eZdZdZdd„Zdd„Zdd„ZdS) ÚContentCheckerzP A null content checker that defines the interface for checking content cCsdS)z3 Feed a block of data to the hash. Nr ©ÚselfÚblockr r r!Úfeed÷szContentChecker.feedcCsdS)zC Check the hash. Return False if validation fails. Tr ©rr r r!Úis_validýszContentChecker.is_validcCsdS)zu Call reporter with information about the checker (hash name) substituted into the template. Nr )rÚreporterÚtemplater r r!ÚreportszContentChecker.reportN)Ú__name__Ú __module__Ú __qualname__Ú__doc__rrƒr†r r r r!r}òsr}c@sBeZdZe d¡Zdd„Zedd„ƒZdd„Z dd „Z d d „Z d S) Ú HashCheckerzK(?Psha1|sha224|sha384|sha256|sha512|md5)=(?P[a-f0-9]+)cCs||_t |¡|_||_dSrf)Ú hash_nameÚhashlibÚnewÚhashÚexpected)rrŒrr r r!Ú__init__s zHashChecker.__init__cCsBtj |¡d}|stƒS|j |¡}|s0tƒS|fi| ¡¤ŽS)z5Construct a (possibly null) ContentChecker from a URLr,)r1rr2r}ÚpatternrxÚ groupdict)Úclsr5r<rAr r r!Úfrom_urls zHashChecker.from_urlcCs|j |¡dSrf)rÚupdater~r r r!r!szHashChecker.feedcCs|j ¡|jkSrf)rZ hexdigestrr‚r r r!rƒ$szHashChecker.is_validcCs||j}||ƒSrf)rŒ)rr„r…Úmsgr r r!r†'s zHashChecker.reportN) r‡rˆr‰rQÚcompiler’r‘Ú classmethodr•rrƒr†r r r r!r‹ sÿ r‹csNeZdZdZdNdd„ZdOd d „ZdPd d „ZdQd d„Zdd„Zdd„Z dd„Z dd„Z dd„Z dRdd„Z dd„ZdS‡fdd„ Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„ZdTd)d*„ZdUd+d,„Zd-d.„Zd/Zd0d1„Zd2d3„ZdVd4d5„Zd6d7„Zed8d9„ƒZd:d;„Zdd?„Z!d@dA„Z"dBdC„Z#dDdE„Z$edFdG„ƒZ%dHdI„Z&dJdK„Z'dLdM„Z(‡Z)S)Wrz;A distribution index that scans web pages for download URLsúhttps://pypi.org/simple/©Ú*NTcOsštj|g|¢Ri|¤Ž|dd| d¡ …|_i|_i|_i|_t d  t t |ƒ¡¡j |_ g|_|oxtjox|pxt ¡}|rŒt |¡|_n tjj|_dS)Nr+ú|)r r‘r&Ú index_urlÚ scanned_urlsÚ fetched_urlsÚ package_pagesrQr˜rZrqrrAÚallowsÚto_scanrZ is_availableZfind_ca_bundleZ opener_forÚopenerr1ÚrequestÚurlopen)rržZhostsZ ca_bundleZ verify_sslrgÚkwZuse_sslr r r!r‘/sÿ ýzPackageIndex.__init__Fc Csâ||jvr|sdSd|j|<t|ƒs2| |¡dStt|ƒƒ}|r\| |¡sPdS| d|¡|sn|rn||jvr‚tt|j |ƒƒdS| |¡sšd|j|<dS|  d|¡d|j|<d}|  |||¡}|durÐdSt |t jjƒrø|jdkrø|  d|j¡d|j|j<d|j d d ¡ ¡vr(| ¡dS|j}| ¡}t |tƒsvt |t jjƒrXd }n|j d ¡phd }| |d ¡}| ¡t |¡D](} t j |t|   d¡ƒ¡} | !| ¡qˆ| "|j#¡rÞt$|ddƒdkrÞ| %||¡}dS)z.)ÚfilterrNr9rÇr±r]ÚstarmapÚ scan_egg_link)rÚ search_pathÚdirsZ egg_linksr r r!Úscan_egg_links—s þzPackageIndex.scan_egg_linkscCs¢ttj ||¡ƒ&}ttdttj|ƒƒƒ}Wdƒn1s>0Yt |ƒdkrXdS|\}}t tj ||¡ƒD]*}tjj|g|¢RŽ|_ t |_ | |¡qrdS)NrV)ÚopenrNr9rZr±rÑrqrrrsrKr rGrr>r\)rr9rÐZ raw_linesÚlinesZegg_pathZ setup_pathrDr r r!rÓ¡s4 zPackageIndex.scan_egg_linkcCs”d}| |j¡s|Stttjj|t|jƒd… d¡ƒƒ}t|ƒdksRd|dvrV|St |dƒ}t |dƒ}d|j   |  ¡i¡|<t|ƒt|ƒfS)N)NNr+rVr/r0rT)r'ržr±rqr1rr3rKr4r r r¡Ú setdefaultr%r )rrÄZNO_MATCH_SENTINELr6ÚpkgÚverr r r!Ú_scan±s ÿ  zPackageIndex._scanc CsÀt |¡D]:}z"| tj |t| d¡ƒ¡¡Wq tyBYq 0q | |¡\}}|s\dSt ||ƒD]H}t |ƒ\}}|  d¡r¤|s¤|rš|d||f7}n |  |¡|  |¡qft dd„|¡S)z#Process the contents of a PyPI pager0rªú.pyz #egg=%s-%scSsd| ddd¡S)Nz%sr0érV)rB)Úmr r r!ÚÝrUz,PackageIndex.process_index..)rtrorÜr1rrurvrBrr|r=r&Úneed_version_infoÚscan_urlÚPYPI_MD5Úsub) rr5ryrArÚrÛÚnew_urlr)Úfragr r r!rÀÃs$"    ÿzPackageIndex.process_indexcCs| d|¡dS)NzPPage at %s links to .py file(s) without version info; an index scan is required.)Úscan_all©rr5r r r!ráàsþzPackageIndex.need_version_infocGs<|j|jvr,|r"|j|g|¢RŽ| d¡| |j¡dS)Nz6Scanning index of all packages (this may take a while))ržr rÆr´râ©rr—rgr r r!rçæs ÿzPackageIndex.scan_allcCsz| |j|jd¡|j |j¡s:| |j|jd¡|j |j¡sR| |¡t|j |jd¡ƒD]}| |¡qfdS)Nr+r ) râržÚ unsafe_namer¡rºrarHÚnot_found_in_indexr±)rÚ requirementr5r r r!Ú find_packagesïs zPackageIndex.find_packagescsR| ¡| |¡||jD]"}||vr0|S| d||¡qtt|ƒ ||¡S)Nz%s does not match %s)Úprescanrírar³ÚsuperrÚobtain)rrìZ installerrD©Ú __class__r r!rðþs zPackageIndex.obtaincCsL| |jd|¡| ¡sH| ¡t |¡td|jjtj   |¡fƒ‚dS)z- checker is a ContentChecker zValidating %%s checksum for %sz7%s validation failed for %s; possible download problem?N) r†r³rƒr»rNÚunlinkrrr(r9rL)rÚcheckerrOÚtfpr r r!Ú check_hashsþ þÿzPackageIndex.check_hashcCsN|D]D}|jdus0t|ƒr0| d¡s0tt|ƒƒr<| |¡q|j |¡qdS)z;Add `urls` to the list that will be prescanned for searchesNúfile:)r£r¯r'r±rrâÚappend)rZurlsr5r r r!Úadd_find_linkssÿþý ü zPackageIndex.add_find_linkscCs"|jrtt|j|jƒƒd|_dS)z7Scan urls scheduled for prescanning (e.g. --find-links)N)r£r±rqrâr‚r r r!rî&szPackageIndex.prescancCs<||jr|jd}}n |jd}}|||jƒ| ¡dS)Nz#Couldn't retrieve index page for %rz3Couldn't find index page for %r (maybe misspelled?))rar´rÆrêrç)rrìÚmethr—r r r!rë,s þ zPackageIndex.not_found_in_indexcCsvt|tƒsbt|ƒ}|rJ| ||¡}t|ƒ\}}| d¡rF| |||¡}|Stj  |¡rZ|St |ƒ}t |  ||¡ddƒS)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ÝrGN) r¶rr¯Ú _download_urlr=r&Ú gen_setuprNr9rÅr"r¿Úfetch_distribution)rrÚtmpdirr7Úfoundr)r<r r r!r-6s     zPackageIndex.downloadc s܈ d|¡i‰d}d ‡‡‡‡‡fdd„ }|rHˆ ¡ˆ |¡||ƒ}|s^|dur^|||ƒ}|dur€ˆjdurxˆ ¡||ƒ}|durž|sžˆ |¡||ƒ}|dur¾ˆ dˆr´dp¶d|¡nˆ d|¡|j|jd SdS) a|Obtain a distribution suitable for fulfilling `requirement` `requirement` must be a ``pkg_resources.Requirement`` instance. If necessary, or if the `force_scan` flag is set, the requirement is searched for in the (online) package index as well as the locally installed packages. If a distribution matching `requirement` is found, the returned distribution's ``location`` is the value you would have gotten from calling the ``download()`` method with the matching distribution's URL or filename. If no matching distribution is found, ``None`` is returned. If the `source` flag is set, only source distributions and source checkout links will be considered. Unless the `develop_ok` flag is set, development and system eggs (i.e., those using the ``.egg-info`` format) will be ignored. zSearching for %sNcs’|dur ˆ}||jD]v}|jtkrFˆsF|ˆvrˆ d|¡dˆ|<q||vo\|jtkp\ˆ }|rˆ |jˆ¡}||_tj   |j¡r|SqdS)Nz&Skipping development or system egg: %sr0) rar>rrÆrr-rGÚdownload_locationrNr9rÅ)ZreqÚenvrDÚtestZloc©Ú develop_okrZskippedÚsourcerþr r!rwps$ÿþz-PackageIndex.fetch_distribution..findz:No local packages or working download links found for %s%sza source distribution of rªzBest match: %s)rG)N)r´rîrír£rÆÚcloner) rrìrþÚ force_scanrrZ local_indexrDrwr rr!rýXs2        ý zPackageIndex.fetch_distributioncCs"| ||||¡}|dur|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ýrG)rrìrþrrrDr r r!Úfetch¤szPackageIndex.fetchc Cst |¡}|r*dd„t|| d¡dƒDƒp,g}t|ƒdkrîtj |¡}tj |¡|krŠtj  ||¡}ddl m }|||ƒsŠt   ||¡|}ttj  |d¡dƒ<} |  d|dj|djtj |¡df¡Wdƒn1sà0Y|S|rtd ||fƒ‚ntd ƒ‚dS) NcSsg|]}|jr|‘qSr )rI)rRÚdr r r!Ú ³sÿz*PackageIndex.gen_setup..r0r)Úsamefilezsetup.pyÚwzIfrom setuptools import setup setup(name=%r, version=%r, py_modules=[%r]) z†Can't unambiguously interpret project/version identifier %r; any dashes in the name or version should be escaped using underscores. %rzpCan't process plain .py files without an '#egg=name-version' suffix to enable automatic setup script generation.)r@rArrBrKrNr9rLÚdirnamerZZsetuptools.command.easy_installr ÚshutilZcopy2r×ÚwriterHrIÚsplitextr) rrOr<rþrArÁrLZdstr rÍr r r!rü±s@  þý     þþÿ"þÿÿzPackageIndex.gen_setupi c Cs:| d|¡d}zt |¡}| |¡}t|tjjƒrLtd||j |j fƒ‚| ¡}d}|j }d}d|vr”|  d¡} t tt| ƒƒ}| |||||¡t|dƒ`} | |¡} | râ| | ¡|  | ¡|d7}| |||||¡q qâq | ||| ¡Wdƒn1s0Y|W|r"| ¡Sn|r4| ¡0dS) NzDownloading %szCan't download %s: %s %srr,zcontent-lengthzContent-LengthÚwbr0)r´r‹r•rµr¶r1r·r¸rr­r—Ú dl_blocksizeZget_allÚmaxrqÚintÚ reporthookr×r¼rrrör») rr5rOÚfprôr¹ÚblocknumZbsÚsizeZsizesrõr€r r r!Ú _download_toÜsD   ÿ     .ýÿzPackageIndex._download_tocCsdSrfr )rr5rOrZblksizerr r r!rszPackageIndex.reporthookc Cs®| d¡rt|ƒSzt||jƒWSttjjfyˆ}zHd dd„|j Dƒ¡}|r`|  ||¡nt d||fƒ|‚WYd}~n*d}~0t j jy²}z|WYd}~Sd}~0t j jy}z4|rÚ|  ||j¡nt d||jfƒ|‚WYd}~n°d}~0tjjyT}z6|r,|  ||j¡nt d||jfƒ|‚WYd}~n^d}~0tjjtj fy¨}z2|r‚|  ||¡nt d||fƒ|‚WYd}~n d}~00dS)Nr÷ú cSsg|] }t|ƒ‘qSr )rr)rRÚargr r r!r  rUz)PackageIndex.open_url..z%s %szDownload error for %s: %sz;%s returned a bad status line. The server might be down, %s)r'Ú local_openÚopen_with_authr¤rÚhttpÚclientÚ InvalidURLrZrgrÆrr1r·r¸ZURLErrorÚreasonZ BadStatusLineÚlineZ HTTPExceptionÚsocket)rr5ZwarningÚvr—r r r!rµsJ (ÿÿþÿüÿÿzPackageIndex.open_urlcCsŒt|ƒ\}}|r0d|vr4| dd¡ dd¡}qnd}| d¡rJ|dd…}tj ||¡}| t|ƒ¡sttd|›ƒ‚|  ||¡pŠ|  ||¡S) Nz..Ú.ú\Ú_Z__downloaded__rEr$zInvalid filename ) r=Úreplacer&rNr9rZr'rrrÚ _download_vcsÚ_download_other)rr5rþr(r<rOr r r!rû's   zPackageIndex._download_urlcCsLtj |¡j}| d¡\}}}tddgdgt|ƒƒ}tt|h|@ƒdƒS)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') ú+ÚsvnÚgitÚhgN) r1rÚurlsplitr7Ú partitionr[ÚboolÚnextÚiter)r5r7ÚpreÚsepÚpostZallowedr r r!Ú _resolve_vcs<s zPackageIndex._resolve_vcsc CsÆ| |¡}|sdS|dkr&| ||¡S| d¡\}}}| |¡\}}| d|›d|›d|›¡t |dd||g¡t|d|d d|g|d |d dd |d gd}|durÂ| d|›¡t ||¡|S)Nr,r/zDoing z clone from ú to rz--quietz-CÚcheckoutz--cwdZupz-rú-q)r-r.z Checking out )r7Ú _download_svnr0Ú_vcs_split_rev_from_urlr´Ú subprocessÚ check_callÚdict)rr5Z spec_filenameZvcsrOr'ÚrevZ co_commandsr r r!r)Ps"  þzPackageIndex._download_vcscCsDtj |¡j}|dkr,tj tj |¡j¡S| |d¡|  ||¡S)NrÍT) r1rr/r7r¥Ú url2pathnamer2r9r²Ú_attempt_download)rr5rOr7r r r!r*gs  zPackageIndex._download_othercCs| |d¡dS)NT)r¾rèr r r!râoszPackageIndex.scan_urlcCs6| ||¡}d| dd¡ ¡vr.| |||¡S|SdS)Nr¨r©rª)rrºr%Ú_download_html)rr5rOr¹r r r!rBrs zPackageIndex._attempt_downloadcCsnt|ƒ}|D]>}| ¡r t d|¡rF| ¡t |¡| ||¡SqLq | ¡t |¡td|ƒ‚dS)Nz ([^- ]+ - )?Revision \d+:zUnexpected HTML page found at ) r×���rs���rQ���rx���r»���rN���ró���r;��r���)r���r5���r¹���rO���rÍ���r"��r ���r ���r!���rC��y��s����   zPackageIndex._download_htmlc�����������������C���s��t� dt¡�| dd¡d�}d}| ¡� d¡râd|v�râtj |¡\}}}}}} |sâ| d¡râd |d d�…�v�râ|d d�…� d d¡\}}t |ƒ\} } | râd | v�rº|  d d¡\} } d | | f�}nd | �}| }|||||| f}tj  |¡}|�  d|›�d|›�¡�t   dd|d||g¡�|S�)Nz"SVN download support is deprecatedr/���r0���r���rª���zsvn:ú@z//r+���rV���ú:z --username=%s --password=%sz --username=zDoing subversion checkout from r8��r,��r9��r:��)ÚwarningsrÆ���Ú UserWarningr4���r%���r'���r1���r���r2���Ú _splituserÚ urlunparser´���r=��r>��)r���r5���rO���Zcredsr7���Únetlocr9���rS���ÚqrÃ���ÚauthÚhostÚuserZpwr6���r ���r ���r!���r;��ˆ��s&����   zPackageIndex._download_svnc����������� ������C���st���t�j |�¡}|j dd¡d�}|j d¡\}}}| d¡\}}}|rL||fn|df\}} |j||dd  ¡�} | | 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) r+��r0���r,���r/���rD��Nrª���)r7���r9���r<���) r1���r���r/��r7���r4���r9���r0��Ú rpartitionÚ_replaceZgeturl) r5���r6���Z clean_schemeZno_fragment_pathr'��r4��r5��r6��Z clean_pathr@��Zresolvedr ���r ���r!���r<��ž��s���� ü z$PackageIndex._vcs_split_rev_from_urlc�����������������G���s���t�j|g|¢R�Ž��d�S�rf���)r���r³���ré���r ���r ���r!���r³���½��s����zPackageIndex.debugc�����������������G���s���t�j|g|¢R�Ž��d�S�rf���)r���r´���ré���r ���r ���r!���r´���À��s����zPackageIndex.infoc�����������������G���s���t�j|g|¢R�Ž��d�S�rf���)r���rÆ���ré���r ���r ���r!���rÆ���Ã��s����zPackageIndex.warn)rš���r›���NT)F)F)F)N)N)FFFN)FF)N)*r‡���rˆ���r‰���rŠ���r‘���r¾���r°���r²���rÖ���rÓ���rÜ���rÀ���rá���rç���rí���rð���rö���rù���rî���rë���r-���rý���r��rü���r��r��r��rµ���rû���Ú staticmethodr7��r)��r*��râ���rB��rC��r;��r<��r³���r´���rÆ���Ú __classcell__r ���r ���rñ���r!���r���,��sV�����þ  5      #��þ L )$ #  r���z!&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?c�����������������C���s���|� �d¡}t |¡S�)Nr���)rB���r¨���Zunescape)rA���Zwhatr ���r ���r!���Ú decode_entityÌ��s���� rS��c�����������������C���s ���t�t|�ƒ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_subrS��)Útextr ���r ���r!���rv���Ñ��s���� rv���c��������������������s���‡�fdd„}|S�)Nc��������������������s���‡�‡fdd„}|S�)Nc��������������� ������s>���t� ¡�}t� ˆ¡�zˆ�|�i�|¤ŽW�t� |¡�S�t� |¡�0�d�S�rf���)r#��ZgetdefaulttimeoutZsetdefaulttimeout)rg���rh���Z old_timeout)rj���Útimeoutr ���r!���Ú_socket_timeoutß��s����  þz@socket_timeout.<locals>._socket_timeout.<locals>._socket_timeoutr ���)rj���rW��©rV��ri���r!���rW��Þ��s����z'socket_timeout.<locals>._socket_timeoutr ���)rV��rW��r ���rX��r!���Úsocket_timeoutÝ��s���� rY��c�����������������C���s2���t�j |�¡}| ¡�}t |¡}| ¡�}| dd¡S�)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ª���)r1���r���r3���ÚencodeÚbase64Z b64encoder½���r(��)rL��Zauth_sZ auth_bytesZ encoded_bytesZencodedr ���r ���r!���Ú _encode_authì��s ����  r]��c�������������������@���s(���e�Zd�ZdZdd„�Zdd„�Zdd„�ZdS�) Ú Credentialz: A username/password pair. Use like a namedtuple. c�����������������C���s���||�_�||�_d�S�rf���©ÚusernameÚpassword)r���r`��ra��r ���r ���r!���r‘�����s����zCredential.__init__c�����������������c���s���|�j�V��|�jV��d�S�rf���r_��r‚���r ���r ���r!���Ú__iter__ ��s����zCredential.__iter__c�����������������C���s ���dt�|�ƒ�S�)Nz%(username)s:%(password)s)Úvarsr‚���r ���r ���r!���Ú__str__��s����zCredential.__str__N)r‡���rˆ���r‰���rŠ���r‘���rb��rd��r ���r ���r ���r!���r^����s���r^��c�������������������@���s0���e�Zd�Zdd„�Zedd„�ƒZdd„�Zdd„�Zd S�) Ú PyPIConfigc�����������������C���sN���t� g�d¢d¡}tj |�|¡�tj tj d¡d¡}tj  |¡rJ|�  |¡�dS�)z% Load from ~/.pypirc )r`��ra��Ú repositoryrª���ú~z.pypircN) r?��ÚfromkeysÚ configparserÚRawConfigParserr‘���rN���r9���rZ���Ú expanduserrÅ���r¼���)r���ÚdefaultsZrcr ���r ���r!���r‘�����s ���� zPyPIConfig.__init__c��������������������s&���‡�fdd„ˆ� �¡�D�ƒ}ttˆ�j|ƒƒS�)Nc��������������������s ���g�|�]}ˆ� �|d�¡ ¡�r|‘qS�)rf��)rº���rs���)rR���Úsectionr‚���r ���r!���r �� ��s���ÿz2PyPIConfig.creds_by_repository.<locals>.<listcomp>)Zsectionsr?��rq���Ú_get_repo_cred)r���Zsections_with_repositoriesr ���r‚���r!���Úcreds_by_repository��s���� ÿzPyPIConfig.creds_by_repositoryc�����������������C���s6���|� �|d¡ ¡�}|t|� �|d¡ ¡�|� �|d¡ ¡�ƒfS�)Nrf��r`��ra��)rº���rs���r^��)r���rm��Zrepor ���r ���r!���rn��'��s ����þzPyPIConfig._get_repo_credc�����������������C���s*���|�j� ¡�D�]\}}| |¡r |��S�q dS�)zŒ If the URL indicated appears to be a repository defined in this config, return the credential for that repository. N)ro��Úitemsr'���)r���r5���rf��Úcredr ���r ���r!���Úfind_credential.��s���� zPyPIConfig.find_credentialN)r‡���rˆ���r‰���r‘���Úpropertyro��rn��rr��r ���r ���r ���r!���re����s ���  re��c�����������������C���s@��t�j |�¡}|\}}}}}}| d¡r2tj d¡‚|dv�rHt|ƒ\} } nd} | s„tƒ�  |�¡} | r„t | ƒ} | j |�f} t j dg| ¢R�Ž��| rÊdt| ƒ�} || ||||f} t�j | ¡}t�j |¡}| d| ¡�n t�j |�¡}| dt¡�||ƒ}| r<t�j |j¡\}}}}}}||kr<|| kr<||||||f} t�j | ¡|_|S�) z4Open a urllib2 request, handling HTTP authenticationrE��znonnumeric port: '')r��ZhttpsNz*Authenticating as %s for %s (from .pypirc)zBasic Z Authorizationz User-Agent)r1���r���r2���r&���r��r��r ��rH��re��rr��rr���r`��r���r´���r]��rI��r¥���ZRequestZ add_headerÚ user_agentr5���)r5���r¤���Zparsedr7���rJ��r9���Úparamsr;���ræ���rL��Zaddressrq��r´���r6���rå���r¥���r��Ús2Zh2Zpath2Zparam2Zquery2Zfrag2r ���r ���r!���r��8��s8����          r��c�����������������C���s ���|� �d¡\}}}�|r|nd|�fS�)zNsplituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.rD��N)rO��)rM��rN��Zdelimr ���r ���r!���rH��g��s����rH��c�����������������C���s���|�S�rf���r ���)r5���r ���r ���r!���Ú fix_sf_urlr��s����rw��c�������������� ���C���s,��t�j |�¡\}}}}}}t�j |¡}tj |¡r<t�j |�¡S�|  d¡rütj  |¡rüg�}t  |¡D�]x} tj  || ¡} | dkr²t | dƒ} |  ¡�} W�d��ƒ�n1�s¢0����Y���qòntj  | ¡rÆ| d7�} | dj| d¡�q`d} | j|�d  |¡d } d \}}n d \}}} d d i}t | ¡}t�j |�||||¡S�)z7Read a local path, with special support for directoriesr+���z index.htmlÚrNz<a href="{name}">{name}</a>)r(���zB<html><head><title>{url}{files}rZ)r5Úfiles)éÈZOK)r®zPath not foundz Not foundr©z text/html)r1rr2r¥rArNr9Úisfiler¦r&rÇrÉrZr×r¼røÚformatÚioÚStringIOr·r¸)r5r7r8r9Zparamr;rærOryrÃÚfilepathrÚbodyrÂZstatusÚmessager¹Z body_streamr r r!rvs.    & ÿ   r)N)N)N)N)r)ZrŠÚsysr=rNrQr}rr#r\rr]rFrir¨Z http.clientrZ urllib.parser1Zurllib.requestZ urllib.errorÚ functoolsrrZ pkg_resourcesrrrrrr r r r r rrrrZ distutilsrZdistutils.errorsrZfnmatchrZsetuptools.wheelrr˜r@ÚIrtrãrAr¯r4rJÚ__all__Z_SOCKET_TIMEOUTZ_tmplr|Ú version_infortr"rr=rr?rPrrerlrnr|r}r‹rrärTrSrvrYr]r^rjrer¥r¦rrHrwrr r r r!Ús <      ÿ ÿ   ! þ $   !"  &/