<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
U
    Qab                     @   s  d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZ ddlmZ ddlmZmZmZmZ ddlZddlmZmZmZmZmZmZmZmZmZmZmZm Z m!Z! ddlm"Z" ddl#m$Z$ dd	l%m&Z& dd
l'm(Z( ddl)m*Z* ddl+m,Z, ddl-m.Z. e/Z0e1dZ2e1dej3Z4e1dZ5e1dej3j6Z7d8 Z9ddddgZ:dZ;dZ<e<j=dj=ej> edZ?dd Z@dd ZAdd ZBdGd dZCdHd!d"ZDdId#d$ZEdedfd%dZFdJd&d'ZGd(d) ZHe1d*ej3ZIeHd+d, ZJG d-d. d.ZKG d/d0 d0eKZLG d1d deZMe1d2jNZOd3d4 ZPd5d6 ZQdKd7d8ZRd9d: ZSG d;d< d<ZTG d=d> d>ejUZVejWjXfd?d@ZYdAdB ZZeRe;eYZYdCdD Z[dEdF Z\dS )Lz#PyPI and direct package downloading    Nwraps)six)urllibhttp_clientconfigparsermap)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)get_all_headers)unescape)Wheelz^egg=([-A-Za-z0-9_.+!]+)$zhref\s*=\s*['"]?([^'"> ]+)z<a href="([^"#]+)">([^<]+)</a>\n\s+\(<a (?:title="MD5 hash"\n\s+)href="[^?]+\?:action=show_md5&amp;digest=([0-9a-f]{32})">md5</a>\)z([-+.a-z0-9]{2,}):z.tar.gz .tar.bz2 .tar .zip .tgzPackageIndexdistros_for_urlparse_bdist_wininstinterpret_distro_name   z<setuptools/{setuptools.__version__} Python-urllib/{py_major}z{}.{})Zpy_major
setuptoolsc                 C   s4   zt | W S  tk
r.   td| f Y nX d S )Nz1Not a URL, existing file, or requirement spec: %r)r   parse
ValueErrorr   )spec r&   </usr/lib/python3.8/site-packages/setuptools/package_index.pyparse_requirement_arg4   s    r(   c                 C   s   |   }d\}}}|dr|dr8| dd }d}nn|ddrb| d	d
 }| dd }d}nD|dr~| dd }d}n(|ddr| d	d
 }| dd }d}|||fS )z=Return (base,pyversion) or (None,None) for possible .exe name)NNN.exez
.win32.exeNiZwin32z	.win32-pyiiz.win-amd64.exeiz	win-amd64z.win-amd64-pyi)lowerendswith
startswith)namer+   basepy_verZplatr&   r&   r'   r   =   s$    



c           	      C   sx   t j| }|\}}}}}}t j|dd }|dkrX|dkrXt j|dd }d|krp|dd\}}||fS )N/zsourceforge.netdownload#   )r   r#   urlparseunquotesplit)	urlpartsschemeserverpathZ
parametersqueryfragmentr/   r&   r&   r'   egg_info_for_urlU   s    rA   c                 c   s\   t | \}}t| ||D ]
}|V  q|rXt|}|rXt| |d|tdD ]
}|V  qLdS )zEYield egg or source distribution objects that might be found at a URLr6   )
precedenceN)rA   distros_for_locationEGG_FRAGMENTmatchr    groupr	   )r:   metadatar/   r@   distrE   r&   r&   r'   r   `   s    
   
c                 C   s   | dr|dd }| dr8d|kr8t| ||gS | drxd|krxt|}| s^g S t| |j|jtd dgS | d	rt|\}}}|dk	rt	| |||t
|S tD ]0}| |r|dt|  }t	| ||  S qg S )
z:Yield egg or source distribution objects based on basename.egg.zipNr*   z.egg-z.whlr6   )locationproject_nameversionrB   r)   )r,   r
   Zfrom_locationr   Zis_compatiblerL   rM   r   r   r    r   
EXTENSIONSlen)rK   basenamerG   ZwheelZwin_baser0   platformZextr&   r&   r'   rC   n   s<    

     
rC   c                 C   s   t t| tj| |S )zEYield possible egg or source distribution objects based on a filename)rC   r   osr>   rP   )filenamerG   r&   r&   r'   distros_for_filename   s
     
 rT   c              
   c   s|   | d}|s,tdd |dd D r,dS tdt|d D ]8}t| |d|d| d||d |||dV  q>dS )zGenerate 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!
    rJ   c                 s   s   | ]}t d |V  qdS )z	py\d\.\d$N)rerE   ).0pr&   r&   r'   	<genexpr>   s     z(interpret_distro_name.<locals>.<genexpr>   Nr6   )
py_versionrB   rQ   )r9   anyrangerO   r
   join)rK   rP   rG   rZ   rB   rQ   r;   rW   r&   r&   r'   r       s    
    c                 c   sf   t  }|j}|dkr:tj|j| D ]}|| |V  q$n(| D ]"}||}||kr>|| |V  q>dS )zHList unique elements, preserving order. Remember all elements ever seen.N)setaddr   Zmovesfilterfalse__contains__)iterablekeyseenZseen_addZelementkr&   r&   r'   unique_everseen   s    
rf   c                    s   t   fdd}|S )zs
    Wrap a function returning an iterable such that the resulting iterable
    only ever yields unique items.
    c                     s   t  | |S N)rf   )argskwargsfuncr&   r'   wrapper   s    zunique_values.<locals>.wrapperr   )rk   rl   r&   rj   r'   unique_values   s    rm   z(<([^>]*\srel\s*=\s*['"]?([^'">]+)[^>]*)>c              	   c   s   t |D ]d}| \}}tttj| d}d|ksDd|kr
t	|D ]}t
j| t|dV  qNq
dD ]@}||}|dkrtt	||}|rtt
j| t|dV  qtdS )zEFind rel="homepage" and rel="download" links in `page`, yielding URLs,Zhomepager3   r6   )z<th>Home Pagez<th>Download URLr2   N)RELfinditergroupsr^   r   strstripr+   r9   HREFr   r#   urljoin
htmldecoderF   findsearch)r:   pagerE   tagZrelZrelsposr&   r&   r'   find_external_links   s    
r|   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	ContentCheckerzP
    A null content checker that defines the interface for checking content
    c                 C   s   dS )z3
        Feed a block of data to the hash.
        Nr&   selfblockr&   r&   r'   feed   s    zContentChecker.feedc                 C   s   dS )zC
        Check the hash. Return False if validation fails.
        Tr&   r   r&   r&   r'   is_valid   s    zContentChecker.is_validc                 C   s   dS )zu
        Call reporter with information about the checker (hash name)
        substituted into the template.
        Nr&   )r   reportertemplater&   r&   r'   report  s    zContentChecker.reportN)__name__
__module____qualname____doc__r   r   r   r&   r&   r&   r'   r}      s   r}   c                   @   sB   e Zd ZedZdd Zedd Zdd Z	dd	 Z
d
d ZdS )HashCheckerzK(?P<hash_name>sha1|sha224|sha384|sha256|sha512|md5)=(?P<expected>[a-f0-9]+)c                 C   s   || _ t|| _|| _d S rg   )	hash_namehashlibnewhashexpected)r   r   r   r&   r&   r'   __init__  s    zHashChecker.__init__c                 C   s>   t j|d }|st S | j|}|s0t S | f | S )z5Construct a (possibly null) ContentChecker from a URLr2   )r   r#   r7   r}   patternrx   	groupdict)clsr:   r@   rE   r&   r&   r'   from_url  s    zHashChecker.from_urlc                 C   s   | j | d S rg   )r   updater~   r&   r&   r'   r     s    zHashChecker.feedc                 C   s   | j  | jkS rg   )r   Z	hexdigestr   r   r&   r&   r'   r   "  s    zHashChecker.is_validc                 C   s   || j  }||S rg   )r   )r   r   r   msgr&   r&   r'   r   %  s    
zHashChecker.reportN)r   r   r   rU   compiler   r   classmethodr   r   r   r   r&   r&   r&   r'   r   	  s   

r   c                       s<  e Zd ZdZdJddZdKd	d
ZdLddZdMddZdd Zdd Z	dd Z
dd ZdNddZdd ZdO fdd	Zdd Zdd  Zd!d" Zd#d$ Zd%d& ZdPd'd(ZdQd)d*Zd+d, Zd-Zd.d/ Zd0d1 ZdRd2d3Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Ze dSd>d?Z!d@dA Z"dBdC Z#dDdE Z$dFdG Z%dHdI Z&  Z'S )Tr   z;A distribution index that scans web pages for download URLshttps://pypi.org/simple/*NTc                 O   s   t j| f|| |dd |d   | _i | _i | _i | _td	t
t|j| _g | _|ortjor|prt }|rt|| _n
tjj| _d S )Nr1   |)r   r   r,   	index_urlscanned_urlsfetched_urlspackage_pagesrU   r   r]   r   r   rE   allowsto_scanr   Zis_availableZfind_ca_bundleZ
opener_foropenerr   requesturlopen)r   r   ZhostsZ	ca_bundleZ
verify_sslrh   kwZuse_sslr&   r&   r'   r   -  s    
zPackageIndex.__init__Fc                 C   s  || j kr|sdS d| j |< t|s2| | dS tt|}|r\| |sPdS | d| |sn|rn|| jkrtt| j	| dS | |sd| j|< dS | 
d| d| j|< d}| ||| }|dkrdS d| j|j< d|jdd kr |  dS |j}| }t|tsNt|tjjr0d	}n|jd
p@d	}||d}|  t|D ](}	tj|t|	d}
| |
 q`| | j!rt"|dddkr| #||}dS )z<Evaluate a URL as a possible download, and maybe retrieve itNTzFound link: %sz
Reading %sz<Download error on %s: %%s -- Some packages may not be found!htmlcontent-type zlatin-1charsetignorer6   code  )$r   
URL_SCHEMEprocess_filenamelistr   url_okdebugr   r   r_   infoopen_urlr:   headersgetr+   closeread
isinstancerr   r   error	HTTPErrorZ	get_paramdecodert   rp   r#   ru   rv   rF   process_urlr-   r   getattrprocess_index)r   r:   Zretrievediststmplfr/   ry   r   rE   linkr&   r&   r'   r   B  sP    





 zPackageIndex.process_urlc                 C   s   t j|s| d| d S t j|r^|s^t j|}t |D ]}| t j||d qBt	|}|r| 
d| tt| j| d S )NzNot found: %sTz	Found: %s)rR   r>   existswarnisdirrealpathlistdirr   r]   rT   r   r   r   r_   )r   fnnestedr>   itemr   r&   r&   r'   r   u  s    zPackageIndex.process_filenamec                 C   sb   t |}|o|d dk}|s8| tj|d r<dS d}|rRt|| n| || d S )Nr6   fileTzN
Note: Bypassing %s (disallowed host; see http://bit.ly/2hrImnY for details).
)	r   rF   r+   r   r   r#   r7   r   r   )r   r:   Zfatalsis_filer   r&   r&   r'   r     s    zPackageIndex.url_okc                 C   s2   t tjj|}dd |D }tt| j| d S )Nc                 s   s0   | ](}t |D ]}|d r||fV  qqdS )z	.egg-linkN)rR   r   r,   )rV   r>   entryr&   r&   r'   rX     s
    
z.PackageIndex.scan_egg_links.<locals>.<genexpr>)filterrR   r>   r   r   	itertoolsstarmapscan_egg_link)r   Zsearch_pathdirsZ	egg_linksr&   r&   r'   scan_egg_links  s
    zPackageIndex.scan_egg_linksc              	   C   s   t tj||}ttd ttj|}W 5 Q R X t	|dkrDd S |\}}t
tj||D ](}tjj|f| |_t|_| | q^d S )NrY   )openrR   r>   r]   r   r   r   rr   rs   rO   r   rK   r   rB   r_   )r   r>   r   Z	raw_lineslinesZegg_pathZ
setup_pathrH   r&   r&   r'   r     s     zPackageIndex.scan_egg_linkc           
   	      s    fdd}t |D ]:}z |tj|t|d W q tk
rN   Y qX q||\}}|rt||D ]H}t	|\}}	|
dr|	s|r|d||f 7 }n
 |  | qltdd |S dS d	S )
z#Process the contents of a PyPI pagec                    s   |   jrtttjj| t jd  d}t|dkrd|d krt	|d }t
|d }d j| i | < t|t|fS dS )Nr1   rY   r5   r6   r   T)NN)r-   r   r   r   r   r#   r8   rO   r9   r   r   r   
setdefaultr+   r   )r   r;   pkgverr   r&   r'   scan  s     z(PackageIndex.process_index.<locals>.scanr6   .pyz
#egg=%s-%sc                 S   s   d|  ddd S )Nz<a href="%s#md5=%s">%s</a>r6      rY   )rF   )mr&   r&   r'   <lambda>      z,PackageIndex.process_index.<locals>.<lambda>r   N)rt   rp   r   r#   ru   rv   rF   r$   r|   rA   r,   need_version_infoscan_urlPYPI_MD5sub)
r   r:   ry   r   rE   r   r   new_urlr/   fragr&   r   r'   r     s(     
 zPackageIndex.process_indexc                 C   s   |  d| d S )NzPPage at %s links to .py file(s) without version info; an index scan is required.)scan_allr   r:   r&   r&   r'   r     s    zPackageIndex.need_version_infoc                 G   s:   | j | jkr*|r | j|f|  | d | | j  d S )Nz6Scanning index of all packages (this may take a while))r   r   r   r   r   r   r   rh   r&   r&   r'   r     s    zPackageIndex.scan_allc                 C   sz   |  | j|j d  | j|js:|  | j|j d  | j|jsR| | t| j|jdD ]}|  | qfd S )Nr1   r&   )	r   r   unsafe_namer   r   rc   rL   not_found_in_indexr   )r   requirementr:   r&   r&   r'   find_packages  s    
zPackageIndex.find_packagesc                    sR   |    | | | |j D ]"}||kr0|  S | d|| qtt| ||S )Nz%s does not match %s)prescanr   rc   r   superr   obtain)r   r   Z	installerrH   	__class__r&   r'   r     s    
zPackageIndex.obtainc                 C   sL   | | jd|  | sH|  t| td|jjtj	
|f dS )z-
        checker is a ContentChecker
        zValidating %%s checksum for %sz7%s validation failed for %s; possible download problem?N)r   r   r   r   rR   unlinkr   r   r.   r>   rP   )r   checkerrS   tfpr&   r&   r'   
check_hash  s    
zPackageIndex.check_hashc                 C   sN   |D ]D}| j dks0t|r0|ds0tt|r<| | q| j | qdS )z;Add `urls` to the list that will be prescanned for searchesNfile:)r   r   r-   r   r   r   append)r   Zurlsr:   r&   r&   r'   add_find_links  s    
zPackageIndex.add_find_linksc                 C   s"   | j rtt| j| j  d| _ dS )z7Scan urls scheduled for prescanning (e.g. --find-links)N)r   r   r   r   r   r&   r&   r'   r     s    zPackageIndex.prescanc                 C   s<   | |j  r| jd }}n| jd }}|||j |   d S )Nz#Couldn't retrieve index page for %rz3Couldn't find index page for %r (maybe misspelled?))rc   r   r   r   r   )r   r   Zmethr   r&   r&   r'   r   #  s    
zPackageIndex.not_found_in_indexc                 C   s~   t |tsjt|}|rR| |d||}t|\}}|drN| |||}|S tj	
|rb|S t|}t| ||ddS )a  Locate 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.
        r6   r   rK   N)r   r   r   _download_urlrF   rA   r,   	gen_setuprR   r>   r   r(   r   fetch_distribution)r   r%   tmpdirr<   foundr/   r@   r&   r&   r'   r3   -  s    

zPackageIndex.downloadc           	         s    d| i d}d
 fdd	}|rH  | ||}|s^|dk	r^|||}|dkrjdk	rx  ||}|dkr|s| ||}|dkrdrdpd| n d| |j|jd	S dS )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.
        zSearching for %sNc                    s   |d kr}|| j  D ]v}|jtkrF sF|krd| d|< q|| ko\|jtkp\ }|r|j}||_tj	
|jr|  S qd S )Nz&Skipping development or system egg: %sr6   )rc   rB   r   r   r   r3   rK   download_locationrR   r>   r   )ZreqenvrH   ZtestZloc
develop_okr   Zskippedsourcer   r&   r'   rw   g  s&     z-PackageIndex.fetch_distribution.<locals>.findz:No local packages or working download links found for %s%sza source distribution of r   zBest match: %s)rK   )N)r   r   r   r   r   Zcloner   )	r   r   r   
force_scanr  r  Zlocal_indexrH   rw   r&   r  r'   r   O  s2    




zPackageIndex.fetch_distributionc                 C   s"   |  ||||}|dk	r|jS dS )a3  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)r   rK   )r   r   r   r  r  rH   r&   r&   r'   fetch  s    zPackageIndex.fetchc           
   	   C   s   t |}|r*dd t||dd D p,g }t|dkrtj|}tj||krtj	||}ddl
m} |||st|| |}ttj	|dd2}	|	d|d j|d jtj|d f  W 5 Q R X |S |rtd	||f ntd
d S )Nc                 S   s   g | ]}|j r|qS r&   )rM   )rV   dr&   r&   r'   
<listcomp>  s   z*PackageIndex.gen_setup.<locals>.<listcomp>r6   r   )samefilezsetup.pywzIfrom setuptools import setup
setup(name=%r, version=%r, py_modules=[%r])
zCan'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.)rD   rE   r    rF   rO   rR   r>   rP   dirnamer]   Zsetuptools.command.easy_installr	  shutilZcopy2r   writerL   rM   splitextr   )
r   rS   r@   r   rE   r   rP   Zdstr	  r   r&   r&   r'   r     sB    


 zPackageIndex.gen_setupi    c              	   C   s  |  d| d }zt|}| |}t|tjjrJt	d||j
|jf |  }d}| j}d}d|krt|d}	ttt|	}| ||||| t|dV}
||}|r|| |
| |d7 }| ||||| qqq| |||
 W 5 Q R X |W S |r|  X d S )	NzDownloading %szCan't download %s: %s %sr   r2   zcontent-lengthzContent-Lengthwbr6   )r   r   r   r   r   r   r   r   r   r   r   r   dl_blocksizer   maxr   int
reporthookr   r   r   r  r   )r   r:   rS   fpr   r   blocknumZbssizeZsizesr   r   r&   r&   r'   _download_to  s:    





zPackageIndex._download_toc                 C   s   d S rg   r&   )r   r:   rS   r  Zblksizer  r&   r&   r'   r    s    zPackageIndex.reporthookc              
   C   s  | drt|S zt|| jW S  ttjfk
r } z<ddd |jD }|r`| 	|| nt
d||f W 5 d }~X Y n tjjk
r } z| W Y S d }~X Y n tjjk
 r } z*|r| 	||j nt
d||jf W 5 d }~X Y n tjk
rF } z,|r$| 	||j nt
d||jf W 5 d }~X Y nP tjtjfk
r } z(|rt| 	|| nt
d||f W 5 d }~X Y nX d S )Nr    c                 S   s   g | ]}t |qS r&   )rr   )rV   argr&   r&   r'   r     s     z)PackageIndex.open_url.<locals>.<listcomp>z%s %szDownload error for %s: %sz;%s returned a bad status line. The server might be down, %s)r-   
local_openopen_with_authr   r$   r   
InvalidURLr]   rh   r   r   r   r   r   ZURLErrorreasonZBadStatusLinelineZHTTPExceptionsocket)r   r:   Zwarningvr   r&   r&   r'   r     s>    
"zPackageIndex.open_urlc                 C   s   t |\}}|r0d|kr4|dddd}qnd}|drJ|d d }tj||}|dksj|d	rv| ||S |d
ks|dr| ||S |dr| 	||S |dkrt
jt
j|d S | |d | ||S d S )Nz...\_Z__downloaded__rI   r*   Zsvnzsvn+Zgitzgit+zhg+r   rY   T)rA   replacer,   rR   r>   r]   r-   _download_svn_download_git_download_hgr   r   url2pathnamer#   r7   r   _attempt_download)r   r<   r:   r   r.   r@   rS   r&   r&   r'   r     s$    

zPackageIndex._download_urlc                 C   s   |  |d d S )NT)r   r   r&   r&   r'   r   :  s    zPackageIndex.scan_urlc                 C   s6   |  ||}d|dd kr.| |||S |S d S )Nr   r   r   )r  r   r+   _download_html)r   r:   rS   r   r&   r&   r'   r)  =  s    zPackageIndex._attempt_downloadc                 C   sn   t |}|D ]>}| rtd|rF|  t| | ||  S  qLq|  t| td| d S )Nz <title>([^- ]+ - )?Revision \d+:zUnexpected HTML page found at )	r   rs   rU   rx   r   rR   r   r%  r   )r   r:   r   rS   r   r  r&   r&   r'   r*  D  s    

zPackageIndex._download_htmlc                 C   s  t dt |ddd }d}| drd|krtj|\}}}}}}	|s|drd	|d
d  kr|d
d  d	d\}}t	|\}
}|
rd|
kr|
dd\}}d||f }nd|
 }|}||||||	f}tj
|}| d|| td|||f  |S )Nz"SVN download support is deprecatedr5   r6   r   r   zsvn:@z//r1   rY   :z --username=%s --password=%sz --username=z'Doing subversion checkout from %s to %szsvn checkout%s -q %s %s)warningsr   UserWarningr9   r+   r-   r   r#   r7   
_splituser
urlunparser   rR   system)r   r:   rS   Zcredsr<   netlocr>   rW   qr   authhostuserZpwr;   r&   r&   r'   r%  S  s&    zPackageIndex._download_svnc                 C   sp   t j| \}}}}}|ddd }|ddd }d }d|krR|dd\}}t j||||df} | |fS )N+r6   r2   r5   r   r+  r   )r   r#   Zurlsplitr9   rsplitZ
urlunsplit)r:   
pop_prefixr<   r2  r>   r?   r   revr&   r&   r'   _vcs_split_rev_from_urli  s    z$PackageIndex._vcs_split_rev_from_urlc                 C   sl   | ddd }| j|dd\}}| d|| td||f  |d k	rh| d| td	||f  |S )
Nr5   r6   r   Tr9  zDoing git clone from %s to %szgit clone --quiet %s %szChecking out %szgit -C %s checkout --quiet %sr9   r;  r   rR   r1  r   r:   rS   r:  r&   r&   r'   r&  {  s    zPackageIndex._download_gitc                 C   sl   | ddd }| j|dd\}}| d|| td||f  |d k	rh| d| td	||f  |S )
Nr5   r6   r   Tr<  zDoing hg clone from %s to %szhg clone --quiet %s %szUpdating to %szhg --cwd %s up -C -r %s -qr=  r>  r&   r&   r'   r'    s    zPackageIndex._download_hgc                 G   s   t j|f|  d S rg   )r   r   r   r&   r&   r'   r     s    zPackageIndex.debugc                 G   s   t j|f|  d S rg   )r   r   r   r&   r&   r'   r     s    zPackageIndex.infoc                 G   s   t j|f|  d S rg   )r   r   r   r&   r&   r'   r     s    zPackageIndex.warn)r   r   NT)F)F)F)N)N)FFFN)FF)N)F)(r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r3   r   r  r   r  r  r  r   r   r   r)  r*  r%  staticmethodr;  r&  r'  r   r   r   __classcell__r&   r&   r   r'   r   *  sX         

3


+
		
#      
L
)$
#z!&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?c                 C   s   |  d}t|S )Nr   )rF   r   )rE   Zwhatr&   r&   r'   decode_entity  s    
rA  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&amp;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_subrA  )textr&   r&   r'   rv     s    	rv   c                    s    fdd}|S )Nc                    s    fdd}|S )Nc               	      s2   t  }t  z | |W S t | X d S rg   )r  ZgetdefaulttimeoutZsetdefaulttimeout)rh   ri   Zold_timeout)rk   timeoutr&   r'   _socket_timeout  s
    
z@socket_timeout.<locals>._socket_timeout.<locals>._socket_timeoutr&   )rk   rE  rD  rj   r'   rE    s    z'socket_timeout.<locals>._socket_timeoutr&   )rD  rE  r&   rF  r'   socket_timeout  s    rG  c                 C   s2   t j| }| }t|}| }|ddS )aq  
    A function compatible with Python 2.3-3.3 that will 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#   r8   encodebase64Z	b64encoder   r$  )r4  Zauth_sZ
auth_bytesZencoded_bytesZencodedr&   r&   r'   _encode_auth  s
    
rK  c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	
Credentialz:
    A username/password pair. Use like a namedtuple.
    c                 C   s   || _ || _d S rg   usernamepassword)r   rN  rO  r&   r&   r'   r     s    zCredential.__init__c                 c   s   | j V  | jV  d S rg   rM  r   r&   r&   r'   __iter__  s    zCredential.__iter__c                 C   s   dt |  S )Nz%(username)s:%(password)s)varsr   r&   r&   r'   __str__  s    zCredential.__str__N)r   r   r   r   r   rP  rR  r&   r&   r&   r'   rL    s   rL  c                   @   s0   e Zd Zdd Zedd Zdd Zdd Zd	S )

PyPIConfigc                 C   sP   t dddgd}tj| | tjtjdd}tj	|rL| 
| dS )z%
        Load from ~/.pypirc
        rN  rO  
repositoryr   ~z.pypircN)dictfromkeysr   RawConfigParserr   rR   r>   r]   
expanduserr   r   )r   defaultsZrcr&   r&   r'   r     s
    zPyPIConfig.__init__c                    s&    fdd   D }tt j|S )Nc                    s    g | ]}  |d  r|qS )rT  )r   rs   )rV   sectionr   r&   r'   r    s   z2PyPIConfig.creds_by_repository.<locals>.<listcomp>)ZsectionsrV  r   _get_repo_cred)r   Zsections_with_repositoriesr&   r   r'   creds_by_repository  s    
zPyPIConfig.creds_by_repositoryc                 C   s6   |  |d }|t|  |d |  |d fS )NrT  rN  rO  )r   rs   rL  )r   r[  Zrepor&   r&   r'   r\    s
    zPyPIConfig._get_repo_credc                 C   s*   | j  D ]\}}||r
|  S q
dS )z
        If the URL indicated appears to be a repository defined in this
        config, return the credential for that repository.
        N)r]  itemsr-   )r   r:   rT  credr&   r&   r'   find_credential  s    
zPyPIConfig.find_credentialN)r   r   r   r   propertyr]  r\  r`  r&   r&   r&   r'   rS    s
   
rS  c                 C   s:  t j| }|\}}}}}}|dr0td|dkrFt|\}	}
nd}	|	s~t | }|r~t	|}	|j
| f}tjd	|  |	rdt|	 }	||
||||f}t j|}t j|}|d|	 nt j| }|dt ||}|	r6t j|j\}}}}}}||kr6||
kr6||||||f}t j||_|S )
z4Open a urllib2 request, handling HTTP authenticationr,  znonnumeric port: '')ZhttpZhttpsN*Authenticating as %s for %s (from .pypirc)zBasic ZAuthorizationz
User-Agent)rb  )r   r#   r7   r,   r   r  r/  rS  r`  rr   rN  r   r   rK  r0  r   ZRequestZ
add_header
user_agentr:   )r:   r   Zparsedr<   r2  r>   Zparamsr?   r   r4  Zaddressr_  r   r;   r   r   r  s2Zh2Zpath2Zparam2Zquery2Zfrag2r&   r&   r'   r    s8    


r  c                 C   s    |  d\}}} |r|nd| fS )zJsplituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.r+  N)
rpartition)r5  r6  Zdelimr&   r&   r'   r/  F  s    r/  c                 C   s   | S rg   r&   )r:   r&   r&   r'   
fix_sf_urlP  s    rf  c              
   C   s  t j| \}}}}}}t j|}tj|r<t j| S |	drtj
|rg }t|D ]d}	tj||	}
|	dkrt|
d}| }W 5 Q R X  qntj
|
r|	d7 }	|dj|	d q`d}|j| d|d}d	\}}n
d
\}}}ddi}t|}t j| ||||S )z7Read a local path, with special support for directoriesr1   z
index.htmlrz<a href="{name}">{name}</a>)r.   zB<html><head><title>{url}</title></head><body>{files}</body></html>rH  )r:   files)   ZOK)r   zPath not foundz	Not foundr   z	text/html)r   r#   r7   r   r(  rR   r>   isfiler   r,   r   r   r]   r   r   r   formatr   StringIOr   r   )r:   r<   r=   r>   Zparamr?   r   rS   rh  r   filepathr  Zbodyr   Zstatusmessager   Zbody_streamr&   r&   r'   r  T  s.    


r  )N)N)N)N)r!   )]r   sysrR   rU   r  r  rJ  r   r   r-  	functoolsr   Zsetuptools.externr   Zsetuptools.extern.six.movesr   r   r   r   r"   Zpkg_resourcesr	   r
   r   r   r   r   r   r   r   r   r   r   r   r   Z	distutilsr   Zdistutils.errorsr   Zfnmatchr   Zsetuptools.py27compatr   Zsetuptools.py33compatr   Zsetuptools.wheelr   typeZ__metaclass__r   rD   Irt   r   rE   r   r9   rN   __all__Z_SOCKET_TIMEOUTZ_tmplrk  version_inforc  r(   r   rA   r   rC   rT   r    rf   rm   ro   r|   r}   r   r   r   rB  rA  rv   rG  rK  rL  rX  rS  r   r   r  r/  rf  r  r&   r&   r&   r'   <module>   s   <
  	

!
 
$

!     
&/