/home/lnzliplg/public_html/setuptools.tar
dist.pyc000064400000121036151733473630006243 0ustar00�
�fc@sKdgZddlZddlZddlZddlZddlZddlZddlZddl	Zddl
Z
ddlmZddl
mZmZmZddlmZddlmZddlmZddlmZdd	lmZmZmZdd
lmZddlmZddl m!Z!dd
l"m#Z#ddl$Z$ddl%m&Z&e'd�e'd�d�Z(d�Z)d�Z*d�Z+e,e-fZ.d�Z/d�Z0d�Z1d�Z2d�Z3d�Z4d�Z5d�Z6d�Z7d�Z8d �Z9d!�Z:e!ej;j<�Z=de&e=fd"��YZ<d#fd$��YZ>dS(%tDistributioni����N(tdefaultdict(tDistutilsOptionErrortDistutilsPlatformErrortDistutilsSetupError(t
rfc822_escape(t
StrictVersion(tsix(t	packaging(tmaptfiltertfilterfalse(tRequire(twindows_support(t
get_unpatched(tparse_configurationi(tDistribution_parse_config_filess&setuptools.extern.packaging.specifierss#setuptools.extern.packaging.versioncCstjdt�t|�S(NsDo not call this function(twarningstwarntDeprecationWarningR(tcls((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyt_get_unpatched#scCs�|js|jrtd�S|jdk	sR|jdk	sRt|dd�dk	r\td�S|js�|js�|j	s�|j
s�|jr�td�Std�S(Ns2.1tpython_requiress1.2s1.1s1.0(tlong_description_content_typetprovides_extrasRt
maintainertNonetmaintainer_emailtgetattrtprovidestrequirest	obsoletestclassifierstdownload_url(tdist_md((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytget_metadata_version(s


cCst|�}|jd|�|jd|j��|jd|j��|jd|j��|jd|j��|td�kr�|jd|j��|jd|j��nyd#d$d%d&f}xd|D]\\}}t	||�}t
jr|j|�}n|d"k	r�|jd||f�q�q�W|jd|j��|jrl|jd|j�nx(|jj�D]}|jd|�q|Wt|j��}|jd|�dj|j��}	|	r�|jd|	�n|td�kr&xA|j�D]}
|jd|
�qWn|j|d|j��|j|d|j��|j|d|j��|j|d|j��|j|d|j��t|d�r�|jd|j�n|jr�|jd |j�n|jrx%|jD]}|jd!|�q�Wnd"S('s5Write the PKG-INFO format data to a file object.
    sMetadata-Version: %s
s	Name: %s
sVersion: %s
sSummary: %s
sHome-page: %s
s1.2sAuthor: %s
sAuthor-email: %s
tAuthortauthorsAuthor-emailtauthor_emailt
MaintainerRsMaintainer-emailRs%s: %s
sLicense: %s
sDownload-URL: %s
sProject-URL: %s, %s
sDescription: %s
t,s
Keywords: %s
s
Platform: %s
tPlatformt
ClassifiertRequirestProvidest	ObsoletesRsRequires-Python: %s
sDescription-Content-Type: %s
sProvides-Extra: %s
N(R$R%(sAuthor-emailR&(R'R(sMaintainer-emailR( R#twritetget_nametget_versiontget_descriptiontget_urlRtget_contacttget_contact_emailRRtPY2t
_encode_fieldRtget_licenseR!tproject_urlstitemsRtget_long_descriptiontjointget_keywordst
get_platformst_write_listtget_classifierstget_requirestget_providest
get_obsoletesthasattrRRR(tselftfiletversiontoptional_fieldstfieldtattrtattr_valtproject_urlt	long_desctkeywordstplatformtextra((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytwrite_pkg_file7s\					cCs>ttjj|d�ddd��}|j|�WdQXdS(s3Write the PKG-INFO file into the release tree.
    sPKG-INFOtwtencodingsUTF-8N(topentostpathR;RP(RDtbase_dirtpkg_info((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytwrite_pkg_infoscCsdy*tjjd|�}|js)t�Wn3ttttfk
r_td||f��nXdS(Nsx=s4%r must be importable 'module:attrs' string (got %r)(	t
pkg_resourcest
EntryPointtparsetextrastAssertionErrort	TypeErrort
ValueErrortAttributeErrorR(tdistRItvaluetep((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytcheck_importable�scCsYydj|�|kst�Wn3ttttfk
rTtd||f��nXdS(s*Verify that value is a string list or Nonets%%r must be a list of strings (got %r)N(R;R]R^R_R`R(RaRIRb((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytassert_string_list�s
cCs�|}t|||�xw|D]o}|j|�sItdd|��n|jd�\}}}|r||krtjjd||�qqWdS(s(Verify that namespace packages are valids1Distribution contains no modules or packages for snamespace package %rt.s^WARNING: %r is declared as a package namespace, but %r is not: please correct this in setup.pyN(Rfthas_contents_forRt
rpartitiont	distutilstlogR(RaRIRbtns_packagestnsptparenttseptchild((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyt	check_nsp�s
	cCsMy ttjt|j���Wn&tttfk
rHtd��nXdS(s+Verify that extras_require mapping is valids�'extras_require' must be a dictionary whose values are strings or lists of strings containing valid project/version requirement specifiers.N(	tlistt	itertoolststarmapt_check_extraR9R^R_R`R(RaRIRb((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytcheck_extras�s
 cCsW|jd�\}}}|r@tj|�r@td|��nttj|��dS(Nt:sInvalid environment marker: (t	partitionRYtinvalid_markerRRrtparse_requirements(ROtreqstnameRotmarker((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRu�scCs=t|�|kr9d}t|jd|d|���ndS(s)Verify that value is True, False, 0, or 1s0{attr!r} must be a boolean value (got {value!r})RIRbN(tboolRtformat(RaRIRbttmpl((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytassert_bool�scCsy;ttj|��t|ttf�r:td��nWn=ttfk
rz}d}t|j	d|d|���nXdS(s9Verify that install_requires is a valid requirements listsUnordered types are not allowedsm{attr!r} must be a string or list of strings containing valid project/version requirement specifiers; {error}RIterrorN(
RrRYRzt
isinstancetdicttsetR^R_RR(RaRIRbR�R�((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytcheck_requirements�scCsXytjj|�Wn=tjjk
rS}d}t|jd|d|���nXdS(s.Verify that value is a valid version specifiersF{attr!r} must be a string containing valid version specifiers; {error}RIR�N(Rt
specifierstSpecifierSettInvalidSpecifierRR(RaRIRbR�R�((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytcheck_specifier�s
cCs:ytjj|�Wntk
r5}t|��nXdS(s)Verify that entry_points map is parseableN(RYRZt	parse_mapR_R(RaRIRbte((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytcheck_entry_points�scCs%t|tj�s!td��ndS(Nstest_suite must be a string(R�Rtstring_typesR(RaRIRb((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytcheck_test_suite�scCs}t|t�rixW|j�D]B\}}t|t�s;Pnyt|�Wqtk
r]PqXqWdSnt|d��dS(s@Verify that value is a dictionary of package names to glob listsNsI must be a dictionary mapping package names to lists of wildcard patterns(R�R�R9tstrtiterR^R(RaRIRbtktv((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytcheck_package_data�s
	cCs=x6|D].}tjd|�stjjd|�qqWdS(Ns\w+(\.\w+)*s[WARNING: %r not a valid package name; please use only .-separated package names in setup.py(tretmatchRjRkR(RaRIRbtpkgname((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytcheck_packagess

	cBsLeZdZd"Zd�Zd"d�Zd�Zd�Ze	d��Z
d�Zd�Zd"e
d�Zd	�Zd
�Zd�Zd�Zd
�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z d�Z!d�Z"d�Z#d�Z$d�Z%d �Z&d!�Z'RS(#s�Distribution with support for features, tests, and package data

    This is an enhanced version of 'distutils.dist.Distribution' that
    effectively adds the following new optional keyword arguments to 'setup()':

     'install_requires' -- a string or sequence of strings specifying project
        versions that the distribution requires when installed, in the format
        used by 'pkg_resources.require()'.  They will be installed
        automatically when the package is installed.  If you wish to use
        packages that are not available in PyPI, or want to give your users an
        alternate download location, you can add a 'find_links' option to the
        '[easy_install]' section of your project's 'setup.cfg' file, and then
        setuptools will scan the listed web pages for links that satisfy the
        requirements.

     'extras_require' -- a dictionary mapping names of optional "extras" to the
        additional requirement(s) that using those extras incurs. For example,
        this::

            extras_require = dict(reST = ["docutils>=0.3", "reSTedit"])

        indicates that the distribution can optionally provide an extra
        capability called "reST", but it can only be used if docutils and
        reSTedit are installed.  If the user installs your package using
        EasyInstall and requests one of your extras, the corresponding
        additional requirements will be installed if needed.

     'features' **deprecated** -- a dictionary mapping option names to
        'setuptools.Feature'
        objects.  Features are a portion of the distribution that can be
        included or excluded based on user options, inter-feature dependencies,
        and availability on the current system.  Excluded features are omitted
        from all setup commands, including source and binary distributions, so
        you can create multiple distributions from the same source tree.
        Feature names should be valid Python identifiers, except that they may
        contain the '-' (minus) sign.  Features can be included or excluded
        via the command line options '--with-X' and '--without-X', where 'X' is
        the name of the feature.  Whether a feature is included by default, and
        whether you are allowed to control this from the command line, is
        determined by the Feature object.  See the 'Feature' class for more
        information.

     'test_suite' -- the name of a test suite to run for the 'test' command.
        If the user runs 'python setup.py test', the package will be installed,
        and the named test suite will be run.  The format is the same as
        would be used on a 'unittest.py' command line.  That is, it is the
        dotted name of an object to import and call to generate a test suite.

     'package_data' -- a dictionary mapping package names to lists of filenames
        or globs to use to find data files contained in the named packages.
        If the dictionary has filenames or globs listed under '""' (the empty
        string), those names will be searched for in every package, in addition
        to any names for the specific package.  Data files found using these
        names/globs will be installed along with the package, in the same
        location as the package.  Note that globs are allowed to reference
        the contents of non-package subdirectories, as long as you use '/' as
        a path separator.  (Globs are automatically converted to
        platform-specific paths at runtime.)

    In addition to these new keywords, this class also has several new methods
    for manipulating the distribution's contents.  For example, the 'include()'
    and 'exclude()' methods can be thought of as in-place add and subtract
    commands that add or remove packages, modules, extensions, and so on from
    the distribution.  They are used by the feature subsystem to configure the
    distribution for the included and excluded features.
    cCs�|sd|ksd|kr#dStjt|d��j�}tjjj|�}|dk	r�|jd�r�tj	t|d��|_
||_ndS(NR|RFsPKG-INFO(RYt	safe_nameR�tlowertworking_settby_keytgetRthas_metadatatsafe_versiont_versiont
_patched_dist(RDtattrstkeyRa((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytpatch_missing_pkg_infoVscCsUt|d�}|s!i|_n|p*i}d|ksEd|krRtj�ng|_i|_g|_|jdd�|_	|j
|�|jdi�|_|jdg�|_
|jdg�|_x0tjd�D]}t|�j|jd�q�Wtj||�t|jd|j�|j_|jd	�|j_t|jd
t��|j_t|jjtj�r�t|jj�|j_n|jjdk	rGyft jj!|jj�}t|�}|jj|krt"j#d|jj|f�||j_nWqGt jj$t%fk
rCt"j#d|jj�qGXn|j&�dS(
Ntpackage_datatfeaturestrequire_featurestsrc_rootR8tdependency_linkstsetup_requiressdistutils.setup_keywordsRRsNormalizing '%s' to '%s's�The version specified (%r) is an invalid version, this may not work as expected with newer versions of setuptools, pip, and PyPI. Please see PEP 440 for more details.('RCR�tFeaturetwarn_deprecatedR�R�t
dist_filestpopRR�R�R�R8R�R�RYtiter_entry_pointstvarst
setdefaultR|t
_Distributiont__init__RtmetadataRR�RR�RFtnumberstNumberR�RtVersionRRtInvalidVersionR^t_finalize_requires(RDR�thave_package_dataRctvertnormalized_version((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR�csP
			
	cCs�t|dd�r$|j|j_nt|dd�r�xI|jj�D]5}|jd�d}|rF|jjj|�qFqFWn|j	�|j
�dS(s�
        Set `metadata.python_requires` and fix environment markers
        in `install_requires` and `extras_require`.
        Rtextras_requireRwiN(RRRR�R�tkeystsplitRtaddt_convert_extras_requirementst"_move_install_requirements_markers(RDRO((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR��s
cCs�t|dd�pi}tt�|_xf|j�D]X\}}|j|x>tj|�D]-}|j|�}|j||j	|�q[Wq4WdS(s�
        Convert requirements in `extras_require` of the form
        `"extra": ["barbazquux; {marker}"]` to
        `"extra:{marker}": ["barbazquux"]`.
        R�N(
RRRRrt_tmp_extras_requireR9RYRzt_suffix_fortappend(RDt
spec_ext_reqstsectionR�trtsuffix((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR��scCs|jrdt|j�SdS(se
        For a requirement, return the 'extras_require' suffix for
        that requirement.
        RwRe(R}R�(treq((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR��scs�d�}t�dd�pd}ttj|��}t||�}t||�}ttt|���_	x/|D]'}�j
dt|j�j|�qsWt
�fd��j
j�D���_dS(sv
        Move requirements in `install_requires` that are using environment
        markers `extras_require`.
        cSs|jS(N(R}(R�((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyt
is_simple_req�stinstall_requiresRwc3sF|]<\}}|gt�j|�D]}t|�^q%fVqdS(N(R	t
_clean_reqR�(t.0R�R�R�(RD(s3/usr/lib/python2.7/site-packages/setuptools/dist.pys	<genexpr>�sN((RRRrRYRzR
RR	R�R�R�R}R�R�R9R�(RDR�tspec_inst_reqst	inst_reqstsimple_reqstcomplex_reqsR�((RDs3/usr/lib/python2.7/site-packages/setuptools/dist.pyR��s
	
%cCs
d|_|S(sP
        Given a Requirement, remove environment markers and return it.
        N(RR}(RDR�((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR��s	cCs7tj|d|�t||jd|�|j�dS(sYParses configuration files from various levels
        and loads configuration.

        t	filenamestignore_option_errorsN(R�tparse_config_filesRtcommand_optionsR�(RDR�R�((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR��scCs)tj|�}|jr%|j�n|S(s3Process features after parsing command line options(R�tparse_command_lineR�t_finalize_features(RDtresult((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR��s	
cCsd|jdd�S(s;Convert feature name to corresponding option attribute nametwith_t-t_(treplace(RDR|((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyt_feature_attrname�scCsUtjjtj|�d|jdt�}x$|D]}tjj|dt�q1W|S(sResolve pre-setup requirementst	installertreplace_conflictingR�(RYR�tresolveRztfetch_build_eggtTrueR�(RDRtresolved_distsRa((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytfetch_build_eggs�s			
cCs�tj|�|jr#|j�nxgtjd�D]V}t||jd�}|dk	r3|j	d|j
�|j�||j|�q3q3Wt|dd�r�g|jD]}t
jj|�^q�|_n	g|_dS(Nsdistutils.setup_keywordsR�tconvert_2to3_doctests(R�tfinalize_optionsR�t_set_global_opts_from_featuresRYR�RR|RtrequireR�tloadR�RTRUtabspath(RDRcRbtp((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR�s
	
 +cCs�tjjtjd�}tjj|�s�tj|�tj|�tjj|d�}t|d��.}|j	d�|j	d�|j	d�WdQXn|S(Ns.eggss
README.txtRQscThis directory contains eggs that were downloaded by setuptools to build, test, and run plug-ins.

sAThis directory caches those eggs to prevent repeated downloads.

s/However, it is safe to delete this directory.

(
RTRUR;tcurdirtexiststmkdirR
t	hide_fileRSR.(RDt
egg_cache_dirtreadme_txt_filenametf((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytget_egg_cache_dirs



cCsddlm}|jidgd6�}|jd�}|j�|jd�|jd�j�D��|jr�|j}d|kr�|dd|}nd|f|d<n|j�}||d	d
gd|dt	d
t
dddt
dt
dt	dt	dt
�
}|j�|j|�S(s Fetch an egg needed for buildingi����(teasy_installR�tscript_argscss-|]#\}}|dkr||fVqdS(t
find_linkst	site_dirst	index_urltoptimizetallow_hostsN(R�R�R�R�R�R�((R�R�R�((s3/usr/lib/python2.7/site-packages/setuptools/dist.pys	<genexpr>0s	R�itsetuptargstxtinstall_dirtexclude_scriptstalways_copytbuild_directoryteditabletupgradet
multi_versiont	no_reporttuserN(
tsetuptools.command.easy_installR�t	__class__tget_option_dicttcleartupdateR9R�R�R�tFalseRtensure_finalized(RDR�R�RatoptstlinksR�tcmd((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR�)s(
	

c	Csg}|jj�}x�|jj�D]�\}}|j|d�|j|�|jr%|j}d}d}|j	�s�||}}nd|dd||fd|dd||ff}|j
|�d||d|<q%q%W||j|_|_||_|_
dS(s;Add --with-X/--without-X options based on optional featuress
 (default)Reswith-sinclude swithout-sexclude N(tnegative_opttcopyR�R9t_set_featureRtvalidatetoptionaltdescriptiontinclude_by_defaulttextendtglobal_optionstfeature_optionstfeature_negopt(	RDtgotnoR|tfeaturetdescrtincdeftexcdeftnew((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR�Fs"
		
cCs�xj|jj�D]Y\}}|j|�}|sI|dkr|j�r|j|�|j|d�qqWxL|jj�D];\}}|j|�s}|j|�|j|d�q}q}WdS(s9Add/remove features and resolve dependencies between themiiN(R�R9tfeature_is_includedRRt
include_inRtexclude_from(RDR|Rtenabled((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR�as

cCs|||jkr|j|Stjd|�}xI|D]1}|jd|j�|j�|j|<}|SWtj||�SdS(s(Pluggable version of get_command_class()sdistutils.commandsR�N(tcmdclassRYR�R�R�R�R�tget_command_class(RDtcommandtepsRcR(((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR)rs
cCsXxHtjd�D]7}|j|jkr|j�}||j|j<qqWtj|�S(Nsdistutils.commands(RYR�R|R(R�R�tprint_commands(RDRcR(((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR,s
cCsXxHtjd�D]7}|j|jkr|j�}||j|j<qqWtj|�S(Nsdistutils.commands(RYR�R|R(R�R�tget_command_list(RDRcR(((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR-�s
cCst||j|�|�dS(sSet feature's inclusion statusN(tsetattrR�(RDR|tstatus((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR�scCst||j|��S(sAReturn 1 if feature is included, 0 if excluded, 'None' if unknown(RR�(RDR|((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR$�scCs`|j|�dkr8|j|j}t|d��n|j|j|�|j|d�dS(s)Request inclusion of feature named 'name'is2 is required, but was excluded or is not availableiN(R$R�RRR%R(RDR|R ((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytinclude_feature�scKsZxS|j�D]E\}}t|d|d�}|rB||�q
|j||�q
WdS(s�Add items to distribution that are named in keyword arguments

        For example, 'dist.exclude(py_modules=["x"])' would add 'x' to
        the distribution's 'py_modules' attribute, if it was not already
        there.

        Currently, this method only supports inclusion for attributes that are
        lists or tuples.  If you need to add support for adding to other
        attributes in this or a subclass, you can add an '_include_X' method,
        where 'X' is the name of the attribute.  The method will be called with
        the value passed to 'include()'.  So, 'dist.include(foo={"bar":"baz"})'
        will try to call 'dist._include_foo({"bar":"baz"})', which can then
        handle whatever special inclusion logic is needed.
        t	_include_N(R9RRt
_include_misc(RDR�R�R�tinclude((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR3�s

cCs�|d}|jrQg|jD](}||kr|j|�r|^q|_n|jr�g|jD](}||krd|j|�rd|^qd|_n|jr�g|jD].}|j|kr�|jj|�r�|^q�|_ndS(s9Remove packages, modules, and extensions in named packageRgN(tpackagest
startswitht
py_modulestext_modulesR|(RDtpackagetpfxR�((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytexclude_package�s
	.	.	cCsD|d}x3|j�D]%}||ks8|j|�rtSqWdS(s<Return true if 'exclude_package(package)' would do somethingRgN(titer_distribution_namesR5R�(RDR8R9R�((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRh�s
cCs�t|t�s(td||f��nyt||�}Wn!tk
r^td|��nX|dk	r�t|t�r�t|d��n8|r�t||g|D]}||kr�|^q��ndS(sAHandle 'exclude()' for list/tuple attrs without a special handlers(%s: setting must be a list or tuple (%r)s %s: No such distribution settings4: this setting cannot be changed via include/excludeN(R�tsequenceRRR`RR.(RDR|Rbtoldtitem((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyt
_exclude_misc�s
cCs�t|t�s(td||f��nyt||�}Wn!tk
r^td|��nX|dkr~t|||�n[t|t�s�t|d��n9g|D]}||kr�|^q�}t||||�dS(sAHandle 'include()' for list/tuple attrs without a special handlers%s: setting must be a list (%r)s %s: No such distribution settings4: this setting cannot be changed via include/excludeN(R�R<RRR`RR.(RDR|RbR=R>R#((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR2�s
%cKsZxS|j�D]E\}}t|d|d�}|rB||�q
|j||�q
WdS(sRemove items from distribution that are named in keyword arguments

        For example, 'dist.exclude(py_modules=["x"])' would remove 'x' from
        the distribution's 'py_modules' attribute.  Excluding packages uses
        the 'exclude_package()' method, so all of the package's contained
        packages, modules, and extensions are also excluded.

        Currently, this method only supports exclusion from attributes that are
        lists or tuples.  If you need to add support for excluding from other
        attributes in this or a subclass, you can add an '_exclude_X' method,
        where 'X' is the name of the attribute.  The method will be called with
        the value passed to 'exclude()'.  So, 'dist.exclude(foo={"bar":"baz"})'
        will try to call 'dist._exclude_foo({"bar":"baz"})', which can then
        handle whatever special exclusion logic is needed.
        t	_exclude_N(R9RRR?(RDR�R�R�texclude((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRAs

cCs?t|t�s%td|f��ntt|j|��dS(Ns.packages: setting must be a list or tuple (%r)(R�R<RRrR	R:(RDR4((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyt_exclude_packagessc
Cs�|jj|_|jj|_|d}|jd�}xS||kr�||\}}||=ddl}|j|t�|d*|d}q:Wtj|||�}|j	|�}	t
|	dd�r�d|f|j|�d<|dk	r�gSn|S(Nitaliasesi����itcommand_consumes_argumentsscommand lineR�(R	RRR
tshlexR�R�R�t_parse_command_optsR)RR(
RDtparserR�R*RCtsrctaliasREtnargst	cmd_class((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRFs"
cCs'i}x|jj�D]	\}}x�|j�D]�\}\}}|dkrSq/n|jdd�}|dkr�|j|�}|jj�}|jt|di��xZ|j�D](\}	}
|
|kr�|	}d}Pq�q�Wt	d��n|dkrd}n||j
|i�|<q/WqW|S(	shReturn a '{cmd: {opt:val}}' map of all command-line options

        Option names are all long, but do not include the leading '--', and
        contain dashes rather than underscores.  If the option doesn't take
        an argument (e.g. '--quiet'), the 'val' is 'None'.

        Note that options provided by config files are intentionally excluded.
        scommand lineR�R�iRsShouldn't be able to get hereiN(R�R9R�tget_command_objRRRRRR]R�(RDtdRRtoptRHtvaltcmdobjtneg_opttnegtpos((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytget_cmdline_options9s(
	ccs�x|jpdD]}|VqWx|jp.dD]}|Vq/Wx_|jpMdD]N}t|t�rr|\}}n	|j}|jd�r�|d }n|VqNWdS(s@Yield all packages, modules, and extension names in distributiontmodulei����N((((R4R6R7R�ttupleR|tendswith(RDtpkgRUtextR|t	buildinfo((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR;as			
c	Cs0ddl}tjs|jr.tj||�Sddl}t|j|j	�s_tj||�S|jj
j�dkr�tj||�S|jj
}|jj}|j
dkr�dp�d}|jj}|j	|jj�d|||�|_ztj||�SWd|j	|jj�||||�|_XdS(s�If there were any non-global "display-only" options
        (--help-commands or the metadata display options) on the command
        line, display the requested info and return true; else return
        false.
        i����Nsutf-8tutf8twin32s
(sutf-8R[(tsysRR5t
help_commandsR�thandle_display_optionstioR�tstdoutt
TextIOWrapperRRR�terrorsRNRtline_bufferingtdetach(RDtoption_orderR]R`RRRctnewlineRd((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR_ss$!N((t__name__t
__module__t__doc__RR�R�R�R�R�tstaticmethodR�R�R�R
R�R�R�R�R�R�R�R�R�R)R,R-RR$R0R3R:RhR?R2RARBRFRTR;R_(((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRsFB	
7													
															(	R�cBsYeZdZed��Zeeeddd�Zd�Zd�Z	d�Z
d�ZRS(	s�
    **deprecated** -- The `Feature` facility was never completely implemented
    or supported, `has reported issues
    <https://github.com/pypa/setuptools/issues/58>`_ and will be removed in
    a future version.

    A subset of the distribution that can be excluded if unneeded/wanted

    Features are created using these keyword arguments:

      'description' -- a short, human readable description of the feature, to
         be used in error messages, and option help messages.

      'standard' -- if true, the feature is included by default if it is
         available on the current system.  Otherwise, the feature is only
         included if requested via a command line '--with-X' option, or if
         another included feature requires it.  The default setting is 'False'.

      'available' -- if true, the feature is available for installation on the
         current system.  The default setting is 'True'.

      'optional' -- if true, the feature's inclusion can be controlled from the
         command line, using the '--with-X' or '--without-X' options.  If
         false, the feature's inclusion status is determined automatically,
         based on 'availabile', 'standard', and whether any other feature
         requires it.  The default setting is 'True'.

      'require_features' -- a string or sequence of strings naming features
         that should also be included if this feature is included.  Defaults to
         empty list.  May also contain 'Require' objects that should be
         added/removed from the distribution.

      'remove' -- a string or list of strings naming packages to be removed
         from the distribution if this feature is *not* included.  If the
         feature *is* included, this argument is ignored.  This argument exists
         to support removing features that "crosscut" a distribution, such as
         defining a 'tests' feature that removes all the 'tests' subpackages
         provided by other features.  The default for this argument is an empty
         list.  (Note: the named package(s) or modules must exist in the base
         distribution when the 'setup()' function is initially called.)

      other keywords -- any other keyword arguments are saved, and passed to
         the distribution's 'include()' and 'exclude()' methods when the
         feature is included or excluded, respectively.  So, for example, you
         could pass 'packages=["a","b"]' to cause packages 'a' and 'b' to be
         added or removed from the distribution as appropriate.

    A feature must include at least one 'requires', 'remove', or other
    keyword argument.  Otherwise, it can't affect the distribution in any way.
    Note also that you can subclass 'Feature' to create your own specialized
    feature types that modify the distribution in other ways when included or
    excluded.  See the docstrings for the various methods here for more detail.
    Aside from the methods, the only feature attributes that distributions look
    at are 'description' and 'optional'.
    cCs d}tj|tdd�dS(NsrFeatures are deprecated and will be removed in a future version. See https://github.com/pypa/setuptools/issues/65.t
stackleveli(RRR(tmsg((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR��sc
Ks
|j�||_||_||_||_t|ttf�rO|f}ng|D]}t|t�rV|^qV|_g|D]}t|t�s�|^q�}	|	r�|	|d<nt|t�r�|f}n||_	||_
|r|r|rtd��ndS(NR�sgFeature %s: must define 'require_features', 'remove', or at least one of 'packages', 'py_modules', etc.(R�Rtstandardt	availableRR�R�RR�tremoveR\R(
RDRRnRoRR�RpR\R�ter((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR��s$
				+(
		cCs|jo|jS(s+Should this feature be included by default?(RoRn(RD((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR�scCsT|jst|jd��n|j|j�x|jD]}|j|�q9WdS(sEnsure feature and its requirements are included in distribution

        You may override this in a subclass to perform additional operations on
        the distribution.  Note that this method may be called more than once
        per feature, and so should be idempotent.

        s3 is required, but is not available on this platformN(RoRRR3R\R�R0(RDRaR�((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR%�s		cCsA|j|j�|jr=x!|jD]}|j|�q#WndS(s2Ensure feature is excluded from distribution

        You may override this in a subclass to perform additional operations on
        the distribution.  This method will be called at most once per
        feature, and only after all included features have been asked to
        include themselves.
        N(RAR\RpR:(RDRaR>((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR&s		cCsFx?|jD]4}|j|�s
td|j||f��q
q
WdS(s�Verify that feature makes sense in context of distribution

        This method is called by the distribution just before it parses its
        command line.  It checks to ensure that the 'remove' attribute, if any,
        contains only valid package/module names that are present in the base
        distribution when 'setup()' is called.  You may override it in a
        subclass to perform any other required validation of the feature
        against a target distribution.
        sg%s wants to be able to remove %s, but the distribution doesn't contain any packages or modules under %sN(RpRhRR(RDRaR>((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRs
(((RhRiRjRkR�R
R�R�RR%R&R(((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR��s7				(?t__all__R�RTRR�t
distutils.logRjtdistutils.coret
distutils.cmdtdistutils.distRstcollectionsRtdistutils.errorsRRRtdistutils.utilRtdistutils.versionRtsetuptools.externRRtsetuptools.extern.six.movesR	R
Rtsetuptools.dependsRt
setuptoolsR
tsetuptools.monkeyRtsetuptools.configRRYt
py36compatRt
__import__RR#RPRXRVRrR<RdRfRqRvRuR�R�R�R�R�R�R�tcoreRR�R�(((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyt<module>s\	

			H			
											���dep_util.pyo000064400000001705151733473630007121 0ustar00�
�fc@sddlmZd�ZdS(i����(tnewer_groupcCs�t|�t|�kr'td��ng}g}xVtt|��D]B}t||||�rF|j||�|j||�qFqFW||fS(s�Walk both arguments in parallel, testing if each source group is newer
    than its corresponding target. Returns a pair of lists (sources_groups,
    targets) where sources is newer than target, according to the semantics
    of 'newer_group()'.
    s5'sources_group' and 'targets' must be the same length(tlent
ValueErrortrangeRtappend(tsources_groupsttargetst	n_sourcest	n_targetsti((s7/usr/lib/python2.7/site-packages/setuptools/dep_util.pytnewer_pairwise_groupsN(tdistutils.dep_utilRR
(((s7/usr/lib/python2.7/site-packages/setuptools/dep_util.pyt<module>spackage_index.pyo000064400000115477151733473630010112 0ustar00�
�fc@s~dZddlZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
ddlmZddl
mZmZmZmZddlZddlmZmZmZmZmZmZmZmZmZmZmZmZm Z ddlm!Z!ddl"m#Z#dd	l$m%Z%dd
l&m'Z'ddl(m)Z)ddl*m+Z+dd
l,m-Z-ej.d�Z/ej.dej0�Z1ej.d�Z2ej.dej0�j3Z4dj5�Z6ddddgZ7dZ8dZ9e9j:dej;d de�Z<d�Z=d�Z>d�Z?e@d�ZAe@d �ZBe@d!�ZCe@ee@d"�ZDe@d#�ZEd$�ZFej.d%ej0�ZGeFd&��ZHd'eIfd(��YZJd)eJfd*��YZKdefd+��YZLej.d,�jMZNd-�ZOd.�ZPdd/�ZQd0�ZRd1eIfd2��YZSd3ejTfd4��YZUejVjWd5�ZXeQe8�eX�ZXd6�ZYd7�ZZdS(8s#PyPI and direct package downloadingi����N(twraps(tsix(turllibthttp_clienttconfigparsertmap(
t
CHECKOUT_DISTtDistributiontBINARY_DISTtnormalize_pathtSOURCE_DISTtEnvironmenttfind_distributionst	safe_nametsafe_versiontto_filenametRequirementtDEVELOP_DISTtEGG_DIST(tssl_support(tlog(tDistutilsError(t	translate(tget_all_headers(tunescape(tWheels^egg=([-A-Za-z0-9_.+!]+)$shref\s*=\s*['"]?([^'"> ]+)s�<a href="([^"#]+)">([^<]+)</a>
\s+\(<a (?:title="MD5 hash"
\s+)href="[^?]+\?:action=show_md5&amp;digest=([0-9a-f]{32})">md5</a>\)s([-+.a-z0-9]{2,}):s.tar.gz .tar.bz2 .tar .zip .tgztPackageIndextdistros_for_urltparse_bdist_wininsttinterpret_distro_nameis<setuptools/{setuptools.__version__} Python-urllib/{py_major}tpy_majorit
setuptoolscCs<ytj|�SWn$tk
r7td|f��nXdS(Ns1Not a URL, existing file, or requirement spec: %r(Rtparset
ValueErrorR(tspec((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytparse_requirement_arg2s

cCs�|j�}d\}}}|jd�r�|jd�rL|d }d}q�|jdd�r~|dd!}|d }d}q�|jd	�r�|d
 }d}q�|jdd
�r�|dd!}|d
 }d}q�n|||fS(s=Return (base,pyversion) or (None,None) for possible .exe names.exes
.win32.exei����twin32s	.win32-pyi�i����i����s.win-amd64.exei�s	win-amd64s
.win-amd64-pyi��N(NNN(tlowertNonetendswitht
startswith(tnameR%tbasetpy_vertplat((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR;s$
	

	
	

c	Cs�tjj|�}|\}}}}}}tjj|jd�d�}|dkr�|dkr�tjj|jd�d�}nd|kr�|jdd�\}}n||fS(Nt/i����ssourceforge.nettdownloadi����t#i(RR turlparsetunquotetsplit(	turltpartstschemetservertpatht
parameterstquerytfragmentR*((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytegg_info_for_urlSs"ccs�t|�\}}xt|||�D]}|Vq%W|r�tj|�}|r�x1t||jd�|dt�D]}|VqqWq�ndS(sEYield egg or source distribution objects that might be found at a URLit
precedenceN(R;tdistros_for_locationtEGG_FRAGMENTtmatchRtgroupR(R3tmetadataR*R:tdistR?((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR^s	"c
CsA|jd�r|d }n|jd�rMd|krMtj|||�gS|jd�r�d|kr�t|�}|j�s�gStd|d|jd|jd	td
�gS|jd�r�t|�\}}}|dk	r�t
||||t|�Snx>tD]6}|j|�r|t
|� }t
|||�SqWgS(
s:Yield egg or source distribution objects based on basenames.egg.zipi����s.eggt-s.whltlocationtproject_nametversionR<is.exeN(R'Rt
from_locationRt
is_compatibleRERFRRR&RRt
EXTENSIONStlen(RDtbasenameRAtwheeltwin_baseR+tplatformtext((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR=ls.
		
cCs"tt|�tjj|�|�S(sEYield possible egg or source distribution objects based on a filename(R=R	tosR7RK(tfilenameRA((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytdistros_for_filename�sccs�|jd�}|r4td�|dD��r4dSxatdt|�d�D]F}t||dj|| �dj||�d|d|d|�VqNWdS(	s�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!
    RCcss!|]}tjd|�VqdS(s	py\d\.\d$N(treR?(t.0tp((s</usr/lib/python2.7/site-packages/setuptools/package_index.pys	<genexpr>�siNit
py_versionR<RN(R2tanytrangeRJRtjoin(RDRKRARVR<RNR4RU((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR�s! )ccs�t�}|j}|dkrSxmtjj|j|�D]}||�|Vq7Wn;x8|D]0}||�}||krZ||�|VqZqZWdS(sHList unique elements, preserving order. Remember all elements ever seen.N(tsettaddR&Rtmovestfilterfalset__contains__(titerabletkeytseentseen_addtelementtk((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytunique_everseen�s		


cst���fd��}|S(ss
    Wrap a function returning an iterable such that the resulting iterable
    only ever yields unique items.
    cst�||��S(N(Re(targstkwargs(tfunc(s</usr/lib/python2.7/site-packages/setuptools/package_index.pytwrapper�s(R(RhRi((Rhs</usr/lib/python2.7/site-packages/setuptools/package_index.pyt
unique_values�ss3<([^>]*\srel\s{0,10}=\s{0,10}['"]?([^'" >]+)[^>]*)>ccsx�tj|�D]�}|j�\}}tttj|j�jd���}d|ksgd|krx=t	j|�D])}t
jj|t
|jd���VqwWqqWxjd	D]b}|j|�}|dkr�t	j||�}|rt
jj|t
|jd���Vqq�q�WdS(
sEFind rel="homepage" and rel="download" links in `page`, yielding URLst,thomepageR.is
<th>Home Pages<th>Download URLi����N(s
<th>Home Pages<th>Download URL(tRELtfinditertgroupsRZRtstrtstripR%R2tHREFRR turljoint
htmldecodeR@tfindtsearch(R3tpageR?ttagtreltrelstpos((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytfind_external_links�s'.
tContentCheckercBs)eZdZd�Zd�Zd�ZRS(sP
    A null content checker that defines the interface for checking content
    cCsdS(s3
        Feed a block of data to the hash.
        N((tselftblock((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytfeed�scCstS(sC
        Check the hash. Return False if validation fails.
        (tTrue(R~((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytis_valid�scCsdS(su
        Call reporter with information about the checker (hash name)
        substituted into the template.
        N((R~treporterttemplate((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytreport�s(t__name__t
__module__t__doc__R�R�R�(((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR}�s		tHashCheckercBsJeZejd�Zd�Zed��Zd�Zd�Z	d�Z
RS(sK(?P<hash_name>sha1|sha224|sha384|sha256|sha512|md5)=(?P<expected>[a-f0-9]+)cCs(||_tj|�|_||_dS(N(t	hash_namethashlibtnewthashtexpected(R~R�R�((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt__init__
s	cCsRtjj|�d}|s#t�S|jj|�}|sBt�S||j��S(s5Construct a (possibly null) ContentChecker from a URLi����(RR R0R}tpatternRvt	groupdict(tclsR3R:R?((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytfrom_urlscCs|jj|�dS(N(R�tupdate(R~R((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR�scCs|jj�|jkS(N(R�t	hexdigestR�(R~((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR� scCs||j}||�S(N(R�(R~R�R�tmsg((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR�#s
(R�R�RStcompileR�R�tclassmethodR�R�R�R�(((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR�s				cBsveZdZdd%d&ed�Zed�Zed�Zed�Z	d�Z
d�Zd	�Zd
�Z
d&d�Zd�Zd&d
�Zd�Zd�Zd�Zd�Zd�Zeeed&d�Zeed�Zd�ZdZd�Zd�Zd&d�Zd�Zd�Zd�Zd�Z d�Z!e"ed��Z#d �Z$d!�Z%d"�Z&d#�Z'd$�Z(RS('s;A distribution index that scans web pages for download URLsshttps://pypi.python.org/simplet*cOs�tj|||�|d|jd� |_i|_i|_i|_tjdj	t
t|���j|_
g|_|o�tjo�|p�tj�}|r�tj|�|_ntjj|_dS(NR-t|(RR�R't	index_urltscanned_urlstfetched_urlst
package_pagesRSR�RYRRR?tallowstto_scanRtis_availabletfind_ca_bundlet
opener_fortopenerRtrequestturlopen(R~R�thostst	ca_bundlet
verify_sslRftkwtuse_ssl((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR�+s			'		cCsg||jkr|rdSt|j|<t|�sD|j|�dStt|��}|r�|j|�sodS|jd|�n|s�|s�||jkr�tt	|j
|��dS|j|�s�t|j|<dS|jd|�t|j|<d}|j|||�}|dkr!dSt|j|j<d|jjdd�j�kr`|j�dS|j}|j�}t|t�s�t|tjj�r�d}n|jjd	�p�d}|j|d
�}n|j�xHtj|�D]7}	tjj|t|	j d���}
|j!|
�q�W|j"|j#�rct$|dd�d
krc|j%||�}ndS(s<Evaluate a URL as a possible download, and maybe retrieve itNsFound link: %ss
Reading %ss<Download error on %s: %%s -- Some packages may not be found!thtmlscontent-typetslatin-1tcharsettignoreitcodei�(&R�R�t
URL_SCHEMEtprocess_filenametlistRturl_oktdebugR�RR[tinfotopen_urlR&R3theaderstgetR%tclosetreadt
isinstanceRpRterrort	HTTPErrort	get_paramtdecodeRrRnR RsRtR@tprocess_urlR(R�tgetattrt
process_index(R~R3tretrievetdiststtmpltfR*RwR�R?tlink((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR�@sP



!
		
$*cCs�tjj|�s&|jd|�dStjj|�r�|r�tjj|�}x9tj|�D]%}|jtjj||�t	�qaWnt
|�}|r�|jd|�tt
|j|��ndS(Ns
Not found: %ss	Found: %s(RPR7texiststwarntisdirtrealpathtlistdirR�RYR�RRR�R�RR[(R~tfntnestedR7titemR�((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR�ss&cCs�t|�}|o*|jd�j�dk}|sR|jtjj|�d�rVtSd}|rut||��n|j	||�dS(NitfilesN
Note: Bypassing %s (disallowed host; see http://bit.ly/2hrImnY for details).
(
R�R@R%R�RR R0R�RR�(R~R3tfataltstis_fileR�((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR��s!%cCsBttjj|�}d�|D�}ttj|j|��dS(Ncss@|]6}tj|�D] }|jd�r||fVqqdS(s	.egg-linkN(RPR�R'(RTR7tentry((s</usr/lib/python2.7/site-packages/setuptools/package_index.pys	<genexpr>�s(tfilterRPR7R�R�t	itertoolststarmapt
scan_egg_link(R~tsearch_pathtdirst	egg_links((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytscan_egg_links�s
c
Cs�ttjj||���(}ttdttj	|���}WdQXt
|�dkr[dS|\}}xQttjj||��D]4}tjj||�|_t
|_|j|�q�WdS(Ni(topenRPR7RYR�R�R&RRpRqRJRRDR
R<R[(R~R7R�t	raw_linestlinestegg_patht
setup_pathRB((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR��s'"	c
s�fd�}xWtj|�D]F}y,|tjj|t|jd����Wqtk
rdqXqW||�\}}|rxyt||�D]h}t	|�\}}	|j
d�r�|	r�|r�|d||f7}q��j|�n�j|�q�Wt
jd�|�SdSdS(s#Process the contents of a PyPI pagecs�|j�j�r�tttjj|t�j�jd���}t|�dkr�d|dkr�t	|d�}t
|d�}t�jj
|j�i�|<t|�t|�fSndS(NR-iR/ii(NN(R(R�R�RRR R1RJR2R
RR�R�t
setdefaultR%RR&(R�R4tpkgtver(R~(s</usr/lib/python2.7/site-packages/setuptools/package_index.pytscan�s+"is.pys
#egg=%s-%scSsd|jddd�S(Ns<a href="%s#md5=%s">%s</a>iii(R@(tm((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt<lambda>�R�R�N(RrRnRR RsRtR@R!R|R;R'tneed_version_infotscan_urltPYPI_MD5tsub(
R~R3RwR�R?R�R�tnew_urlR*tfrag((R~s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR��s$,

cCs|jd|�dS(NsPPage at %s links to .py file(s) without version info; an index scan is required.(tscan_all(R~R3((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR��scGsO|j|jkr;|r+|j||�n|jd�n|j|j�dS(Ns6Scanning index of all packages (this may take a while)(R�R�R�R�R�(R~R�Rf((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR��s
cCs�|j|j|jd�|jj|j�sN|j|j|jd�n|jj|j�ss|j|�nx3t|jj|jd��D]}|j|�q�WdS(NR-((	R�R�tunsafe_nameR�R�R`REtnot_found_in_indexR�(R~trequirementR3((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt
find_packages�s%cCsk|j�|j|�x8||jD])}||kr;|S|jd||�q%Wtt|�j||�S(Ns%s does not match %s(tprescanR�R`R�tsuperRtobtain(R~R�t	installerRB((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR��s

cCsi|j|jd|�|j�se|j�tj|�td|jjtj	j
|�f��ndS(s-
        checker is a ContentChecker
        sValidating %%s checksum for %ss7%s validation failed for %s; possible download problem?N(R�R�R�R�RPtunlinkRR�R)R7RK(R~tcheckerRQttfp((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt
check_hash�s

cCsrxk|D]c}|jdksJt|�sJ|jd�sJtt|��rZ|j|�q|jj|�qWdS(s;Add `urls` to the list that will be prescanned for searchessfile:N(R�R&R�R(R�RR�tappend(R~turlsR3((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytadd_find_linkss

cCs2|jr%tt|j|j��nd|_dS(s7Scan urls scheduled for prescanning (e.g. --find-links)N(R�R�RR�R&(R~((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR�s	cCsN||jr |jd}}n|jd}}|||j�|j�dS(Ns#Couldn't retrieve index page for %rs3Couldn't find index page for %r (maybe misspelled?)(R`R�R�R�R�(R~R�tmethR�((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR�!s

cCs�t|t�s�t|�}|r||j|jd�||�}t|�\}}|jd�rx|j|||�}n|Stj	j
|�r�|St|�}nt|j
||�dd�S(sLocate 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.
        is.pyRDN(R�RR�t
_download_urlR@R;R't	gen_setupRPR7R�R#R�tfetch_distributionR&(R~R"ttmpdirR5tfoundR*R:((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR.+sc	sF�jd|�i�d}d�����fd�}|rf�j��j|�||�}n|r�|dk	r�|||�}n|dkr��jdk	r��j�n||�}n|dkr�|r��j|�||�}n|dkr�jd�rdpd|�n#�jd|�|jd|j�SdS(	s|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.
        sSearching for %scs�|dkr�}nx�||jD]�}|jtkrn�rn|�kr#�jd|�d�|<q#q#n||ko�|jtkp��}|r#�j|j��}||_t	j
j|j�r�|Sq#q#WdS(Ns&Skipping development or system egg: %si(R&R`R<RR�R
R.RDtdownload_locationRPR7R�(treqtenvRBttesttloc(t
develop_okR~tskippedtsourceR(s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRues 	

	s:No local packages or working download links found for %s%ssa source distribution of R�sBest match: %sRDN(R�R&R�R�R�R�tcloneR(	R~R�Rt
force_scanRR
tlocal_indexRBRu((R
R~RRRs</usr/lib/python2.7/site-packages/setuptools/package_index.pyRMs0




cCs/|j||||�}|dk	r+|jSdS(s3Obtain 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(RR&RD(R~R�RRRRB((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytfetch�sc
Csptj|�}|rLgt||jd�d�D]}|jr1|^q1pOg}t|�dkrAtjj	|�}tjj
|�|kr�tjj||�}ddlm
}	|	||�s�tj||�|}q�nttjj|d�d��?}
|
jd|dj|djtjj|�df�WdQX|S|r`td||f��ntd	��dS(
Nii����(tsamefilessetup.pytwsIfrom setuptools import setup
setup(name=%r, version=%r, py_modules=[%r])
is�Can't unambiguously interpret project/version identifier %r; any dashes in the name or version should be escaped using underscores. %rspCan't process plain .py files without an '#egg=name-version' suffix to enable automatic setup script generation.(R>R?RR@R&RFRJRPR7RKtdirnameRYtsetuptools.command.easy_installRtshutiltcopy2R�twriteREtsplitextR(R~RQR:RR?tdR�RKtdstRR�((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR�s24!!i c
Cs�|jd|�d}zXtj|�}|j|�}t|tjj�rnt	d||j
|jf��n|j�}d}|j}d}d|kr�t
|d�}	ttt|	��}|j|||||�nt|d��}}
x`trO|j|�}|rK|j|�|
j|�|d7}|j|||||�q�Pq�W|j|||
�WdQX|SWd|r�|j�nXdS(	NsDownloading %ssCan't download %s: %s %sii����scontent-lengthsContent-Lengthtwbi(R�R&R�R�R�R�RR�R�RR�R�tdl_blocksizeRtmaxRtintt
reporthookR�R�R�R�RR�R�(R~R3RQtfpR�R�tblocknumtbstsizetsizesR�R((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt_download_to�s:		


cCsdS(N((R~R3RQR!tblksizeR#((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR�scCs�|jd�rt|�Syt||j�SWnsttjfk
r�}djg|jD]}t	|�^qX�}|r�|j
||�q�td||f��n�tj
jk
r�}|Stj
jk
r}|r�|j
||j�q�td||jf��n�tjk
rU}|r9|j
||j�q�td||jf��nNtjtj
fk
r�}|r�|j
||�q�td||f��nXdS(Nsfile:t s%s %ssDownload error for %s: %ss;%s returned a bad status line. The server might be down, %s(R(t
local_opentopen_with_authR�R!Rt
InvalidURLRYRfRpR�RRR�R�tURLErrortreasont
BadStatusLinetlinet
HTTPExceptiontsocket(R~R3twarningtvtargR�((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR��s6
+cCsHt|�\}}|rLx7d|krH|jdd�jdd�}qWnd}|jd�rn|d }ntjj||�}|dks�|jd	�r�|j||�S|d
ks�|jd�r�|j||�S|jd�r�|j	||�S|d
kr$t
jjt
j
j|�d�S|j|t�|j||�SdS(Ns..t.s\t_t__downloaded__s.egg.zipi����tsvnssvn+tgitsgit+shg+R�i(R;treplaceR'RPR7RYR(t
_download_svnt
_download_gitt_download_hgRR�turl2pathnameR R0R�R�t_attempt_download(R~R5R3RR)R:RQ((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRs$%
 cCs|j|t�dS(N(R�R�(R~R3((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR�8scCsK|j||�}d|jdd�j�krC|j|||�S|SdS(NR�scontent-typeR�(R%R�R%t_download_html(R~R3RQR�((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR>;scCs�t|�}xW|D]O}|j�rtjd|�r^|j�tj|�|j||�SPqqW|j�tj|�td|��dS(Ns <title>([^- ]+ - )?Revision \d+:sUnexpected HTML page found at (	R�RqRSRvR�RPR�R:R(R~R3R�RQR�R.((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR?Bs




cCsl|jdd�d}d}|j�jd�r;d|kr;tjj|�\}}}}}}	|r;|jd�r;d|d	kr;|d	jdd�\}}tjj|�\}
}|
r8d
|
kr�|
jd
d�\}}
d||
f}n
d|
}|}||||||	f}tjj|�}q8q;n|jd
||�t	j
d|||f�|S(NR/iiR�ssvn:t@s//R-it:s --username=%s --password=%ss --username=s'Doing subversion checkout from %s to %sssvn checkout%s -q %s %s(R2R%R(RR R0t	splitusert
urlunparseR�RPtsystem(R~R3RQtcredsR5tnetlocR7RUtqR�tauththosttusertpwR4((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR:Qs$!$&
cCs�tjj|�\}}}}}|jdd�d}|jdd�d}d}d|krz|jdd�\}}ntjj||||df�}||fS(Nt+ii����R/iR@R�(RR turlsplitR2R&trsplitt
urlunsplit(R3t
pop_prefixR5RFR7R9R�trev((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt_vcs_split_rev_from_urlfs!!cCs�|jdd�d}|j|dt�\}}|jd||�tjd||f�|dk	r�|jd|�tjd||f�n|S(	NR/iiRPsDoing git clone from %s to %ssgit clone --quiet %s %ssChecking out %ss"(cd %s && git checkout --quiet %s)(R2RRR�R�RPRDR&(R~R3RQRQ((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR;xs	cCs�|jdd�d}|j|dt�\}}|jd||�tjd||f�|dk	r�|jd|�tjd||f�n|S(	NR/iiRPsDoing hg clone from %s to %sshg clone --quiet %s %ssUpdating to %ss(cd %s && hg up -C -r %s -q)(R2RRR�R�RPRDR&(R~R3RQRQ((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR<�s	cGstj||�dS(N(RR�(R~R�Rf((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR��scGstj||�dS(N(RR�(R~R�Rf((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR��scGstj||�dS(N(RR�(R~R�Rf((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR��s(R�N()R�R�R�R&R�R�tFalseR�R�R�R�R�R�R�R�R�R�R�R�R�R�R.RRRRR%RR�RR�R>R?R:tstaticmethodRRR;R<R�R�R�(((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR(sL3
	
		+								
	#J
	)	$	#									s!&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?cCs|jd�}t|�S(Ni(R@R(R?twhat((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt
decode_entity�scCs
tt|�S(s'Decode HTML entities in the given text.(t
entity_subRV(ttext((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRt�scs�fd�}|S(Ncs��fd�}|S(Ncs?tj�}tj��z�||�SWdtj|�XdS(N(R0tgetdefaulttimeouttsetdefaulttimeout(RfRgtold_timeout(Rhttimeout(s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt_socket_timeout�s

((RhR](R\(Rhs</usr/lib/python2.7/site-packages/setuptools/package_index.pyR]�s((R\R]((R\s</usr/lib/python2.7/site-packages/setuptools/package_index.pytsocket_timeout�scCsItjj|�}|j�}tj|�}|j�}|jdd�S(sq
    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
    s
R�(RR R1tencodetbase64tencodestringR�R9(RHtauth_st
auth_bytest
encoded_bytestencoded((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt_encode_auth�s
t
CredentialcBs)eZdZd�Zd�Zd�ZRS(s:
    A username/password pair. Use like a namedtuple.
    cCs||_||_dS(N(tusernametpassword(R~RhRi((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR��s	ccs|jV|jVdS(N(RhRi(R~((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt__iter__�scCsdt|�S(Ns%(username)s:%(password)s(tvars(R~((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt__str__�s(R�R�R�R�RjRl(((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRg�s		t
PyPIConfigcBs2eZd�Zed��Zd�Zd�ZRS(cCsutjdddgd�}tjj||�tjjtjjd�d�}tjj	|�rq|j
|�ndS(s%
        Load from ~/.pypirc
        RhRit
repositoryR�t~s.pypircN(tdicttfromkeysRtRawConfigParserR�RPR7RYt
expanduserR�R�(R~tdefaultstrc((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR��s
!cCsMg|j�D]$}|j|d�j�r
|^q
}tt|j|��S(NRn(tsectionsR�RqRpRt_get_repo_cred(R~tsectiontsections_with_repositories((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytcreds_by_repository�s$cCsO|j|d�j�}|t|j|d�j�|j|d�j��fS(NRnRhRi(R�RqRg(R~Rxtrepo((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRw�scCs7x0|jj�D]\}}|j|�r|SqWdS(s�
        If the URL indicated appears to be a repository defined in this
        config, return the credential for that repository.
        N(RztitemsR((R~R3Rntcred((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytfind_credentials(R�R�R�tpropertyRzRwR~(((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRm�s			cCs�tjj|�\}}}}}}|jd�rEtjd��n|d	krltjj|�\}}	nd
}|s�t�j	|�}
|
r�t
|
�}|
j|f}tj
d|�q�n|r&dt|�}||	||||f}tjj|�}
tjj|
�}|jd|�ntjj|�}|jdt�||�}|r�tjj|j�\}}}}}}||kr�||	kr�||||||f}tjj|�|_q�n|S(s4Open a urllib2 request, handling HTTP authenticationRAsnonnumeric port: ''thttpthttpss*Authenticating as %s for %s (from .pypirc)sBasic t
Authorizations
User-Agent(R�R�N(RR R0R'RR*RBR&RmR~RpRhRR�RfRCR�tRequestt
add_headert
user_agentR3(R3R�R5RFR7tparamsR9R�RHRIR}R�R4R�R�R ts2th2tpath2tparam2tquery2tfrag2((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR)s6$'cCs|S(N((R3((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt
fix_sf_url?scCs�tjj|�\}}}}}}tjj|�}tjj|�rXtjj|�S|j	d�rPtjj
|�rPg}x�tj|�D]�}	tjj||	�}
|	dkr�t
|
d��}|j�}WdQXPntjj
|
�r�|	d7}	n|jdjd|	��q�Wd}
|
jd|d	d
j|��}d\}}nd\}}}idd6}tj|�}tjj|||||�S(s7Read a local path, with special support for directoriesR-s
index.htmltrNs<a href="{name}">{name}</a>R)sB<html><head><title>{url}</title></head><body>{files}</body></html>R3tfiless
i�tOKi�sPath not founds	Not founds	text/htmlscontent-type(i�R�(i�sPath not founds	Not found(RR R0R�R=RPR7tisfileR�R'R�R�RYR�R�R�tformatRtStringIOR�R�(R3R5R6R7tparamR9R�RQR�R�tfilepathR tbodyR�tstatustmessageR�tbody_stream((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR(Cs,$!
!
([R�tsysRPRSRR0R`R�R�t	functoolsRtsetuptools.externRtsetuptools.extern.six.movesRRRRRt
pkg_resourcesRRRR	R
RRR
RRRRRRt	distutilsRtdistutils.errorsRtfnmatchRtsetuptools.py27compatRtsetuptools.py33compatRtsetuptools.wheelRR�R>tIRrR�R?R�R2RIt__all__t_SOCKET_TIMEOUTt_tmplR�RFR�R#RR;R&RR=RRRReRjRmR|tobjectR}R�RR�RWRVRtR^RfRgRrRmR�R�R)R�R((((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt<module>sv"X							!"	
!��~			&.	py36compat.py000064400000005513151733473630007143 0ustar00import sys
from distutils.errors import DistutilsOptionError
from distutils.util import strtobool
from distutils.debug import DEBUG


class Distribution_parse_config_files:
    """
    Mix-in providing forward-compatibility for functionality to be
    included by default on Python 3.7.

    Do not edit the code in this class except to update functionality
    as implemented in distutils.
    """
    def parse_config_files(self, filenames=None):
        from configparser import ConfigParser

        # Ignore install directory options if we have a venv
        if sys.prefix != sys.base_prefix:
            ignore_options = [
                'install-base', 'install-platbase', 'install-lib',
                'install-platlib', 'install-purelib', 'install-headers',
                'install-scripts', 'install-data', 'prefix', 'exec-prefix',
                'home', 'user', 'root']
        else:
            ignore_options = []

        ignore_options = frozenset(ignore_options)

        if filenames is None:
            filenames = self.find_config_files()

        if DEBUG:
            self.announce("Distribution.parse_config_files():")

        parser = ConfigParser(interpolation=None)
        for filename in filenames:
            if DEBUG:
                self.announce("  reading %s" % filename)
            parser.read(filename)
            for section in parser.sections():
                options = parser.options(section)
                opt_dict = self.get_option_dict(section)

                for opt in options:
                    if opt != '__name__' and opt not in ignore_options:
                        val = parser.get(section,opt)
                        opt = opt.replace('-', '_')
                        opt_dict[opt] = (filename, val)

            # Make the ConfigParser forget everything (so we retain
            # the original filenames that options come from)
            parser.__init__()

        # If there was a "global" section in the config file, use it
        # to set Distribution options.

        if 'global' in self.command_options:
            for (opt, (src, val)) in self.command_options['global'].items():
                alias = self.negative_opt.get(opt)
                try:
                    if alias:
                        setattr(self, alias, not strtobool(val))
                    elif opt in ('verbose', 'dry_run'): # ugh!
                        setattr(self, opt, strtobool(val))
                    else:
                        setattr(self, opt, val)
                except ValueError as msg:
                    raise DistutilsOptionError(msg)


if sys.version_info < (3,):
    # Python 2 behavior is sufficient
    class Distribution_parse_config_files:
        pass


if False:
    # When updated behavior is available upstream,
    # disable override here.
    class Distribution_parse_config_files:
        pass
dist.pyo000064400000120744151733473630006264 0ustar00�
�fc@sKdgZddlZddlZddlZddlZddlZddlZddlZddl	Zddl
Z
ddlmZddl
mZmZmZddlmZddlmZddlmZddlmZdd	lmZmZmZdd
lmZddlmZddl m!Z!dd
l"m#Z#ddl$Z$ddl%m&Z&e'd�e'd�d�Z(d�Z)d�Z*d�Z+e,e-fZ.d�Z/d�Z0d�Z1d�Z2d�Z3d�Z4d�Z5d�Z6d�Z7d�Z8d �Z9d!�Z:e!ej;j<�Z=de&e=fd"��YZ<d#fd$��YZ>dS(%tDistributioni����N(tdefaultdict(tDistutilsOptionErrortDistutilsPlatformErrortDistutilsSetupError(t
rfc822_escape(t
StrictVersion(tsix(t	packaging(tmaptfiltertfilterfalse(tRequire(twindows_support(t
get_unpatched(tparse_configurationi(tDistribution_parse_config_filess&setuptools.extern.packaging.specifierss#setuptools.extern.packaging.versioncCstjdt�t|�S(NsDo not call this function(twarningstwarntDeprecationWarningR(tcls((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyt_get_unpatched#scCs�|js|jrtd�S|jdk	sR|jdk	sRt|dd�dk	r\td�S|js�|js�|j	s�|j
s�|jr�td�Std�S(Ns2.1tpython_requiress1.2s1.1s1.0(tlong_description_content_typetprovides_extrasRt
maintainertNonetmaintainer_emailtgetattrtprovidestrequirest	obsoletestclassifierstdownload_url(tdist_md((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytget_metadata_version(s


cCst|�}|jd|�|jd|j��|jd|j��|jd|j��|jd|j��|td�kr�|jd|j��|jd|j��nyd#d$d%d&f}xd|D]\\}}t	||�}t
jr|j|�}n|d"k	r�|jd||f�q�q�W|jd|j��|jrl|jd|j�nx(|jj�D]}|jd|�q|Wt|j��}|jd|�dj|j��}	|	r�|jd|	�n|td�kr&xA|j�D]}
|jd|
�qWn|j|d|j��|j|d|j��|j|d|j��|j|d|j��|j|d|j��t|d�r�|jd|j�n|jr�|jd |j�n|jrx%|jD]}|jd!|�q�Wnd"S('s5Write the PKG-INFO format data to a file object.
    sMetadata-Version: %s
s	Name: %s
sVersion: %s
sSummary: %s
sHome-page: %s
s1.2sAuthor: %s
sAuthor-email: %s
tAuthortauthorsAuthor-emailtauthor_emailt
MaintainerRsMaintainer-emailRs%s: %s
sLicense: %s
sDownload-URL: %s
sProject-URL: %s, %s
sDescription: %s
t,s
Keywords: %s
s
Platform: %s
tPlatformt
ClassifiertRequirestProvidest	ObsoletesRsRequires-Python: %s
sDescription-Content-Type: %s
sProvides-Extra: %s
N(R$R%(sAuthor-emailR&(R'R(sMaintainer-emailR( R#twritetget_nametget_versiontget_descriptiontget_urlRtget_contacttget_contact_emailRRtPY2t
_encode_fieldRtget_licenseR!tproject_urlstitemsRtget_long_descriptiontjointget_keywordst
get_platformst_write_listtget_classifierstget_requirestget_providest
get_obsoletesthasattrRRR(tselftfiletversiontoptional_fieldstfieldtattrtattr_valtproject_urlt	long_desctkeywordstplatformtextra((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytwrite_pkg_file7s\					cCs>ttjj|d�ddd��}|j|�WdQXdS(s3Write the PKG-INFO file into the release tree.
    sPKG-INFOtwtencodingsUTF-8N(topentostpathR;RP(RDtbase_dirtpkg_info((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytwrite_pkg_infoscCsTytjjd|�}Wn3ttttfk
rOtd||f��nXdS(Nsx=s4%r must be importable 'module:attrs' string (got %r)(t
pkg_resourcest
EntryPointtparset	TypeErrort
ValueErrortAttributeErrortAssertionErrorR(tdistRItvaluetep((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytcheck_importable�scCs>yWn3ttttfk
r9td||f��nXdS(s*Verify that value is a string list or Nones%%r must be a list of strings (got %r)N(R\R]R^R_R(R`RIRa((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytassert_string_list�s
cCs�|}t|||�xw|D]o}|j|�sItdd|��n|jd�\}}}|r||krtjjd||�qqWdS(s(Verify that namespace packages are valids1Distribution contains no modules or packages for snamespace package %rt.s^WARNING: %r is declared as a package namespace, but %r is not: please correct this in setup.pyN(Rdthas_contents_forRt
rpartitiont	distutilstlogR(R`RIRatns_packagestnsptparenttseptchild((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyt	check_nsp�s
	cCsMy ttjt|j���Wn&tttfk
rHtd��nXdS(s+Verify that extras_require mapping is valids�'extras_require' must be a dictionary whose values are strings or lists of strings containing valid project/version requirement specifiers.N(	tlistt	itertoolststarmapt_check_extraR9R\R]R^R(R`RIRa((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytcheck_extras�s
 cCsW|jd�\}}}|r@tj|�r@td|��nttj|��dS(Nt:sInvalid environment marker: (t	partitionRYtinvalid_markerRRptparse_requirements(ROtreqstnameRmtmarker((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRs�scCs=t|�|kr9d}t|jd|d|���ndS(s)Verify that value is True, False, 0, or 1s0{attr!r} must be a boolean value (got {value!r})RIRaN(tboolRtformat(R`RIRattmpl((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytassert_bool�scCsy;ttj|��t|ttf�r:td��nWn=ttfk
rz}d}t|j	d|d|���nXdS(s9Verify that install_requires is a valid requirements listsUnordered types are not allowedsm{attr!r} must be a string or list of strings containing valid project/version requirement specifiers; {error}RIterrorN(
RpRYRxt
isinstancetdicttsetR\R]RR}(R`RIRaR�R~((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytcheck_requirements�scCsXytjj|�Wn=tjjk
rS}d}t|jd|d|���nXdS(s.Verify that value is a valid version specifiersF{attr!r} must be a string containing valid version specifiers; {error}RIR�N(Rt
specifierstSpecifierSettInvalidSpecifierRR}(R`RIRaR�R~((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytcheck_specifier�s
cCs:ytjj|�Wntk
r5}t|��nXdS(s)Verify that entry_points map is parseableN(RYRZt	parse_mapR]R(R`RIRate((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytcheck_entry_points�scCs%t|tj�s!td��ndS(Nstest_suite must be a string(R�Rtstring_typesR(R`RIRa((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytcheck_test_suite�scCs}t|t�rixW|j�D]B\}}t|t�s;Pnyt|�Wqtk
r]PqXqWdSnt|d��dS(s@Verify that value is a dictionary of package names to glob listsNsI must be a dictionary mapping package names to lists of wildcard patterns(R�R�R9tstrtiterR\R(R`RIRatktv((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytcheck_package_data�s
	cCs=x6|D].}tjd|�stjjd|�qqWdS(Ns\w+(\.\w+)*s[WARNING: %r not a valid package name; please use only .-separated package names in setup.py(tretmatchRhRiR(R`RIRatpkgname((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytcheck_packagess

	cBsLeZdZd"Zd�Zd"d�Zd�Zd�Ze	d��Z
d�Zd�Zd"e
d�Zd	�Zd
�Zd�Zd�Zd
�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z d�Z!d�Z"d�Z#d�Z$d�Z%d �Z&d!�Z'RS(#s�Distribution with support for features, tests, and package data

    This is an enhanced version of 'distutils.dist.Distribution' that
    effectively adds the following new optional keyword arguments to 'setup()':

     'install_requires' -- a string or sequence of strings specifying project
        versions that the distribution requires when installed, in the format
        used by 'pkg_resources.require()'.  They will be installed
        automatically when the package is installed.  If you wish to use
        packages that are not available in PyPI, or want to give your users an
        alternate download location, you can add a 'find_links' option to the
        '[easy_install]' section of your project's 'setup.cfg' file, and then
        setuptools will scan the listed web pages for links that satisfy the
        requirements.

     'extras_require' -- a dictionary mapping names of optional "extras" to the
        additional requirement(s) that using those extras incurs. For example,
        this::

            extras_require = dict(reST = ["docutils>=0.3", "reSTedit"])

        indicates that the distribution can optionally provide an extra
        capability called "reST", but it can only be used if docutils and
        reSTedit are installed.  If the user installs your package using
        EasyInstall and requests one of your extras, the corresponding
        additional requirements will be installed if needed.

     'features' **deprecated** -- a dictionary mapping option names to
        'setuptools.Feature'
        objects.  Features are a portion of the distribution that can be
        included or excluded based on user options, inter-feature dependencies,
        and availability on the current system.  Excluded features are omitted
        from all setup commands, including source and binary distributions, so
        you can create multiple distributions from the same source tree.
        Feature names should be valid Python identifiers, except that they may
        contain the '-' (minus) sign.  Features can be included or excluded
        via the command line options '--with-X' and '--without-X', where 'X' is
        the name of the feature.  Whether a feature is included by default, and
        whether you are allowed to control this from the command line, is
        determined by the Feature object.  See the 'Feature' class for more
        information.

     'test_suite' -- the name of a test suite to run for the 'test' command.
        If the user runs 'python setup.py test', the package will be installed,
        and the named test suite will be run.  The format is the same as
        would be used on a 'unittest.py' command line.  That is, it is the
        dotted name of an object to import and call to generate a test suite.

     'package_data' -- a dictionary mapping package names to lists of filenames
        or globs to use to find data files contained in the named packages.
        If the dictionary has filenames or globs listed under '""' (the empty
        string), those names will be searched for in every package, in addition
        to any names for the specific package.  Data files found using these
        names/globs will be installed along with the package, in the same
        location as the package.  Note that globs are allowed to reference
        the contents of non-package subdirectories, as long as you use '/' as
        a path separator.  (Globs are automatically converted to
        platform-specific paths at runtime.)

    In addition to these new keywords, this class also has several new methods
    for manipulating the distribution's contents.  For example, the 'include()'
    and 'exclude()' methods can be thought of as in-place add and subtract
    commands that add or remove packages, modules, extensions, and so on from
    the distribution.  They are used by the feature subsystem to configure the
    distribution for the included and excluded features.
    cCs�|sd|ksd|kr#dStjt|d��j�}tjjj|�}|dk	r�|jd�r�tj	t|d��|_
||_ndS(NRzRFsPKG-INFO(RYt	safe_nameR�tlowertworking_settby_keytgetRthas_metadatatsafe_versiont_versiont
_patched_dist(RDtattrstkeyR`((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytpatch_missing_pkg_infoVscCsUt|d�}|s!i|_n|p*i}d|ksEd|krRtj�ng|_i|_g|_|jdd�|_	|j
|�|jdi�|_|jdg�|_
|jdg�|_x0tjd�D]}t|�j|jd�q�Wtj||�t|jd|j�|j_|jd	�|j_t|jd
t��|j_t|jjtj�r�t|jj�|j_n|jjdk	rGyft jj!|jj�}t|�}|jj|krt"j#d|jj|f�||j_nWqGt jj$t%fk
rCt"j#d|jj�qGXn|j&�dS(
Ntpackage_datatfeaturestrequire_featurestsrc_rootR8tdependency_linkstsetup_requiressdistutils.setup_keywordsRRsNormalizing '%s' to '%s's�The version specified (%r) is an invalid version, this may not work as expected with newer versions of setuptools, pip, and PyPI. Please see PEP 440 for more details.('RCR�tFeaturetwarn_deprecatedR�R�t
dist_filestpopRR�R�R�R8R�R�RYtiter_entry_pointstvarst
setdefaultRzt
_Distributiont__init__RtmetadataRR�RR�RFtnumberstNumberR�RtVersionRRtInvalidVersionR\t_finalize_requires(RDR�thave_package_dataRbtvertnormalized_version((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR�csP
			
	cCs�t|dd�r$|j|j_nt|dd�r�xI|jj�D]5}|jd�d}|rF|jjj|�qFqFWn|j	�|j
�dS(s�
        Set `metadata.python_requires` and fix environment markers
        in `install_requires` and `extras_require`.
        Rtextras_requireRuiN(RRRR�R�tkeystsplitRtaddt_convert_extras_requirementst"_move_install_requirements_markers(RDRO((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR��s
cCs�t|dd�pi}tt�|_xf|j�D]X\}}|j|x>tj|�D]-}|j|�}|j||j	|�q[Wq4WdS(s�
        Convert requirements in `extras_require` of the form
        `"extra": ["barbazquux; {marker}"]` to
        `"extra:{marker}": ["barbazquux"]`.
        R�N(
RRRRpt_tmp_extras_requireR9RYRxt_suffix_fortappend(RDt
spec_ext_reqstsectionR�trtsuffix((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR��scCs|jrdt|j�SdS(se
        For a requirement, return the 'extras_require' suffix for
        that requirement.
        Rut(R{R�(treq((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR��scs�d�}t�dd�pd}ttj|��}t||�}t||�}ttt|���_	x/|D]'}�j
dt|j�j|�qsWt
�fd��j
j�D���_dS(sv
        Move requirements in `install_requires` that are using environment
        markers `extras_require`.
        cSs|jS(N(R{(R�((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyt
is_simple_req�stinstall_requiresRuc3sF|]<\}}|gt�j|�D]}t|�^q%fVqdS(N(R	t
_clean_reqR�(t.0R�R�R�(RD(s3/usr/lib/python2.7/site-packages/setuptools/dist.pys	<genexpr>�sN((RRRpRYRxR
RR	R�R�R�R{R�R�R9R�(RDR�tspec_inst_reqst	inst_reqstsimple_reqstcomplex_reqsR�((RDs3/usr/lib/python2.7/site-packages/setuptools/dist.pyR��s
	
%cCs
d|_|S(sP
        Given a Requirement, remove environment markers and return it.
        N(RR{(RDR�((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR��s	cCs7tj|d|�t||jd|�|j�dS(sYParses configuration files from various levels
        and loads configuration.

        t	filenamestignore_option_errorsN(R�tparse_config_filesRtcommand_optionsR�(RDR�R�((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR��scCs)tj|�}|jr%|j�n|S(s3Process features after parsing command line options(R�tparse_command_lineR�t_finalize_features(RDtresult((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR��s	
cCsd|jdd�S(s;Convert feature name to corresponding option attribute nametwith_t-t_(treplace(RDRz((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyt_feature_attrname�scCsUtjjtj|�d|jdt�}x$|D]}tjj|dt�q1W|S(sResolve pre-setup requirementst	installertreplace_conflictingR�(RYR�tresolveRxtfetch_build_eggtTrueR�(RDRtresolved_distsR`((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytfetch_build_eggs�s			
cCs�tj|�|jr#|j�nxgtjd�D]V}t||jd�}|dk	r3|j	d|j
�|j�||j|�q3q3Wt|dd�r�g|jD]}t
jj|�^q�|_n	g|_dS(Nsdistutils.setup_keywordsR�tconvert_2to3_doctests(R�tfinalize_optionsR�t_set_global_opts_from_featuresRYR�RRzRtrequireR�tloadR�RTRUtabspath(RDRbRatp((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR�s
	
 +cCs�tjjtjd�}tjj|�s�tj|�tj|�tjj|d�}t|d��.}|j	d�|j	d�|j	d�WdQXn|S(Ns.eggss
README.txtRQscThis directory contains eggs that were downloaded by setuptools to build, test, and run plug-ins.

sAThis directory caches those eggs to prevent repeated downloads.

s/However, it is safe to delete this directory.

(
RTRUR;tcurdirtexiststmkdirR
t	hide_fileRSR.(RDt
egg_cache_dirtreadme_txt_filenametf((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytget_egg_cache_dirs



cCsddlm}|jidgd6�}|jd�}|j�|jd�|jd�j�D��|jr�|j}d|kr�|dd|}nd|f|d<n|j�}||d	d
gd|dt	d
t
dddt
dt
dt	dt	dt
�
}|j�|j|�S(s Fetch an egg needed for buildingi����(teasy_installR�tscript_argscss-|]#\}}|dkr||fVqdS(t
find_linkst	site_dirst	index_urltoptimizetallow_hostsN(R�R�R�R�R�R�((R�R�R�((s3/usr/lib/python2.7/site-packages/setuptools/dist.pys	<genexpr>0s	R�itsetuptargstxtinstall_dirtexclude_scriptstalways_copytbuild_directoryteditabletupgradet
multi_versiont	no_reporttuserN(
tsetuptools.command.easy_installR�t	__class__tget_option_dicttcleartupdateR9R�R�R�tFalseRtensure_finalized(RDR�R�R`toptstlinksR�tcmd((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR�)s(
	

c	Csg}|jj�}x�|jj�D]�\}}|j|d�|j|�|jr%|j}d}d}|j	�s�||}}nd|dd||fd|dd||ff}|j
|�d||d|<q%q%W||j|_|_||_|_
dS(s;Add --with-X/--without-X options based on optional featuress
 (default)R�swith-sinclude swithout-sexclude N(tnegative_opttcopyR�R9t_set_featureRtvalidatetoptionaltdescriptiontinclude_by_defaulttextendtglobal_optionstfeature_optionstfeature_negopt(	RDtgotnoRztfeaturetdescrtincdeftexcdeftnew((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR�Fs"
		
cCs�xj|jj�D]Y\}}|j|�}|sI|dkr|j�r|j|�|j|d�qqWxL|jj�D];\}}|j|�s}|j|�|j|d�q}q}WdS(s9Add/remove features and resolve dependencies between themiiN(R�R9tfeature_is_includedRRt
include_inRtexclude_from(RDRzRtenabled((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR�as

cCs|||jkr|j|Stjd|�}xI|D]1}|jd|j�|j�|j|<}|SWtj||�SdS(s(Pluggable version of get_command_class()sdistutils.commandsR�N(tcmdclassRYR�R�R�R�R�tget_command_class(RDtcommandtepsRbR'((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR(rs
cCsXxHtjd�D]7}|j|jkr|j�}||j|j<qqWtj|�S(Nsdistutils.commands(RYR�RzR'R�R�tprint_commands(RDRbR'((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR+s
cCsXxHtjd�D]7}|j|jkr|j�}||j|j<qqWtj|�S(Nsdistutils.commands(RYR�RzR'R�R�tget_command_list(RDRbR'((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR,�s
cCst||j|�|�dS(sSet feature's inclusion statusN(tsetattrR�(RDRztstatus((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR�scCst||j|��S(sAReturn 1 if feature is included, 0 if excluded, 'None' if unknown(RR�(RDRz((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR#�scCs`|j|�dkr8|j|j}t|d��n|j|j|�|j|d�dS(s)Request inclusion of feature named 'name'is2 is required, but was excluded or is not availableiN(R#R�RRR$R(RDRzR((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytinclude_feature�scKsZxS|j�D]E\}}t|d|d�}|rB||�q
|j||�q
WdS(s�Add items to distribution that are named in keyword arguments

        For example, 'dist.exclude(py_modules=["x"])' would add 'x' to
        the distribution's 'py_modules' attribute, if it was not already
        there.

        Currently, this method only supports inclusion for attributes that are
        lists or tuples.  If you need to add support for adding to other
        attributes in this or a subclass, you can add an '_include_X' method,
        where 'X' is the name of the attribute.  The method will be called with
        the value passed to 'include()'.  So, 'dist.include(foo={"bar":"baz"})'
        will try to call 'dist._include_foo({"bar":"baz"})', which can then
        handle whatever special inclusion logic is needed.
        t	_include_N(R9RRt
_include_misc(RDR�R�R�tinclude((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR2�s

cCs�|d}|jrQg|jD](}||kr|j|�r|^q|_n|jr�g|jD](}||krd|j|�rd|^qd|_n|jr�g|jD].}|j|kr�|jj|�r�|^q�|_ndS(s9Remove packages, modules, and extensions in named packageReN(tpackagest
startswitht
py_modulestext_modulesRz(RDtpackagetpfxR�((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytexclude_package�s
	.	.	cCsD|d}x3|j�D]%}||ks8|j|�rtSqWdS(s<Return true if 'exclude_package(package)' would do somethingReN(titer_distribution_namesR4R�(RDR7R8R�((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRf�s
cCs�t|t�s(td||f��nyt||�}Wn!tk
r^td|��nX|dk	r�t|t�r�t|d��n8|r�t||g|D]}||kr�|^q��ndS(sAHandle 'exclude()' for list/tuple attrs without a special handlers(%s: setting must be a list or tuple (%r)s %s: No such distribution settings4: this setting cannot be changed via include/excludeN(R�tsequenceRRR^RR-(RDRzRatoldtitem((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyt
_exclude_misc�s
cCs�t|t�s(td||f��nyt||�}Wn!tk
r^td|��nX|dkr~t|||�n[t|t�s�t|d��n9g|D]}||kr�|^q�}t||||�dS(sAHandle 'include()' for list/tuple attrs without a special handlers%s: setting must be a list (%r)s %s: No such distribution settings4: this setting cannot be changed via include/excludeN(R�R;RRR^RR-(RDRzRaR<R=R"((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR1�s
%cKsZxS|j�D]E\}}t|d|d�}|rB||�q
|j||�q
WdS(sRemove items from distribution that are named in keyword arguments

        For example, 'dist.exclude(py_modules=["x"])' would remove 'x' from
        the distribution's 'py_modules' attribute.  Excluding packages uses
        the 'exclude_package()' method, so all of the package's contained
        packages, modules, and extensions are also excluded.

        Currently, this method only supports exclusion from attributes that are
        lists or tuples.  If you need to add support for excluding from other
        attributes in this or a subclass, you can add an '_exclude_X' method,
        where 'X' is the name of the attribute.  The method will be called with
        the value passed to 'exclude()'.  So, 'dist.exclude(foo={"bar":"baz"})'
        will try to call 'dist._exclude_foo({"bar":"baz"})', which can then
        handle whatever special exclusion logic is needed.
        t	_exclude_N(R9RRR>(RDR�R�R�texclude((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR@s

cCs?t|t�s%td|f��ntt|j|��dS(Ns.packages: setting must be a list or tuple (%r)(R�R;RRpR	R9(RDR3((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyt_exclude_packagessc
Cs�|jj|_|jj|_|d}|jd�}xS||kr�||\}}||=ddl}|j|t�|d*|d}q:Wtj|||�}|j	|�}	t
|	dd�r�d|f|j|�d<|dk	r�gSn|S(Nitaliasesi����itcommand_consumes_argumentsscommand lineR�(RRRR	tshlexR�R�R�t_parse_command_optsR(RR(
RDtparserR�R)RBtsrctaliasRDtnargst	cmd_class((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyREs"
cCs'i}x|jj�D]	\}}x�|j�D]�\}\}}|dkrSq/n|jdd�}|dkr�|j|�}|jj�}|jt|di��xZ|j�D](\}	}
|
|kr�|	}d}Pq�q�Wt	d��n|dkrd}n||j
|i�|<q/WqW|S(	shReturn a '{cmd: {opt:val}}' map of all command-line options

        Option names are all long, but do not include the leading '--', and
        contain dashes rather than underscores.  If the option doesn't take
        an argument (e.g. '--quiet'), the 'val' is 'None'.

        Note that options provided by config files are intentionally excluded.
        scommand lineR�R�iRsShouldn't be able to get hereiN(R�R9R�tget_command_objRRRRRR_R�(RDtdRRtoptRGtvaltcmdobjtneg_opttnegtpos((s3/usr/lib/python2.7/site-packages/setuptools/dist.pytget_cmdline_options9s(
	ccs�x|jpdD]}|VqWx|jp.dD]}|Vq/Wx_|jpMdD]N}t|t�rr|\}}n	|j}|jd�r�|d }n|VqNWdS(s@Yield all packages, modules, and extension names in distributiontmodulei����N((((R3R5R6R�ttupleRztendswith(RDtpkgRTtextRzt	buildinfo((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR:as			
c	Cs0ddl}tjs|jr.tj||�Sddl}t|j|j	�s_tj||�S|jj
j�dkr�tj||�S|jj
}|jj}|j
dkr�dp�d}|jj}|j	|jj�d|||�|_ztj||�SWd|j	|jj�||||�|_XdS(s�If there were any non-global "display-only" options
        (--help-commands or the metadata display options) on the command
        line, display the requested info and return true; else return
        false.
        i����Nsutf-8tutf8twin32s
(sutf-8RZ(tsysRR5t
help_commandsR�thandle_display_optionstioR�tstdoutt
TextIOWrapperRRR�terrorsRNRtline_bufferingtdetach(RDtoption_orderR\R_RRRbtnewlineRc((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR^ss$!N((t__name__t
__module__t__doc__RR�R�R�R�R�tstaticmethodR�R�R�RR�R�R�R�R�R�R�R�R�R(R+R,RR#R/R2R9RfR>R1R@RARERSR:R^(((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRsFB	
7													
															(	R�cBsYeZdZed��Zeeeddd�Zd�Zd�Z	d�Z
d�ZRS(	s�
    **deprecated** -- The `Feature` facility was never completely implemented
    or supported, `has reported issues
    <https://github.com/pypa/setuptools/issues/58>`_ and will be removed in
    a future version.

    A subset of the distribution that can be excluded if unneeded/wanted

    Features are created using these keyword arguments:

      'description' -- a short, human readable description of the feature, to
         be used in error messages, and option help messages.

      'standard' -- if true, the feature is included by default if it is
         available on the current system.  Otherwise, the feature is only
         included if requested via a command line '--with-X' option, or if
         another included feature requires it.  The default setting is 'False'.

      'available' -- if true, the feature is available for installation on the
         current system.  The default setting is 'True'.

      'optional' -- if true, the feature's inclusion can be controlled from the
         command line, using the '--with-X' or '--without-X' options.  If
         false, the feature's inclusion status is determined automatically,
         based on 'availabile', 'standard', and whether any other feature
         requires it.  The default setting is 'True'.

      'require_features' -- a string or sequence of strings naming features
         that should also be included if this feature is included.  Defaults to
         empty list.  May also contain 'Require' objects that should be
         added/removed from the distribution.

      'remove' -- a string or list of strings naming packages to be removed
         from the distribution if this feature is *not* included.  If the
         feature *is* included, this argument is ignored.  This argument exists
         to support removing features that "crosscut" a distribution, such as
         defining a 'tests' feature that removes all the 'tests' subpackages
         provided by other features.  The default for this argument is an empty
         list.  (Note: the named package(s) or modules must exist in the base
         distribution when the 'setup()' function is initially called.)

      other keywords -- any other keyword arguments are saved, and passed to
         the distribution's 'include()' and 'exclude()' methods when the
         feature is included or excluded, respectively.  So, for example, you
         could pass 'packages=["a","b"]' to cause packages 'a' and 'b' to be
         added or removed from the distribution as appropriate.

    A feature must include at least one 'requires', 'remove', or other
    keyword argument.  Otherwise, it can't affect the distribution in any way.
    Note also that you can subclass 'Feature' to create your own specialized
    feature types that modify the distribution in other ways when included or
    excluded.  See the docstrings for the various methods here for more detail.
    Aside from the methods, the only feature attributes that distributions look
    at are 'description' and 'optional'.
    cCs d}tj|tdd�dS(NsrFeatures are deprecated and will be removed in a future version. See https://github.com/pypa/setuptools/issues/65.t
stackleveli(RRR(tmsg((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR��sc
Ks
|j�||_||_||_||_t|ttf�rO|f}ng|D]}t|t�rV|^qV|_g|D]}t|t�s�|^q�}	|	r�|	|d<nt|t�r�|f}n||_	||_
|r|r|rtd��ndS(NR�sgFeature %s: must define 'require_features', 'remove', or at least one of 'packages', 'py_modules', etc.(R�Rtstandardt	availableRR�R�RR�tremovetextrasR(
RDRRmRnRR�RoRpR�ter((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR��s$
				+(
		cCs|jo|jS(s+Should this feature be included by default?(RnRm(RD((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR�scCsT|jst|jd��n|j|j�x|jD]}|j|�q9WdS(sEnsure feature and its requirements are included in distribution

        You may override this in a subclass to perform additional operations on
        the distribution.  Note that this method may be called more than once
        per feature, and so should be idempotent.

        s3 is required, but is not available on this platformN(RnRRR2RpR�R/(RDR`R�((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR$�s		cCsA|j|j�|jr=x!|jD]}|j|�q#WndS(s2Ensure feature is excluded from distribution

        You may override this in a subclass to perform additional operations on
        the distribution.  This method will be called at most once per
        feature, and only after all included features have been asked to
        include themselves.
        N(R@RpRoR9(RDR`R=((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR%s		cCsFx?|jD]4}|j|�s
td|j||f��q
q
WdS(s�Verify that feature makes sense in context of distribution

        This method is called by the distribution just before it parses its
        command line.  It checks to ensure that the 'remove' attribute, if any,
        contains only valid package/module names that are present in the base
        distribution when 'setup()' is called.  You may override it in a
        subclass to perform any other required validation of the feature
        against a target distribution.
        sg%s wants to be able to remove %s, but the distribution doesn't contain any packages or modules under %sN(RoRfRR(RDR`R=((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyRs
(((RgRhRiRjR�RR�R�RR$R%R(((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyR��s7				(?t__all__R�RTRR�t
distutils.logRhtdistutils.coret
distutils.cmdtdistutils.distRqtcollectionsRtdistutils.errorsRRRtdistutils.utilRtdistutils.versionRtsetuptools.externRRtsetuptools.extern.six.movesR	R
Rtsetuptools.dependsRt
setuptoolsR
tsetuptools.monkeyRtsetuptools.configRRYt
py36compatRt
__import__RR#RPRXRURpR;RcRdRoRtRsRR�R�R�R�R�R�tcoreRR�R�(((s3/usr/lib/python2.7/site-packages/setuptools/dist.pyt<module>s\	

			H			
											���depends.py000064400000013315151733473630006557 0ustar00import sys
import imp
import marshal
from distutils.version import StrictVersion
from imp import PKG_DIRECTORY, PY_COMPILED, PY_SOURCE, PY_FROZEN

from .py33compat import Bytecode


__all__ = [
    'Require', 'find_module', 'get_module_constant', 'extract_constant'
]


class Require:
    """A prerequisite to building or installing a distribution"""

    def __init__(self, name, requested_version, module, homepage='',
            attribute=None, format=None):

        if format is None and requested_version is not None:
            format = StrictVersion

        if format is not None:
            requested_version = format(requested_version)
            if attribute is None:
                attribute = '__version__'

        self.__dict__.update(locals())
        del self.self

    def full_name(self):
        """Return full package/distribution name, w/version"""
        if self.requested_version is not None:
            return '%s-%s' % (self.name, self.requested_version)
        return self.name

    def version_ok(self, version):
        """Is 'version' sufficiently up-to-date?"""
        return self.attribute is None or self.format is None or \
            str(version) != "unknown" and version >= self.requested_version

    def get_version(self, paths=None, default="unknown"):
        """Get version number of installed module, 'None', or 'default'

        Search 'paths' for module.  If not found, return 'None'.  If found,
        return the extracted version attribute, or 'default' if no version
        attribute was specified, or the value cannot be determined without
        importing the module.  The version is formatted according to the
        requirement's version format (if any), unless it is 'None' or the
        supplied 'default'.
        """

        if self.attribute is None:
            try:
                f, p, i = find_module(self.module, paths)
                if f:
                    f.close()
                return default
            except ImportError:
                return None

        v = get_module_constant(self.module, self.attribute, default, paths)

        if v is not None and v is not default and self.format is not None:
            return self.format(v)

        return v

    def is_present(self, paths=None):
        """Return true if dependency is present on 'paths'"""
        return self.get_version(paths) is not None

    def is_current(self, paths=None):
        """Return true if dependency is present and up-to-date on 'paths'"""
        version = self.get_version(paths)
        if version is None:
            return False
        return self.version_ok(version)


def find_module(module, paths=None):
    """Just like 'imp.find_module()', but with package support"""

    parts = module.split('.')

    while parts:
        part = parts.pop(0)
        f, path, (suffix, mode, kind) = info = imp.find_module(part, paths)

        if kind == PKG_DIRECTORY:
            parts = parts or ['__init__']
            paths = [path]

        elif parts:
            raise ImportError("Can't find %r in %s" % (parts, module))

    return info


def get_module_constant(module, symbol, default=-1, paths=None):
    """Find 'module' by searching 'paths', and extract 'symbol'

    Return 'None' if 'module' does not exist on 'paths', or it does not define
    'symbol'.  If the module defines 'symbol' as a constant, return the
    constant.  Otherwise, return 'default'."""

    try:
        f, path, (suffix, mode, kind) = find_module(module, paths)
    except ImportError:
        # Module doesn't exist
        return None

    try:
        if kind == PY_COMPILED:
            f.read(8)  # skip magic & date
            code = marshal.load(f)
        elif kind == PY_FROZEN:
            code = imp.get_frozen_object(module)
        elif kind == PY_SOURCE:
            code = compile(f.read(), path, 'exec')
        else:
            # Not something we can parse; we'll have to import it.  :(
            if module not in sys.modules:
                imp.load_module(module, f, path, (suffix, mode, kind))
            return getattr(sys.modules[module], symbol, None)

    finally:
        if f:
            f.close()

    return extract_constant(code, symbol, default)


def extract_constant(code, symbol, default=-1):
    """Extract the constant value of 'symbol' from 'code'

    If the name 'symbol' is bound to a constant value by the Python code
    object 'code', return that value.  If 'symbol' is bound to an expression,
    return 'default'.  Otherwise, return 'None'.

    Return value is based on the first assignment to 'symbol'.  'symbol' must
    be a global, or at least a non-"fast" local in the code block.  That is,
    only 'STORE_NAME' and 'STORE_GLOBAL' opcodes are checked, and 'symbol'
    must be present in 'code.co_names'.
    """
    if symbol not in code.co_names:
        # name's not there, can't possibly be an assignment
        return None

    name_idx = list(code.co_names).index(symbol)

    STORE_NAME = 90
    STORE_GLOBAL = 97
    LOAD_CONST = 100

    const = default

    for byte_code in Bytecode(code):
        op = byte_code.opcode
        arg = byte_code.arg

        if op == LOAD_CONST:
            const = code.co_consts[arg]
        elif arg == name_idx and (op == STORE_NAME or op == STORE_GLOBAL):
            return const
        else:
            const = default


def _update_globals():
    """
    Patch the globals to remove the objects not available on some platforms.

    XXX it'd be better to test assertions about bytecode instead.
    """

    if not sys.platform.startswith('java') and sys.platform != 'cli':
        return
    incompatible = 'extract_constant', 'get_module_constant'
    for name in incompatible:
        del globals()[name]
        __all__.remove(name)


_update_globals()
package_index.py000064400000116331151733473630007721 0ustar00"""PyPI and direct package downloading"""
import sys
import os
import re
import shutil
import socket
import base64
import hashlib
import itertools
from functools import wraps

from setuptools.extern import six
from setuptools.extern.six.moves import urllib, http_client, configparser, map

import setuptools
from pkg_resources import (
    CHECKOUT_DIST, Distribution, BINARY_DIST, normalize_path, SOURCE_DIST,
    Environment, find_distributions, safe_name, safe_version,
    to_filename, Requirement, DEVELOP_DIST, EGG_DIST,
)
from setuptools import ssl_support
from distutils import log
from distutils.errors import DistutilsError
from fnmatch import translate
from setuptools.py27compat import get_all_headers
from setuptools.py33compat import unescape
from setuptools.wheel import Wheel

EGG_FRAGMENT = re.compile(r'^egg=([-A-Za-z0-9_.+!]+)$')
HREF = re.compile("""href\\s*=\\s*['"]?([^'"> ]+)""", re.I)
# this is here to fix emacs' cruddy broken syntax highlighting
PYPI_MD5 = re.compile(
    '<a href="([^"#]+)">([^<]+)</a>\n\\s+\\(<a (?:title="MD5 hash"\n\\s+)'
    'href="[^?]+\\?:action=show_md5&amp;digest=([0-9a-f]{32})">md5</a>\\)'
)
URL_SCHEME = re.compile('([-+.a-z0-9]{2,}):', re.I).match
EXTENSIONS = ".tar.gz .tar.bz2 .tar .zip .tgz".split()

__all__ = [
    'PackageIndex', 'distros_for_url', 'parse_bdist_wininst',
    'interpret_distro_name',
]

_SOCKET_TIMEOUT = 15

_tmpl = "setuptools/{setuptools.__version__} Python-urllib/{py_major}"
user_agent = _tmpl.format(py_major=sys.version[:3], setuptools=setuptools)


def parse_requirement_arg(spec):
    try:
        return Requirement.parse(spec)
    except ValueError:
        raise DistutilsError(
            "Not a URL, existing file, or requirement spec: %r" % (spec,)
        )


def parse_bdist_wininst(name):
    """Return (base,pyversion) or (None,None) for possible .exe name"""

    lower = name.lower()
    base, py_ver, plat = None, None, None

    if lower.endswith('.exe'):
        if lower.endswith('.win32.exe'):
            base = name[:-10]
            plat = 'win32'
        elif lower.startswith('.win32-py', -16):
            py_ver = name[-7:-4]
            base = name[:-16]
            plat = 'win32'
        elif lower.endswith('.win-amd64.exe'):
            base = name[:-14]
            plat = 'win-amd64'
        elif lower.startswith('.win-amd64-py', -20):
            py_ver = name[-7:-4]
            base = name[:-20]
            plat = 'win-amd64'
    return base, py_ver, plat


def egg_info_for_url(url):
    parts = urllib.parse.urlparse(url)
    scheme, server, path, parameters, query, fragment = parts
    base = urllib.parse.unquote(path.split('/')[-1])
    if server == 'sourceforge.net' and base == 'download':  # XXX Yuck
        base = urllib.parse.unquote(path.split('/')[-2])
    if '#' in base:
        base, fragment = base.split('#', 1)
    return base, fragment


def distros_for_url(url, metadata=None):
    """Yield egg or source distribution objects that might be found at a URL"""
    base, fragment = egg_info_for_url(url)
    for dist in distros_for_location(url, base, metadata):
        yield dist
    if fragment:
        match = EGG_FRAGMENT.match(fragment)
        if match:
            for dist in interpret_distro_name(
                url, match.group(1), metadata, precedence=CHECKOUT_DIST
            ):
                yield dist


def distros_for_location(location, basename, metadata=None):
    """Yield egg or source distribution objects based on basename"""
    if basename.endswith('.egg.zip'):
        basename = basename[:-4]  # strip the .zip
    if basename.endswith('.egg') and '-' in basename:
        # only one, unambiguous interpretation
        return [Distribution.from_location(location, basename, metadata)]
    if basename.endswith('.whl') and '-' in basename:
        wheel = Wheel(basename)
        if not wheel.is_compatible():
            return []
        return [Distribution(
            location=location,
            project_name=wheel.project_name,
            version=wheel.version,
            # Increase priority over eggs.
            precedence=EGG_DIST + 1,
        )]
    if basename.endswith('.exe'):
        win_base, py_ver, platform = parse_bdist_wininst(basename)
        if win_base is not None:
            return interpret_distro_name(
                location, win_base, metadata, py_ver, BINARY_DIST, platform
            )
    # Try source distro extensions (.zip, .tgz, etc.)
    #
    for ext in EXTENSIONS:
        if basename.endswith(ext):
            basename = basename[:-len(ext)]
            return interpret_distro_name(location, basename, metadata)
    return []  # no extension matched


def distros_for_filename(filename, metadata=None):
    """Yield possible egg or source distribution objects based on a filename"""
    return distros_for_location(
        normalize_path(filename), os.path.basename(filename), metadata
    )


def interpret_distro_name(
        location, basename, metadata, py_version=None, precedence=SOURCE_DIST,
        platform=None
):
    """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!
    """
    # Generate alternative interpretations of a source distro name
    # Because some packages are ambiguous as to name/versions split
    # e.g. "adns-python-1.1.0", "egenix-mx-commercial", etc.
    # So, we generate each possible interepretation (e.g. "adns, python-1.1.0"
    # "adns-python, 1.1.0", and "adns-python-1.1.0, no version").  In practice,
    # the spurious interpretations should be ignored, because in the event
    # there's also an "adns" package, the spurious "python-1.1.0" version will
    # compare lower than any numeric version number, and is therefore unlikely
    # to match a request for it.  It's still a potential problem, though, and
    # in the long run PyPI and the distutils should go for "safe" names and
    # versions in distribution archive names (sdist and bdist).

    parts = basename.split('-')
    if not py_version and any(re.match(r'py\d\.\d$', p) for p in parts[2:]):
        # it is a bdist_dumb, not an sdist -- bail out
        return

    for p in range(1, len(parts) + 1):
        yield Distribution(
            location, metadata, '-'.join(parts[:p]), '-'.join(parts[p:]),
            py_version=py_version, precedence=precedence,
            platform=platform
        )


# From Python 2.7 docs
def unique_everseen(iterable, key=None):
    "List unique elements, preserving order. Remember all elements ever seen."
    # unique_everseen('AAAABBBCCDAABBB') --> A B C D
    # unique_everseen('ABBCcAD', str.lower) --> A B C D
    seen = set()
    seen_add = seen.add
    if key is None:
        for element in six.moves.filterfalse(seen.__contains__, iterable):
            seen_add(element)
            yield element
    else:
        for element in iterable:
            k = key(element)
            if k not in seen:
                seen_add(k)
                yield element


def unique_values(func):
    """
    Wrap a function returning an iterable such that the resulting iterable
    only ever yields unique items.
    """

    @wraps(func)
    def wrapper(*args, **kwargs):
        return unique_everseen(func(*args, **kwargs))

    return wrapper


REL = re.compile(r"""<([^>]*\srel\s{0,10}=\s{0,10}['"]?([^'" >]+)[^>]*)>""", re.I)
# this line is here to fix emacs' cruddy broken syntax highlighting


@unique_values
def find_external_links(url, page):
    """Find rel="homepage" and rel="download" links in `page`, yielding URLs"""

    for match in REL.finditer(page):
        tag, rel = match.groups()
        rels = set(map(str.strip, rel.lower().split(',')))
        if 'homepage' in rels or 'download' in rels:
            for match in HREF.finditer(tag):
                yield urllib.parse.urljoin(url, htmldecode(match.group(1)))

    for tag in ("<th>Home Page", "<th>Download URL"):
        pos = page.find(tag)
        if pos != -1:
            match = HREF.search(page, pos)
            if match:
                yield urllib.parse.urljoin(url, htmldecode(match.group(1)))


class ContentChecker(object):
    """
    A null content checker that defines the interface for checking content
    """

    def feed(self, block):
        """
        Feed a block of data to the hash.
        """
        return

    def is_valid(self):
        """
        Check the hash. Return False if validation fails.
        """
        return True

    def report(self, reporter, template):
        """
        Call reporter with information about the checker (hash name)
        substituted into the template.
        """
        return


class HashChecker(ContentChecker):
    pattern = re.compile(
        r'(?P<hash_name>sha1|sha224|sha384|sha256|sha512|md5)='
        r'(?P<expected>[a-f0-9]+)'
    )

    def __init__(self, hash_name, expected):
        self.hash_name = hash_name
        self.hash = hashlib.new(hash_name)
        self.expected = expected

    @classmethod
    def from_url(cls, url):
        "Construct a (possibly null) ContentChecker from a URL"
        fragment = urllib.parse.urlparse(url)[-1]
        if not fragment:
            return ContentChecker()
        match = cls.pattern.search(fragment)
        if not match:
            return ContentChecker()
        return cls(**match.groupdict())

    def feed(self, block):
        self.hash.update(block)

    def is_valid(self):
        return self.hash.hexdigest() == self.expected

    def report(self, reporter, template):
        msg = template % self.hash_name
        return reporter(msg)


class PackageIndex(Environment):
    """A distribution index that scans web pages for download URLs"""

    def __init__(
            self, index_url="https://pypi.python.org/simple", hosts=('*',),
            ca_bundle=None, verify_ssl=True, *args, **kw
    ):
        Environment.__init__(self, *args, **kw)
        self.index_url = index_url + "/" [:not index_url.endswith('/')]
        self.scanned_urls = {}
        self.fetched_urls = {}
        self.package_pages = {}
        self.allows = re.compile('|'.join(map(translate, hosts))).match
        self.to_scan = []
        use_ssl = (
            verify_ssl
            and ssl_support.is_available
            and (ca_bundle or ssl_support.find_ca_bundle())
        )
        if use_ssl:
            self.opener = ssl_support.opener_for(ca_bundle)
        else:
            self.opener = urllib.request.urlopen

    def process_url(self, url, retrieve=False):
        """Evaluate a URL as a possible download, and maybe retrieve it"""
        if url in self.scanned_urls and not retrieve:
            return
        self.scanned_urls[url] = True
        if not URL_SCHEME(url):
            self.process_filename(url)
            return
        else:
            dists = list(distros_for_url(url))
            if dists:
                if not self.url_ok(url):
                    return
                self.debug("Found link: %s", url)

        if dists or not retrieve or url in self.fetched_urls:
            list(map(self.add, dists))
            return  # don't need the actual page

        if not self.url_ok(url):
            self.fetched_urls[url] = True
            return

        self.info("Reading %s", url)
        self.fetched_urls[url] = True  # prevent multiple fetch attempts
        tmpl = "Download error on %s: %%s -- Some packages may not be found!"
        f = self.open_url(url, tmpl % url)
        if f is None:
            return
        self.fetched_urls[f.url] = True
        if 'html' not in f.headers.get('content-type', '').lower():
            f.close()  # not html, we can't process it
            return

        base = f.url  # handle redirects
        page = f.read()
        if not isinstance(page, str):
            # In Python 3 and got bytes but want str.
            if isinstance(f, urllib.error.HTTPError):
                # Errors have no charset, assume latin1:
                charset = 'latin-1'
            else:
                charset = f.headers.get_param('charset') or 'latin-1'
            page = page.decode(charset, "ignore")
        f.close()
        for match in HREF.finditer(page):
            link = urllib.parse.urljoin(base, htmldecode(match.group(1)))
            self.process_url(link)
        if url.startswith(self.index_url) and getattr(f, 'code', None) != 404:
            page = self.process_index(url, page)

    def process_filename(self, fn, nested=False):
        # process filenames or directories
        if not os.path.exists(fn):
            self.warn("Not found: %s", fn)
            return

        if os.path.isdir(fn) and not nested:
            path = os.path.realpath(fn)
            for item in os.listdir(path):
                self.process_filename(os.path.join(path, item), True)

        dists = distros_for_filename(fn)
        if dists:
            self.debug("Found: %s", fn)
            list(map(self.add, dists))

    def url_ok(self, url, fatal=False):
        s = URL_SCHEME(url)
        is_file = s and s.group(1).lower() == 'file'
        if is_file or self.allows(urllib.parse.urlparse(url)[1]):
            return True
        msg = (
            "\nNote: Bypassing %s (disallowed host; see "
            "http://bit.ly/2hrImnY for details).\n")
        if fatal:
            raise DistutilsError(msg % url)
        else:
            self.warn(msg, url)

    def scan_egg_links(self, search_path):
        dirs = filter(os.path.isdir, search_path)
        egg_links = (
            (path, entry)
            for path in dirs
            for entry in os.listdir(path)
            if entry.endswith('.egg-link')
        )
        list(itertools.starmap(self.scan_egg_link, egg_links))

    def scan_egg_link(self, path, entry):
        with open(os.path.join(path, entry)) as raw_lines:
            # filter non-empty lines
            lines = list(filter(None, map(str.strip, raw_lines)))

        if len(lines) != 2:
            # format is not recognized; punt
            return

        egg_path, setup_path = lines

        for dist in find_distributions(os.path.join(path, egg_path)):
            dist.location = os.path.join(path, *lines)
            dist.precedence = SOURCE_DIST
            self.add(dist)

    def process_index(self, url, page):
        """Process the contents of a PyPI page"""

        def scan(link):
            # Process a URL to see if it's for a package page
            if link.startswith(self.index_url):
                parts = list(map(
                    urllib.parse.unquote, link[len(self.index_url):].split('/')
                ))
                if len(parts) == 2 and '#' not in parts[1]:
                    # it's a package page, sanitize and index it
                    pkg = safe_name(parts[0])
                    ver = safe_version(parts[1])
                    self.package_pages.setdefault(pkg.lower(), {})[link] = True
                    return to_filename(pkg), to_filename(ver)
            return None, None

        # process an index page into the package-page index
        for match in HREF.finditer(page):
            try:
                scan(urllib.parse.urljoin(url, htmldecode(match.group(1))))
            except ValueError:
                pass

        pkg, ver = scan(url)  # ensure this page is in the page index
        if pkg:
            # process individual package page
            for new_url in find_external_links(url, page):
                # Process the found URL
                base, frag = egg_info_for_url(new_url)
                if base.endswith('.py') and not frag:
                    if ver:
                        new_url += '#egg=%s-%s' % (pkg, ver)
                    else:
                        self.need_version_info(url)
                self.scan_url(new_url)

            return PYPI_MD5.sub(
                lambda m: '<a href="%s#md5=%s">%s</a>' % m.group(1, 3, 2), page
            )
        else:
            return ""  # no sense double-scanning non-package pages

    def need_version_info(self, url):
        self.scan_all(
            "Page at %s links to .py file(s) without version info; an index "
            "scan is required.", url
        )

    def scan_all(self, msg=None, *args):
        if self.index_url not in self.fetched_urls:
            if msg:
                self.warn(msg, *args)
            self.info(
                "Scanning index of all packages (this may take a while)"
            )
        self.scan_url(self.index_url)

    def find_packages(self, requirement):
        self.scan_url(self.index_url + requirement.unsafe_name + '/')

        if not self.package_pages.get(requirement.key):
            # Fall back to safe version of the name
            self.scan_url(self.index_url + requirement.project_name + '/')

        if not self.package_pages.get(requirement.key):
            # We couldn't find the target package, so search the index page too
            self.not_found_in_index(requirement)

        for url in list(self.package_pages.get(requirement.key, ())):
            # scan each page that might be related to the desired package
            self.scan_url(url)

    def obtain(self, requirement, installer=None):
        self.prescan()
        self.find_packages(requirement)
        for dist in self[requirement.key]:
            if dist in requirement:
                return dist
            self.debug("%s does not match %s", requirement, dist)
        return super(PackageIndex, self).obtain(requirement, installer)

    def check_hash(self, checker, filename, tfp):
        """
        checker is a ContentChecker
        """
        checker.report(
            self.debug,
            "Validating %%s checksum for %s" % filename)
        if not checker.is_valid():
            tfp.close()
            os.unlink(filename)
            raise DistutilsError(
                "%s validation failed for %s; "
                "possible download problem?"
                % (checker.hash.name, os.path.basename(filename))
            )

    def add_find_links(self, urls):
        """Add `urls` to the list that will be prescanned for searches"""
        for url in urls:
            if (
                self.to_scan is None  # if we have already "gone online"
                or not URL_SCHEME(url)  # or it's a local file/directory
                or url.startswith('file:')
                or list(distros_for_url(url))  # or a direct package link
            ):
                # then go ahead and process it now
                self.scan_url(url)
            else:
                # otherwise, defer retrieval till later
                self.to_scan.append(url)

    def prescan(self):
        """Scan urls scheduled for prescanning (e.g. --find-links)"""
        if self.to_scan:
            list(map(self.scan_url, self.to_scan))
        self.to_scan = None  # from now on, go ahead and process immediately

    def not_found_in_index(self, requirement):
        if self[requirement.key]:  # we've seen at least one distro
            meth, msg = self.info, "Couldn't retrieve index page for %r"
        else:  # no distros seen for this name, might be misspelled
            meth, msg = (
                self.warn,
                "Couldn't find index page for %r (maybe misspelled?)")
        meth(msg, requirement.unsafe_name)
        self.scan_all()

    def download(self, spec, tmpdir):
        """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.
        """
        if not isinstance(spec, Requirement):
            scheme = URL_SCHEME(spec)
            if scheme:
                # It's a url, download it to tmpdir
                found = self._download_url(scheme.group(1), spec, tmpdir)
                base, fragment = egg_info_for_url(spec)
                if base.endswith('.py'):
                    found = self.gen_setup(found, fragment, tmpdir)
                return found
            elif os.path.exists(spec):
                # Existing file or directory, just return it
                return spec
            else:
                spec = parse_requirement_arg(spec)
        return getattr(self.fetch_distribution(spec, tmpdir), 'location', None)

    def fetch_distribution(
            self, requirement, tmpdir, force_scan=False, source=False,
            develop_ok=False, local_index=None):
        """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.
        """
        # process a Requirement
        self.info("Searching for %s", requirement)
        skipped = {}
        dist = None

        def find(req, env=None):
            if env is None:
                env = self
            # Find a matching distribution; may be called more than once

            for dist in env[req.key]:

                if dist.precedence == DEVELOP_DIST and not develop_ok:
                    if dist not in skipped:
                        self.warn(
                            "Skipping development or system egg: %s", dist,
                        )
                        skipped[dist] = 1
                    continue

                test = (
                    dist in req
                    and (dist.precedence <= SOURCE_DIST or not source)
                )
                if test:
                    loc = self.download(dist.location, tmpdir)
                    dist.download_location = loc
                    if os.path.exists(dist.download_location):
                        return dist

        if force_scan:
            self.prescan()
            self.find_packages(requirement)
            dist = find(requirement)

        if not dist and local_index is not None:
            dist = find(requirement, local_index)

        if dist is None:
            if self.to_scan is not None:
                self.prescan()
            dist = find(requirement)

        if dist is None and not force_scan:
            self.find_packages(requirement)
            dist = find(requirement)

        if dist is None:
            self.warn(
                "No local packages or working download links found for %s%s",
                (source and "a source distribution of " or ""),
                requirement,
            )
        else:
            self.info("Best match: %s", dist)
            return dist.clone(location=dist.download_location)

    def fetch(self, requirement, tmpdir, force_scan=False, source=False):
        """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.
        """
        dist = self.fetch_distribution(requirement, tmpdir, force_scan, source)
        if dist is not None:
            return dist.location
        return None

    def gen_setup(self, filename, fragment, tmpdir):
        match = EGG_FRAGMENT.match(fragment)
        dists = match and [
            d for d in
            interpret_distro_name(filename, match.group(1), None) if d.version
        ] or []

        if len(dists) == 1:  # unambiguous ``#egg`` fragment
            basename = os.path.basename(filename)

            # Make sure the file has been downloaded to the temp dir.
            if os.path.dirname(filename) != tmpdir:
                dst = os.path.join(tmpdir, basename)
                from setuptools.command.easy_install import samefile
                if not samefile(filename, dst):
                    shutil.copy2(filename, dst)
                    filename = dst

            with open(os.path.join(tmpdir, 'setup.py'), 'w') as file:
                file.write(
                    "from setuptools import setup\n"
                    "setup(name=%r, version=%r, py_modules=[%r])\n"
                    % (
                        dists[0].project_name, dists[0].version,
                        os.path.splitext(basename)[0]
                    )
                )
            return filename

        elif match:
            raise DistutilsError(
                "Can't unambiguously interpret project/version identifier %r; "
                "any dashes in the name or version should be escaped using "
                "underscores. %r" % (fragment, dists)
            )
        else:
            raise DistutilsError(
                "Can't process plain .py files without an '#egg=name-version'"
                " suffix to enable automatic setup script generation."
            )

    dl_blocksize = 8192

    def _download_to(self, url, filename):
        self.info("Downloading %s", url)
        # Download the file
        fp = None
        try:
            checker = HashChecker.from_url(url)
            fp = self.open_url(url)
            if isinstance(fp, urllib.error.HTTPError):
                raise DistutilsError(
                    "Can't download %s: %s %s" % (url, fp.code, fp.msg)
                )
            headers = fp.info()
            blocknum = 0
            bs = self.dl_blocksize
            size = -1
            if "content-length" in headers:
                # Some servers return multiple Content-Length headers :(
                sizes = get_all_headers(headers, 'Content-Length')
                size = max(map(int, sizes))
                self.reporthook(url, filename, blocknum, bs, size)
            with open(filename, 'wb') as tfp:
                while True:
                    block = fp.read(bs)
                    if block:
                        checker.feed(block)
                        tfp.write(block)
                        blocknum += 1
                        self.reporthook(url, filename, blocknum, bs, size)
                    else:
                        break
                self.check_hash(checker, filename, tfp)
            return headers
        finally:
            if fp:
                fp.close()

    def reporthook(self, url, filename, blocknum, blksize, size):
        pass  # no-op

    def open_url(self, url, warning=None):
        if url.startswith('file:'):
            return local_open(url)
        try:
            return open_with_auth(url, self.opener)
        except (ValueError, http_client.InvalidURL) as v:
            msg = ' '.join([str(arg) for arg in v.args])
            if warning:
                self.warn(warning, msg)
            else:
                raise DistutilsError('%s %s' % (url, msg))
        except urllib.error.HTTPError as v:
            return v
        except urllib.error.URLError as v:
            if warning:
                self.warn(warning, v.reason)
            else:
                raise DistutilsError("Download error for %s: %s"
                                     % (url, v.reason))
        except http_client.BadStatusLine as v:
            if warning:
                self.warn(warning, v.line)
            else:
                raise DistutilsError(
                    '%s returned a bad status line. The server might be '
                    'down, %s' %
                    (url, v.line)
                )
        except (http_client.HTTPException, socket.error) as v:
            if warning:
                self.warn(warning, v)
            else:
                raise DistutilsError("Download error for %s: %s"
                                     % (url, v))

    def _download_url(self, scheme, url, tmpdir):
        # Determine download filename
        #
        name, fragment = egg_info_for_url(url)
        if name:
            while '..' in name:
                name = name.replace('..', '.').replace('\\', '_')
        else:
            name = "__downloaded__"  # default if URL has no path contents

        if name.endswith('.egg.zip'):
            name = name[:-4]  # strip the extra .zip before download

        filename = os.path.join(tmpdir, name)

        # Download the file
        #
        if scheme == 'svn' or scheme.startswith('svn+'):
            return self._download_svn(url, filename)
        elif scheme == 'git' or scheme.startswith('git+'):
            return self._download_git(url, filename)
        elif scheme.startswith('hg+'):
            return self._download_hg(url, filename)
        elif scheme == 'file':
            return urllib.request.url2pathname(urllib.parse.urlparse(url)[2])
        else:
            self.url_ok(url, True)  # raises error if not allowed
            return self._attempt_download(url, filename)

    def scan_url(self, url):
        self.process_url(url, True)

    def _attempt_download(self, url, filename):
        headers = self._download_to(url, filename)
        if 'html' in headers.get('content-type', '').lower():
            return self._download_html(url, headers, filename)
        else:
            return filename

    def _download_html(self, url, headers, filename):
        file = open(filename)
        for line in file:
            if line.strip():
                # Check for a subversion index page
                if re.search(r'<title>([^- ]+ - )?Revision \d+:', line):
                    # it's a subversion index page:
                    file.close()
                    os.unlink(filename)
                    return self._download_svn(url, filename)
                break  # not an index page
        file.close()
        os.unlink(filename)
        raise DistutilsError("Unexpected HTML page found at " + url)

    def _download_svn(self, url, filename):
        url = url.split('#', 1)[0]  # remove any fragment for svn's sake
        creds = ''
        if url.lower().startswith('svn:') and '@' in url:
            scheme, netloc, path, p, q, f = urllib.parse.urlparse(url)
            if not netloc and path.startswith('//') and '/' in path[2:]:
                netloc, path = path[2:].split('/', 1)
                auth, host = urllib.parse.splituser(netloc)
                if auth:
                    if ':' in auth:
                        user, pw = auth.split(':', 1)
                        creds = " --username=%s --password=%s" % (user, pw)
                    else:
                        creds = " --username=" + auth
                    netloc = host
                    parts = scheme, netloc, url, p, q, f
                    url = urllib.parse.urlunparse(parts)
        self.info("Doing subversion checkout from %s to %s", url, filename)
        os.system("svn checkout%s -q %s %s" % (creds, url, filename))
        return filename

    @staticmethod
    def _vcs_split_rev_from_url(url, pop_prefix=False):
        scheme, netloc, path, query, frag = urllib.parse.urlsplit(url)

        scheme = scheme.split('+', 1)[-1]

        # Some fragment identification fails
        path = path.split('#', 1)[0]

        rev = None
        if '@' in path:
            path, rev = path.rsplit('@', 1)

        # Also, discard fragment
        url = urllib.parse.urlunsplit((scheme, netloc, path, query, ''))

        return url, rev

    def _download_git(self, url, filename):
        filename = filename.split('#', 1)[0]
        url, rev = self._vcs_split_rev_from_url(url, pop_prefix=True)

        self.info("Doing git clone from %s to %s", url, filename)
        os.system("git clone --quiet %s %s" % (url, filename))

        if rev is not None:
            self.info("Checking out %s", rev)
            os.system("(cd %s && git checkout --quiet %s)" % (
                filename,
                rev,
            ))

        return filename

    def _download_hg(self, url, filename):
        filename = filename.split('#', 1)[0]
        url, rev = self._vcs_split_rev_from_url(url, pop_prefix=True)

        self.info("Doing hg clone from %s to %s", url, filename)
        os.system("hg clone --quiet %s %s" % (url, filename))

        if rev is not None:
            self.info("Updating to %s", rev)
            os.system("(cd %s && hg up -C -r %s -q)" % (
                filename,
                rev,
            ))

        return filename

    def debug(self, msg, *args):
        log.debug(msg, *args)

    def info(self, msg, *args):
        log.info(msg, *args)

    def warn(self, msg, *args):
        log.warn(msg, *args)


# This pattern matches a character entity reference (a decimal numeric
# references, a hexadecimal numeric reference, or a named reference).
entity_sub = re.compile(r'&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?').sub


def decode_entity(match):
    what = match.group(1)
    return unescape(what)


def htmldecode(text):
    """Decode HTML entities in the given text."""
    return entity_sub(decode_entity, text)


def socket_timeout(timeout=15):
    def _socket_timeout(func):
        def _socket_timeout(*args, **kwargs):
            old_timeout = socket.getdefaulttimeout()
            socket.setdefaulttimeout(timeout)
            try:
                return func(*args, **kwargs)
            finally:
                socket.setdefaulttimeout(old_timeout)

        return _socket_timeout

    return _socket_timeout


def _encode_auth(auth):
    """
    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
    """
    auth_s = urllib.parse.unquote(auth)
    # convert to bytes
    auth_bytes = auth_s.encode()
    # use the legacy interface for Python 2.3 support
    encoded_bytes = base64.encodestring(auth_bytes)
    # convert back to a string
    encoded = encoded_bytes.decode()
    # strip the trailing carriage return
    return encoded.replace('\n', '')


class Credential(object):
    """
    A username/password pair. Use like a namedtuple.
    """

    def __init__(self, username, password):
        self.username = username
        self.password = password

    def __iter__(self):
        yield self.username
        yield self.password

    def __str__(self):
        return '%(username)s:%(password)s' % vars(self)


class PyPIConfig(configparser.RawConfigParser):
    def __init__(self):
        """
        Load from ~/.pypirc
        """
        defaults = dict.fromkeys(['username', 'password', 'repository'], '')
        configparser.RawConfigParser.__init__(self, defaults)

        rc = os.path.join(os.path.expanduser('~'), '.pypirc')
        if os.path.exists(rc):
            self.read(rc)

    @property
    def creds_by_repository(self):
        sections_with_repositories = [
            section for section in self.sections()
            if self.get(section, 'repository').strip()
        ]

        return dict(map(self._get_repo_cred, sections_with_repositories))

    def _get_repo_cred(self, section):
        repo = self.get(section, 'repository').strip()
        return repo, Credential(
            self.get(section, 'username').strip(),
            self.get(section, 'password').strip(),
        )

    def find_credential(self, url):
        """
        If the URL indicated appears to be a repository defined in this
        config, return the credential for that repository.
        """
        for repository, cred in self.creds_by_repository.items():
            if url.startswith(repository):
                return cred


def open_with_auth(url, opener=urllib.request.urlopen):
    """Open a urllib2 request, handling HTTP authentication"""

    scheme, netloc, path, params, query, frag = urllib.parse.urlparse(url)

    # Double scheme does not raise on Mac OS X as revealed by a
    # failing test. We would expect "nonnumeric port". Refs #20.
    if netloc.endswith(':'):
        raise http_client.InvalidURL("nonnumeric port: ''")

    if scheme in ('http', 'https'):
        auth, host = urllib.parse.splituser(netloc)
    else:
        auth = None

    if not auth:
        cred = PyPIConfig().find_credential(url)
        if cred:
            auth = str(cred)
            info = cred.username, url
            log.info('Authenticating as %s for %s (from .pypirc)', *info)

    if auth:
        auth = "Basic " + _encode_auth(auth)
        parts = scheme, host, path, params, query, frag
        new_url = urllib.parse.urlunparse(parts)
        request = urllib.request.Request(new_url)
        request.add_header("Authorization", auth)
    else:
        request = urllib.request.Request(url)

    request.add_header('User-Agent', user_agent)
    fp = opener(request)

    if auth:
        # Put authentication info back into request URL if same host,
        # so that links found on the page will work
        s2, h2, path2, param2, query2, frag2 = urllib.parse.urlparse(fp.url)
        if s2 == scheme and h2 == host:
            parts = s2, netloc, path2, param2, query2, frag2
            fp.url = urllib.parse.urlunparse(parts)

    return fp


# adding a timeout to avoid freezing package_index
open_with_auth = socket_timeout(_SOCKET_TIMEOUT)(open_with_auth)


def fix_sf_url(url):
    return url  # backward compatibility


def local_open(url):
    """Read a local path, with special support for directories"""
    scheme, server, path, param, query, frag = urllib.parse.urlparse(url)
    filename = urllib.request.url2pathname(path)
    if os.path.isfile(filename):
        return urllib.request.urlopen(url)
    elif path.endswith('/') and os.path.isdir(filename):
        files = []
        for f in os.listdir(filename):
            filepath = os.path.join(filename, f)
            if f == 'index.html':
                with open(filepath, 'r') as fp:
                    body = fp.read()
                break
            elif os.path.isdir(filepath):
                f += '/'
            files.append('<a href="{name}">{name}</a>'.format(name=f))
        else:
            tmpl = (
                "<html><head><title>{url}</title>"
                "</head><body>{files}</body></html>")
            body = tmpl.format(url=url, files='\n'.join(files))
        status, message = 200, "OK"
    else:
        status, message, body = 404, "Path not found", "Not found"

    headers = {'content-type': 'text/html'}
    body_stream = six.StringIO(body)
    return urllib.error.HTTPError(url, status, message, headers, body_stream)
dep_util.pyc000064400000001705151733473630007105 0ustar00�
�fc@sddlmZd�ZdS(i����(tnewer_groupcCs�t|�t|�kr'td��ng}g}xVtt|��D]B}t||||�rF|j||�|j||�qFqFW||fS(s�Walk both arguments in parallel, testing if each source group is newer
    than its corresponding target. Returns a pair of lists (sources_groups,
    targets) where sources is newer than target, according to the semantics
    of 'newer_group()'.
    s5'sources_group' and 'targets' must be the same length(tlent
ValueErrortrangeRtappend(tsources_groupsttargetst	n_sourcest	n_targetsti((s7/usr/lib/python2.7/site-packages/setuptools/dep_util.pytnewer_pairwise_groupsN(tdistutils.dep_utilRR
(((s7/usr/lib/python2.7/site-packages/setuptools/dep_util.pyt<module>snamespaces.pyo000064400000011651151733473630007434 0ustar00�
�fc@sqddlZddlmZddlZddlmZejjZddd��YZ	de	fd��YZ
dS(	i����N(tlog(tmapt	Installerc	Bs_eZdZd�Zd�Zd�ZdZdZd�Zd�Z	d�Z
ed��ZRS(s
-nspkg.pthcCs�|j�}|sdStjj|j��\}}||j7}|jj|�tj	d|�t
|j|�}|jr�t
|�dSt|d��}|j|�WdQXdS(Ns
Installing %stwt(t_get_all_ns_packagestostpathtsplitextt_get_targett	nspkg_exttoutputstappendRtinfoRt_gen_nspkg_linetdry_runtlisttopent
writelines(tselftnsptfilenametexttlinestf((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pytinstall_namespacess
	
cCsbtjj|j��\}}||j7}tjj|�sAdStjd|�tj|�dS(NsRemoving %s(	RRRRR	texistsRRtremove(RRR((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pytuninstall_namespaces!s
cCs|jS(N(ttarget(R((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyR)ssimport sys, types, oss#has_mfs = sys.version_info > (3, 5)s$p = os.path.join(%(root)s, *%(pth)r)s4importlib = has_mfs and __import__('importlib.util')s-has_mfs and __import__('importlib.machinery')s�m = has_mfs and sys.modules.setdefault(%(pkg)r, importlib.util.module_from_spec(importlib.machinery.PathFinder.find_spec(%(pkg)r, [os.path.dirname(p)])))sCm = m or sys.modules.setdefault(%(pkg)r, types.ModuleType(%(pkg)r))s7mp = (m or []) and m.__dict__.setdefault('__path__',[])s(p not in mp) and mp.append(p)s4m and setattr(sys.modules[%(parent)r], %(child)r, m)cCsdS(Ns$sys._getframe(1).f_locals['sitedir']((R((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyt	_get_rootCscCs|t|�}t|jd��}|j�}|j}|jd�\}}}|rd||j7}ndj|�t�dS(Nt.t;s
(	tstrttupletsplitRt_nspkg_tmplt
rpartitiont_nspkg_tmpl_multitjointlocals(Rtpkgtpthtroott
tmpl_linestparenttseptchild((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyR
Fs	cCs.|jjpg}ttt|j|���S(s,Return sorted list of all package namespaces(tdistributiontnamespace_packagestsortedtflattenRt
_pkg_names(Rtpkgs((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyRQsccs8|jd�}x"|r3dj|�V|j�qWdS(s�
        Given a namespace package, yield the components of that
        package.

        >>> names = Installer._pkg_names('a.b.c')
        >>> set(names) == set(['a', 'a.b', 'a.b.c'])
        True
        RN(R"R&tpop(R(tparts((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyR3Vs
	(	simport sys, types, oss#has_mfs = sys.version_info > (3, 5)s$p = os.path.join(%(root)s, *%(pth)r)s4importlib = has_mfs and __import__('importlib.util')s-has_mfs and __import__('importlib.machinery')s�m = has_mfs and sys.modules.setdefault(%(pkg)r, importlib.util.module_from_spec(importlib.machinery.PathFinder.find_spec(%(pkg)r, [os.path.dirname(p)])))sCm = m or sys.modules.setdefault(%(pkg)r, types.ModuleType(%(pkg)r))s7mp = (m or []) and m.__dict__.setdefault('__path__',[])s(p not in mp) and mp.append(p)(s4m and setattr(sys.modules[%(parent)r], %(child)r, m)(
t__name__t
__module__R	RRRR#R%RR
RtstaticmethodR3(((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyRs$						tDevelopInstallercBseZd�Zd�ZRS(cCstt|j��S(N(treprR tegg_path(R((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyRgscCs|jS(N(tegg_link(R((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyRjs(R7R8RR(((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyR:fs	((Rt	distutilsRt	itertoolstsetuptools.extern.six.movesRtchaint
from_iterableR2RR:(((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyt<module>s[glob.pyc000064400000011322151733473630006217 0ustar00�
�fc@s�dZddlZddlZddlZddlmZdddgZed�Zed�Z	d	�Z
d
�Zd�Zd�Z
d
�Zejd�Zejd�Zd�Zd�Zd�ZdS(s�
Filename globbing utility. Mostly a copy of `glob` from Python 3.5.

Changes include:
 * `yield from` and PEP3102 `*` removed.
 * `bytes` changed to `six.binary_type`.
 * Hidden files are not ignored.
i����N(tbinary_typetglobtiglobtescapecCstt|d|��S(syReturn a list of paths matching a pathname pattern.

    The pattern may contain simple shell-style wildcards a la
    fnmatch. However, unlike fnmatch, filenames starting with a
    dot are special cases that are not matched by '*' and '?'
    patterns.

    If recursive is true, the pattern '**' will match any files and
    zero or more directories and subdirectories.
    t	recursive(tlistR(tpathnameR((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyRscCsAt||�}|r=t|�r=t|�}|s=t�n|S(s�Return an iterator which yields the paths matching a pathname pattern.

    The pattern may contain simple shell-style wildcards a la
    fnmatch. However, unlike fnmatch, filenames starting with a
    dot are special cases that are not matched by '*' and '?'
    patterns.

    If recursive is true, the pattern '**' will match any files and
    zero or more directories and subdirectories.
    (t_iglobt_isrecursivetnexttAssertionError(RRtitts((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyR s
ccsntjj|�\}}t|�se|rGtjj|�ra|Vqantjj|�ra|VndS|s�|r�t|�r�x>t||�D]}|Vq�Wnxt||�D]}|Vq�WdS||kr�t|�r�t	||�}n	|g}t|�r%|rt|�rt}q+t}nt
}x<|D]4}x+|||�D]}tjj||�VqHWq2WdS(N(tostpathtsplitt	has_magictlexiststisdirRtglob2tglob1Rtglob0tjoin(RRtdirnametbasenametxtdirstglob_in_dirtname((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyR2s4				
cCsn|s6t|t�r*tjjd�}q6tj}nytj|�}Wntk
r]gSXtj||�S(NtASCII(	t
isinstanceRR
tcurdirtencodetlistdirtOSErrortfnmatchtfilter(Rtpatterntnames((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyR]s
cCsN|s"tjj|�rJ|gSn(tjjtjj||��rJ|gSgS(N(R
RRRR(RR((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyRjs
!ccs;t|�st�|d Vxt|�D]}|Vq(WdS(Ni(RR
t	_rlistdir(RR%R((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyRzs	ccs�|s6t|t�r*ttjd�}q6tj}nytj|�}Wntjk
r`dSXx_|D]W}|V|r�tjj||�n|}x(t|�D]}tjj||�Vq�WqhWdS(NR(	RRR
RR!terrorRRR'(RR&RRty((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyR'�s
!s([*?[])cCs:t|t�r!tj|�}ntj|�}|dk	S(N(RRtmagic_check_bytestsearchtmagic_checktNone(Rtmatch((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyR�scCs't|t�r|dkS|dkSdS(Ns**(RR(R%((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyR�s
cCsVtjj|�\}}t|t�r<tjd|�}ntjd|�}||S(s#Escape all special characters.
    s[\1](R
Rt
splitdriveRRR*tsubR,(Rtdrive((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyR�s
(t__doc__R
treR#tsetuptools.extern.sixRt__all__tFalseRRRRRRR'tcompileR,R*RRR(((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyt<module>s"	+	
					pep425tags.pyo000064400000022166151733473640007217 0ustar00�
�fc@@sdZddlmZddlZddlZddlZddlZddlZddl	Z	ddl
mZddlm
Z
ejd�Zd�Zd	�Zd
�Zd�Zd�Zeed
�Zd�Zd�Zd�Zd�Zd�Zdedddd�Ze�ZdS(s2Generate and work with PEP 425 Compatibility Tags.i(tabsolute_importN(tOrderedDicti(tglibcs(.+)_(\d+)_(\d+)_(.+)cC@sEytj|�SWn-tk
r@}tjdj|�t�dSXdS(Ns{}(t	sysconfigtget_config_vartIOErrortwarningstwarntformattRuntimeWarningtNone(tvarte((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyRs
cC@sUttd�rd}n9tjjd�r3d}ntjdkrKd}nd}|S(s'Return abbreviated implementation name.tpypy_version_infotpptjavatjytclitiptcp(thasattrtsystplatformt
startswith(tpyimpl((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyt
get_abbr_impls			cC@sDtd�}|s"t�dkr@djttt���}n|S(sReturn implementation version.tpy_version_nodotRt(RRtjointmaptstrtget_impl_version_info(timpl_ver((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pytget_impl_ver(scC@sKt�dkr/tjdtjjtjjfStjdtjdfSdS(sQReturn sys.version_info-like tuple for use in decrementing the minor
    version.RiiN(RRtversion_infoR
tmajortminor(((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyR0s
cC@sdjt�t��S(s;
    Returns the Tag for this specific implementation.
    s{}{}(RRR!(((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pytget_impl_tag;scC@sNt|�}|dkrD|r=tjdj|�td�n|�S||kS(sgUse a fallback method for determining SOABI flags if the needed config
    var is unset or unavailable.s?Config variable '{0}' is unset, Python ABI tag may be incorrectiN(RR
RRRR	(RtfallbacktexpectedRtval((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pytget_flagBsc	@smtd�}t��|r
�ddhkr
ttd�r
d}d}d}tdd�d�dk�rvd	}ntd
�fd�d�dk�r�d}ntd
d�ddd�dko�tjdk�r�tjdkr�d}nd�t�|||f}n\|r<|jd�r<d|jd�d}n-|rc|j	dd�j	dd�}nd}|S(sXReturn the ABI tag based on SOABI (if available) or emulate SOABI
    (CPython 2, PyPy).tSOABIRRt
maxunicodeRtPy_DEBUGcS@s
ttd�S(Ntgettotalrefcount(RR(((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyt<lambda>XRRtdt
WITH_PYMALLOCc@s
�dkS(NR(((timpl(s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyR.\RtmtPy_UNICODE_SIZEcS@s
tjdkS(Ni��(RR+(((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyR.`RR'iitus
%s%s%s%s%sscpython-t-it.t_(ii(iiN(RRRRR)R"R!RtsplittreplaceR
(tsoabiR/R2R4tabi((R1s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pytget_abi_tagNs8	(					!cC@s
tjdkS(Ni���(Rtmaxsize(((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyt_is_running_32bitpscC@s�tjdkr�tj�\}}}|jd�}|dkrQt�rQd}n|dkrot�rod}ndj|d|d	|�Stjj�j	dd
�j	dd
�}|dkr�t�r�d
}n|S(s0Return our platform name 'win32', 'linux_x86_64'tdarwinR6tx86_64ti386tppc64tppcsmacosx_{}_{}_{}iiR7R5tlinux_x86_64t
linux_i686(
RRtmac_verR8R>Rt	distutilstutiltget_platformR9(treleaseR7tmachinet	split_vertresult((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyRIts		'	cC@s`t�ddhkrtSyddl}t|j�SWnttfk
rOnXtjdd�S(NRDREiii(	RItFalset
_manylinuxtbooltmanylinux1_compatibletImportErrortAttributeErrorRthave_compatible_glibc(RO((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pytis_manylinux1_compatible�sc@s�g}��fd��tddfddfdd
fd	dfg���|||�rj|j|�nx@�D]8}|�|krq�|||�rq|j|�qqqqW|jd
�|S(s�Return a list of supported arches (including group arches) for
    the given major, minor and machine architecture of an macOS machine.
    c@s�|dkr||fdkS|dkr8||fd	kS|dkrT||fd
kS|dkrp||fdkS|�kr�x+�|D]}�|||�r�tSq�WntS(NRCi
iRBRAiR@(i
i(i
i(i
i(i
i(tTrueRN(R#R$tarchtgarch(t_supports_archtgroups(s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyRY�stfatRARCtintelR@tfat64RBtfat32t	universal(RARC(R@RA(R@RB(R@RARC(Rtappend(R#R$RKtarchesRX((RYRZs9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pytget_darwin_arches�s$			
"
cC@s�g}|dkrug}t�}|d }xGt|ddd�D],}|jdjtt||f���qBWn|p�t�}g}	|p�t�}|r�|g|	dd+nt	�}
ddl
}xK|j�D]=}|djd�r�|
j
|djdd�d�q�q�W|	jtt|
���|	jd	�|s6|pMt�}
|
jd
�rtj|
�}|r|j�\}}}}dj||�}g}xjttt|�d��D]@}x7tt|�||�D]}|j|||f�q�Wq�WqM|
g}n9|dkrDt�rD|
jdd
�|
g}n	|
g}xC|	D];}x2|D]*}
|jd||df||
f�qaWqTWxj|dD]^}|ddhkr�Pnx?|
D]7}x.|D]&}
|jd||f||
f�q�Wq�Wq�Wx3|D](}
|jd|ddd	|
f�qWn|jd||dfd	df�|jd||ddfd	df�xdt|�D]V\}}|jd|fd	df�|dkr�|jd|dd	df�q�q�W|S(scReturn a list of supported tags for each version specified in
    `versions`.

    :param versions: a list of string versions, of the form ["33", "32"],
        or None. The first version will be assumed to support our ABI.
    :param platform: specify the exact platform you want valid
        tags for, or None. If None, use the local system platform.
    :param impl: specify the exact implementation you want valid
        tags for, or None. If None, use the local interpreter impl.
    :param abi: specify the exact abi you want valid
        tags for, or None. If None, use the local interpreter abi.
    i����RiNs.abiR6iitnonetmacosxs{}_{}_%i_%stlinuxt
manylinux1s%s%st31t30spy%stany(R
RtrangeR`RRRRR<tsettimptget_suffixesRtaddR8textendtsortedtlistRIt
_osx_arch_pattmatchRZRtreversedtintRbRUR9t	enumerate(tversionstnoarchRR1R;t	supportedR"R#R$tabistabi3sRltsuffixRWRstnametactual_archttplRaR2tatversionti((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyt
get_supported�sh	
-	(
#"	

,

,
)$(%( t__doc__t
__future__Rtdistutils.utilRGRtreRRRtcollectionsRRRtcompileRrRRR!RR%RVR)R<R>RIRURbR
RNR�timplementation_tag(((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyt<module>s0		
				"				=	_command/test.pyo000064400000024344151733473640007716 0ustar00�
�fc@s:ddlZddlZddlZddlZddlZddlZddlmZmZddl	m
Z
ddlmZddlm
Z
ddlmZmZddlmZmZmZmZmZmZmZmZmZddlmZd	efd
��YZdefd��YZd
efd��YZ dS(i����N(tDistutilsErrortDistutilsOptionError(tlog(t
TestLoader(tsix(tmaptfilter(	tresource_listdirtresource_existstnormalize_pathtworking_sett_namespace_packagestevaluate_markertadd_activation_listenertrequiret
EntryPoint(tCommandtScanningLoadercBseZd�Zdd�ZRS(cCstj|�t�|_dS(N(Rt__init__tsett_visited(tself((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyRs
cCs7||jkrdS|jj|�g}|jtj||��t|d�rg|j|j��nt|d�rx�t|j	d�D]|}|j
d�r�|dkr�|j	d|d }n-t|j	|d�r�|j	d|}nq�|j|j|��q�Wnt
|�d	kr+|j|�S|d
SdS(sReturn a suite of all tests cases contained in the given module

        If the module is a package, load tests from all the modules in it.
        If the module has an ``additional_tests`` function, call it and add
        the return value to the tests.
        tadditional_testst__path__ts.pys__init__.pyt.i����s/__init__.pyiiN(RtNonetaddtappendRtloadTestsFromModulethasattrRRt__name__tendswithRtloadTestsFromNametlent
suiteClass(Rtmoduletpatterntteststfilet	submodule((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyRs$
N(Rt
__module__RRR(((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyRs	tNonDataPropertycBseZd�Zdd�ZRS(cCs
||_dS(N(tfget(RR+((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyR>scCs|dkr|S|j|�S(N(RR+(Rtobjtobjtype((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyt__get__AsN(RR)RRR.(((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyR*=s	ttestcBs�eZdZdZdddgZd�Zd�Zed
��Zd�Z	d�Z
ejgd��Z
eejd���Zed��Zd�Zd�Zed��Zed��ZRS(s.Command to run unit tests after in-place builds#run unit tests after in-place buildstest-module=tms$Run 'test_suite' in specified modulestest-suite=tss9Run single test, case or suite (e.g. 'module.test_suite')stest-runner=trsTest runner to usecCs(d|_d|_d|_d|_dS(N(Rt
test_suitettest_modulettest_loaderttest_runner(R((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pytinitialize_optionsSs			cCs�|jr'|jr'd}t|��n|jdkrj|jdkrW|jj|_qj|jd|_n|jdkr�t|jdd�|_n|jdkr�d|_n|jdkr�t|jdd�|_ndS(Ns1You may specify a module or a suite, but not boths.test_suiteR5s&setuptools.command.test:ScanningLoaderR6(R3R4RRtdistributionR5tgetattrR6(Rtmsg((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pytfinalize_optionsYscCst|j��S(N(tlistt
_test_args(R((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyt	test_argslsccsJ|jr!tjdkr!dVn|jr2dVn|jrF|jVndS(Niitdiscovers	--verbose(ii(R3tsystversion_infotverbose(R((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyR=ps		cCs|j��|�WdQXdS(sI
        Backward compatibility for project_on_sys_path context.
        N(tproject_on_sys_path(Rtfunc((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pytwith_project_on_sys_pathxs
c	cs�tjot|jdt�}|r�|jddd�|jd�|jd�}t|j	�}|jdd|�|jd�|jddd�|jd�n-|jd�|jddd�|jd�|jd�}t
j}t
jj
�}zut|j�}t
jjd|�tj�td	��td
|j|jf�|j|g��
dVWdQXWd|t
j(t
jj�t
jj|�tj�XdS(Ntuse_2to3tbuild_pytinplaceitegg_infotegg_baset	build_exticSs
|j�S(N(tactivate(tdist((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyt<lambda>�Rs%s==%s(RtPY3R9R8tFalsetreinitialize_commandtrun_commandtget_finalized_commandR	t	build_libR@tpathtmodulestcopyRJtinsertR
RR
Rtegg_nametegg_versiontpaths_on_pythonpathtcleartupdate(	Rt
include_distst	with_2to3tbpy_cmdt
build_pathtei_cmdtold_pathtold_modulestproject_path((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyRCs8








ccs�t�}tjjd|�}tjjdd�}zXtjj|�}td||g�}tjj|�}|r�|tjd<ndVWd||kr�tjjdd�n
|tjd<XdS(s�
        Add the indicated paths to the head of the PYTHONPATH environment
        variable so that subprocesses will also see the packages at
        these paths.

        Do this in a context that restores the value on exit.
        t
PYTHONPATHRN(	tobjecttostenvirontgettpathseptjoinRRtpop(tpathstnothingtorig_pythonpathtcurrent_pythonpathtprefixtto_jointnew_path((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyR[�s
		cCs_|j|j�}|j|jp$g�}|jd�|jj�D��}tj|||�S(s�
        Install the requirements indicated by self.distribution and
        return an iterable of the dists that were built.
        css:|]0\}}|jd�rt|d�r|VqdS(t:iN(t
startswithR(t.0tktv((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pys	<genexpr>�s	(tfetch_build_eggstinstall_requirest
tests_requiretextras_requiretitemst	itertoolstchain(RMtir_dttr_dter_d((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyt
install_dists�s
c	Cs�|j|j�}dj|j�}|jrB|jd|�dS|jd|�ttjd�|�}|j	|��"|j
��|j�WdQXWdQXdS(Nt sskipping "%s" (dry run)srunning "%s"tlocation(R�R8Rlt_argvtdry_runtannounceRtoperatort
attrgetterR[RCt	run_tests(Rtinstalled_diststcmdRn((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pytrun�s	
c
CsEtjr�t|jdt�r�|jjd�d}|tkr�g}|tj	kre|j
|�n|d7}x0tj	D]%}|j|�ry|j
|�qyqyWtt
tj	j|��q�ntjdd|jd|j|j�d|j|j�dt�}|jj�sAd|j}|j|tj�t|��ndS(NRFRit
testLoadert
testRunnertexitsTest failed: %s(RROR9R8RPR3tsplitRR@RVRRvR<Rt__delitem__tunittesttmainRR�t_resolve_as_epR5R6tresultt
wasSuccessfulR�RtERRORR(RR$tdel_modulestnameR/R:((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyR��s(
	
cCsdg|jS(NR�(R>(R((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyR��scCs0|dkrdStjd|�}|j��S(su
        Load the indicated attribute value, called, as a as if it were
        specified as an entry point.
        Nsx=(RRtparsetresolve(tvaltparsed((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyR�s(stest-module=R0s$Run 'test_suite' in specified module(stest-suite=R1s9Run single test, case or suite (e.g. 'module.test_suite')(stest-runner=R2sTest runner to use(RR)t__doc__tdescriptiontuser_optionsR7R;R*R>R=REt
contextlibtcontextmanagerRCtstaticmethodR[R�R�R�tpropertyR�R�(((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyR/Gs(					-		(!RhR�R@R�RR�tdistutils.errorsRRt	distutilsRRtsetuptools.externRtsetuptools.extern.six.movesRRt
pkg_resourcesRRR	R
RRR
RRt
setuptoolsRRRgR*R/(((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyt<module>s@)
command/install_egg_info.pyo000064400000006161151733473640012237 0ustar00�
�fc@s~ddlmZmZddlZddlmZddlmZddlmZddl	Z	dej
efd��YZdS(i����(tlogtdir_utilN(tCommand(t
namespaces(tunpack_archivetinstall_egg_infocBsJeZdZdZd	gZd�Zd�Zd�Zd�Zd�Z	RS(
s.Install an .egg-info directory for the packagesinstall-dir=tdsdirectory to install tocCs
d|_dS(N(tNonetinstall_dir(tself((sG/usr/lib/python2.7/site-packages/setuptools/command/install_egg_info.pytinitialize_optionsscCs{|jdd�|jd�}tjdd|j|j�j�d}|j|_t	j
j|j|�|_
g|_dS(Ntinstall_libRtegg_infos	.egg-info(RR(tset_undefined_optionstget_finalized_commandt
pkg_resourcestDistributionRtegg_nametegg_versionRtsourcetostpathtjoinRttargettoutputs(R	tei_cmdtbasename((sG/usr/lib/python2.7/site-packages/setuptools/command/install_egg_info.pytfinalize_optionss	cCs�|jd�tjj|j�rTtjj|j�rTtj|jd|j�n;tjj	|j�r�|j
tj|jfd|j�n|js�tj
|j�n|j
|jdd|j|jf�|j�dS(NRtdry_runs	Removing sCopying %s to %s((trun_commandRRtisdirRtislinkRtremove_treeRtexiststexecutetunlinkRtensure_directorytcopytreeRtinstall_namespaces(R	((sG/usr/lib/python2.7/site-packages/setuptools/command/install_egg_info.pytrun!s
+&	 cCs|jS(N(R(R	((sG/usr/lib/python2.7/site-packages/setuptools/command/install_egg_info.pytget_outputs.scs)�fd�}t�j�j|�dS(Ncs[x1dD])}|j|�s,d||krdSqW�jj|�tjd||�|S(Ns.svn/sCVS/t/sCopying %s to %s(s.svn/sCVS/(t
startswithRRtappendRtdebug(tsrctdsttskip(R	(sG/usr/lib/python2.7/site-packages/setuptools/command/install_egg_info.pytskimmer3s
(RRR(R	R0((R	sG/usr/lib/python2.7/site-packages/setuptools/command/install_egg_info.pyR%1s(sinstall-dir=Rsdirectory to install to(
t__name__t
__module__t__doc__tdescriptiontuser_optionsR
RR'R(R%(((sG/usr/lib/python2.7/site-packages/setuptools/command/install_egg_info.pyR
s				
	(t	distutilsRRRt
setuptoolsRRtsetuptools.archive_utilRRt	InstallerR(((sG/usr/lib/python2.7/site-packages/setuptools/command/install_egg_info.pyt<module>scommand/upload_docs.py000064400000016217151733473640011054 0ustar00# -*- coding: utf-8 -*-
"""upload_docs

Implements a Distutils 'upload_docs' subcommand (upload documentation to
PyPI's pythonhosted.org).
"""

from base64 import standard_b64encode
from distutils import log
from distutils.errors import DistutilsOptionError
import os
import socket
import zipfile
import tempfile
import shutil
import itertools
import functools

from setuptools.extern import six
from setuptools.extern.six.moves import http_client, urllib

from pkg_resources import iter_entry_points
from .upload import upload


def _encode(s):
    errors = 'surrogateescape' if six.PY3 else 'strict'
    return s.encode('utf-8', errors)


class upload_docs(upload):
    # override the default repository as upload_docs isn't
    # supported by Warehouse (and won't be).
    DEFAULT_REPOSITORY = 'https://pypi.python.org/pypi/'

    description = 'Upload documentation to PyPI'

    user_options = [
        ('repository=', 'r',
         "url of repository [default: %s]" % upload.DEFAULT_REPOSITORY),
        ('show-response', None,
         'display full response text from server'),
        ('upload-dir=', None, 'directory to upload'),
    ]
    boolean_options = upload.boolean_options

    def has_sphinx(self):
        if self.upload_dir is None:
            for ep in iter_entry_points('distutils.commands', 'build_sphinx'):
                return True

    sub_commands = [('build_sphinx', has_sphinx)]

    def initialize_options(self):
        upload.initialize_options(self)
        self.upload_dir = None
        self.target_dir = None

    def finalize_options(self):
        upload.finalize_options(self)
        if self.upload_dir is None:
            if self.has_sphinx():
                build_sphinx = self.get_finalized_command('build_sphinx')
                self.target_dir = build_sphinx.builder_target_dir
            else:
                build = self.get_finalized_command('build')
                self.target_dir = os.path.join(build.build_base, 'docs')
        else:
            self.ensure_dirname('upload_dir')
            self.target_dir = self.upload_dir
        if 'pypi.python.org' in self.repository:
            log.warn("Upload_docs command is deprecated. Use RTD instead.")
        self.announce('Using upload directory %s' % self.target_dir)

    def create_zipfile(self, filename):
        zip_file = zipfile.ZipFile(filename, "w")
        try:
            self.mkpath(self.target_dir)  # just in case
            for root, dirs, files in os.walk(self.target_dir):
                if root == self.target_dir and not files:
                    tmpl = "no files found in upload directory '%s'"
                    raise DistutilsOptionError(tmpl % self.target_dir)
                for name in files:
                    full = os.path.join(root, name)
                    relative = root[len(self.target_dir):].lstrip(os.path.sep)
                    dest = os.path.join(relative, name)
                    zip_file.write(full, dest)
        finally:
            zip_file.close()

    def run(self):
        # Run sub commands
        for cmd_name in self.get_sub_commands():
            self.run_command(cmd_name)

        tmp_dir = tempfile.mkdtemp()
        name = self.distribution.metadata.get_name()
        zip_file = os.path.join(tmp_dir, "%s.zip" % name)
        try:
            self.create_zipfile(zip_file)
            self.upload_file(zip_file)
        finally:
            shutil.rmtree(tmp_dir)

    @staticmethod
    def _build_part(item, sep_boundary):
        key, values = item
        title = '\nContent-Disposition: form-data; name="%s"' % key
        # handle multiple entries for the same name
        if not isinstance(values, list):
            values = [values]
        for value in values:
            if isinstance(value, tuple):
                title += '; filename="%s"' % value[0]
                value = value[1]
            else:
                value = _encode(value)
            yield sep_boundary
            yield _encode(title)
            yield b"\n\n"
            yield value
            if value and value[-1:] == b'\r':
                yield b'\n'  # write an extra newline (lurve Macs)

    @classmethod
    def _build_multipart(cls, data):
        """
        Build up the MIME payload for the POST data
        """
        boundary = b'--------------GHSKFJDLGDS7543FJKLFHRE75642756743254'
        sep_boundary = b'\n--' + boundary
        end_boundary = sep_boundary + b'--'
        end_items = end_boundary, b"\n",
        builder = functools.partial(
            cls._build_part,
            sep_boundary=sep_boundary,
        )
        part_groups = map(builder, data.items())
        parts = itertools.chain.from_iterable(part_groups)
        body_items = itertools.chain(parts, end_items)
        content_type = 'multipart/form-data; boundary=%s' % boundary.decode('ascii')
        return b''.join(body_items), content_type

    def upload_file(self, filename):
        with open(filename, 'rb') as f:
            content = f.read()
        meta = self.distribution.metadata
        data = {
            ':action': 'doc_upload',
            'name': meta.get_name(),
            'content': (os.path.basename(filename), content),
        }
        # set up the authentication
        credentials = _encode(self.username + ':' + self.password)
        credentials = standard_b64encode(credentials)
        if six.PY3:
            credentials = credentials.decode('ascii')
        auth = "Basic " + credentials

        body, ct = self._build_multipart(data)

        msg = "Submitting documentation to %s" % (self.repository)
        self.announce(msg, log.INFO)

        # build the Request
        # We can't use urllib2 since we need to send the Basic
        # auth right with the first request
        schema, netloc, url, params, query, fragments = \
            urllib.parse.urlparse(self.repository)
        assert not params and not query and not fragments
        if schema == 'http':
            conn = http_client.HTTPConnection(netloc)
        elif schema == 'https':
            conn = http_client.HTTPSConnection(netloc)
        else:
            raise AssertionError("unsupported schema " + schema)

        data = ''
        try:
            conn.connect()
            conn.putrequest("POST", url)
            content_type = ct
            conn.putheader('Content-type', content_type)
            conn.putheader('Content-length', str(len(body)))
            conn.putheader('Authorization', auth)
            conn.endheaders()
            conn.send(body)
        except socket.error as e:
            self.announce(str(e), log.ERROR)
            return

        r = conn.getresponse()
        if r.status == 200:
            msg = 'Server response (%s): %s' % (r.status, r.reason)
            self.announce(msg, log.INFO)
        elif r.status == 301:
            location = r.getheader('Location')
            if location is None:
                location = 'https://pythonhosted.org/%s/' % meta.get_name()
            msg = 'Upload successful. Visit %s' % location
            self.announce(msg, log.INFO)
        else:
            msg = 'Upload failed (%s): %s' % (r.status, r.reason)
            self.announce(msg, log.ERROR)
        if self.show_response:
            print('-' * 75, r.read(), '-' * 75)
command/py36compat.py000064400000011572151733473640010564 0ustar00import os
from glob import glob
from distutils.util import convert_path
from distutils.command import sdist

from setuptools.extern.six.moves import filter


class sdist_add_defaults:
    """
    Mix-in providing forward-compatibility for functionality as found in
    distutils on Python 3.7.

    Do not edit the code in this class except to update functionality
    as implemented in distutils. Instead, override in the subclass.
    """

    def add_defaults(self):
        """Add all the default files to self.filelist:
          - README or README.txt
          - setup.py
          - test/test*.py
          - all pure Python modules mentioned in setup script
          - all files pointed by package_data (build_py)
          - all files defined in data_files.
          - all files defined as scripts.
          - all C sources listed as part of extensions or C libraries
            in the setup script (doesn't catch C headers!)
        Warns if (README or README.txt) or setup.py are missing; everything
        else is optional.
        """
        self._add_defaults_standards()
        self._add_defaults_optional()
        self._add_defaults_python()
        self._add_defaults_data_files()
        self._add_defaults_ext()
        self._add_defaults_c_libs()
        self._add_defaults_scripts()

    @staticmethod
    def _cs_path_exists(fspath):
        """
        Case-sensitive path existence check

        >>> sdist_add_defaults._cs_path_exists(__file__)
        True
        >>> sdist_add_defaults._cs_path_exists(__file__.upper())
        False
        """
        if not os.path.exists(fspath):
            return False
        # make absolute so we always have a directory
        abspath = os.path.abspath(fspath)
        directory, filename = os.path.split(abspath)
        return filename in os.listdir(directory)

    def _add_defaults_standards(self):
        standards = [self.READMES, self.distribution.script_name]
        for fn in standards:
            if isinstance(fn, tuple):
                alts = fn
                got_it = False
                for fn in alts:
                    if self._cs_path_exists(fn):
                        got_it = True
                        self.filelist.append(fn)
                        break

                if not got_it:
                    self.warn("standard file not found: should have one of " +
                              ', '.join(alts))
            else:
                if self._cs_path_exists(fn):
                    self.filelist.append(fn)
                else:
                    self.warn("standard file '%s' not found" % fn)

    def _add_defaults_optional(self):
        optional = ['test/test*.py', 'setup.cfg']
        for pattern in optional:
            files = filter(os.path.isfile, glob(pattern))
            self.filelist.extend(files)

    def _add_defaults_python(self):
        # build_py is used to get:
        #  - python modules
        #  - files defined in package_data
        build_py = self.get_finalized_command('build_py')

        # getting python files
        if self.distribution.has_pure_modules():
            self.filelist.extend(build_py.get_source_files())

        # getting package_data files
        # (computed in build_py.data_files by build_py.finalize_options)
        for pkg, src_dir, build_dir, filenames in build_py.data_files:
            for filename in filenames:
                self.filelist.append(os.path.join(src_dir, filename))

    def _add_defaults_data_files(self):
        # getting distribution.data_files
        if self.distribution.has_data_files():
            for item in self.distribution.data_files:
                if isinstance(item, str):
                    # plain file
                    item = convert_path(item)
                    if os.path.isfile(item):
                        self.filelist.append(item)
                else:
                    # a (dirname, filenames) tuple
                    dirname, filenames = item
                    for f in filenames:
                        f = convert_path(f)
                        if os.path.isfile(f):
                            self.filelist.append(f)

    def _add_defaults_ext(self):
        if self.distribution.has_ext_modules():
            build_ext = self.get_finalized_command('build_ext')
            self.filelist.extend(build_ext.get_source_files())

    def _add_defaults_c_libs(self):
        if self.distribution.has_c_libraries():
            build_clib = self.get_finalized_command('build_clib')
            self.filelist.extend(build_clib.get_source_files())

    def _add_defaults_scripts(self):
        if self.distribution.has_scripts():
            build_scripts = self.get_finalized_command('build_scripts')
            self.filelist.extend(build_scripts.get_source_files())


if hasattr(sdist.sdist, '_add_defaults_standards'):
    # disable the functionality already available upstream
    class sdist_add_defaults:
        pass
command/sdist.pyo000064400000017217151733473640010066 0ustar00�
�fc@s�ddlmZddljjZddlZddlZddlZddl	Z	ddl
mZddlm
Z
ddlZeZdd�Zde
ejfd	��YZdS(
i����(tlogN(tsixi(tsdist_add_defaultstccs@x9tjd�D](}x|j�|�D]}|Vq)WqWdS(s%Find all files under revision controlssetuptools.file_findersN(t
pkg_resourcestiter_entry_pointstload(tdirnameteptitem((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pytwalk_revctrlstsdistcBs/eZdZd"ddddfd#gZiZd
ddd
gZed�eD��Zd�Z	d�Z
d�Zd�Ze
ejd���Zd�Zejd$kp�d%ejko�d&knp�d'ejko�d(knZer�eZnd�Zd�Zd�Zd�Zd�Zd �ZRS()s=Smart sdist that finds anything supported by revision controlsformats=s6formats for source distribution (comma-separated list)s	keep-temptks1keep the distribution tree around after creating sarchive file(s)s	dist-dir=tdsFdirectory to put the source distribution archive(s) in [default: dist]Rs.rsts.txts.mdccs|]}dj|�VqdS(s	README{0}N(tformat(t.0text((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pys	<genexpr>)scCs�|jd�|jd�}|j|_|jjtjj|jd��|j�x!|j	�D]}|j|�qaW|j
�t|jdg�}x<|j
D]1}dd|f}||kr�|j|�q�q�WdS(Ntegg_infosSOURCES.txtt
dist_filesRR(trun_commandtget_finalized_commandtfilelisttappendtostpathtjoinRtcheck_readmetget_sub_commandstmake_distributiontgetattrtdistributiont
archive_files(tselftei_cmdtcmd_nameRtfiletdata((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pytrun+s
"

cCstjj|�|j�dS(N(torigRtinitialize_optionst_default_to_gztar(R ((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyR'>scCs#tjdkrdSdg|_dS(Niiitbetaitgztar(iiiR)i(tsystversion_infotformats(R ((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyR(CscCs'|j��tjj|�WdQXdS(s%
        Workaround for #516
        N(t_remove_os_linkR&RR(R ((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyRIs
ccssddd��Y}ttd|�}y
t`Wntk
rBnXz	dVWd||k	rnttd|�nXdS(sG
        In a context, remove and restore os.link if it exists
        tNoValuecBseZRS((t__name__t
__module__(((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyR/WstlinkN((RRR2t	Exceptiontsetattr(R/torig_val((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyR.Ps

	cCs[ytjj|�Wn@tk
rVtj�\}}}|jjjdj	��nXdS(Nttemplate(
R&Rt
read_templateR3R+texc_infottb_nextttb_frametf_localstclose(R t_ttb((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyt__read_template_hackes
iiiiiicCs�|jj�r�|jd�}|jj|j��|jjs�xR|jD]D\}}}}|jjg|D]}tj	j
||�^ql�qJWq�ndS(sgetting python filestbuild_pyN(Rthas_pure_modulesRRtextendtget_source_filestinclude_package_datat
data_filesRRR(R R@R=tsrc_dirt	filenamestfilename((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyt_add_defaults_python|scCsOy*tjrtj|�n
t�j�Wntk
rJtjd�nXdS(Ns&data_files contains unexpected objects(RtPY2Rt_add_defaults_data_filestsupert	TypeErrorRtwarn(R ((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyRK�s	
cCsKxD|jD]}tjj|�r
dSq
W|jddj|j��dS(Ns,standard file not found: should have one of s, (tREADMESRRtexistsRNR(R tf((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyR�scCs�tjj|||�tjj|d�}ttd�rltjj|�rltj|�|j	d|�n|j
d�j|�dS(Ns	setup.cfgR2R(R&Rtmake_release_treeRRRthasattrRPtunlinkt	copy_fileRtsave_version_info(R tbase_dirtfilestdest((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyRR�s!
cCsStjj|j�stStj|jd��}|j�}WdQX|dj�kS(Ntrbs+# file GENERATED by distutils, do NOT edit
(	RRtisfiletmanifesttFalsetiotopentreadlinetencode(R tfpt
first_line((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyt_manifest_is_not_generated�scCs�tjd|j�t|jd�}x�|D]�}tjryy|jd�}Wqytk
rutjd|�q,qyXn|j	�}|j
d�s,|r�q,n|jj|�q,W|j
�dS(s�Read the manifest file (named by 'self.manifest') and use it to
        fill in 'self.filelist', the list of files to include in the source
        distribution.
        sreading manifest file '%s'RZsUTF-8s"%r not UTF-8 decodable -- skippingt#N(RtinfoR\R_RtPY3tdecodetUnicodeDecodeErrorRNtstript
startswithRRR<(R R\tline((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyt
read_manifest�s
	

N(sformats=Ns6formats for source distribution (comma-separated list)(s	dist-dir=R
sFdirectory to put the source distribution archive(s) in [default: dist](iii(ii(iii(ii(iii(R0R1t__doc__tNonetuser_optionstnegative_opttREADME_EXTENSIONSttupleROR%R'R(Rtstaticmethodt
contextlibtcontextmanagerR.t_sdist__read_template_hackR+R,thas_leaky_handleR7RIRKRRRRdRm(((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyRs:											
	
	
(t	distutilsRtdistutils.command.sdisttcommandRR&RR+R^Rutsetuptools.externRt
py36compatRRtlistt_default_revctrlR
(((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyt<module>scommand/egg_info.pyc000064400000062450151733473640010500 0ustar00�
�fc@s@dZddlmZddlmZddlmZddlm	Z	ddlZddlZddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlmZddlmZdd	lmZdd
lmZddlmZddlmZdd
lmZddlmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&ddl'j(Z(ddl)m*Z*ddlm+Z+d�Z,defd��YZ-defd��YZdefd��YZ.d�Z/d�Z0d�Z1d�Z2d�Z3d�Z4d�Z5d�Z6e7d �Z8d!�Z9d"�Z:dS(#sUsetuptools.command.egg_info

Create a distribution's .egg-info directory and contentsi����(tFileList(tDistutilsInternalError(tconvert_path(tlogN(tsix(tmap(tCommand(tsdist(twalk_revctrl(tedit_config(t	bdist_egg(tparse_requirementst	safe_namet
parse_versiontsafe_versiontyield_linest
EntryPointtiter_entry_pointstto_filename(tglob(t	packagingcCs�d}|jtjj�}tjtj�}d|f}xt|�D]\}}|t|�dk}|dkr�|r�|d7}qG|d||f7}qGnd}t|�}	x�||	krA||}
|
dkr�||d7}nJ|
d	kr||7}n1|
d
kr!|d}||	krB||dkrB|d}n||	krk||dkrk|d}nx*||	kr�||dkr�|d}qnW||	kr�|tj|
�7}q4||d|!}d}
|ddkr�d
}
|d}n|
tj|�7}
|d|
f7}|}n|tj|
�7}|d7}q�W|sG||7}qGqGW|d7}tj|dtj	tj
B�S(s�
    Translate a file path glob like '*.txt' in to a regular expression.
    This differs from fnmatch.translate which allows wildcards to match
    directory separators. It also knows about '**/' which matches any number of
    directories.
    ts[^%s]is**s.*s
(?:%s+%s)*it*t?t[t!t]t^s[%s]s\Ztflags(tsplittostpathtseptretescapet	enumeratetlentcompilet	MULTILINEtDOTALL(RtpattchunksR t
valid_chartctchunkt
last_chunktit	chunk_lentchartinner_itinnert
char_class((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyttranslate_pattern$sV







	
tegg_infocBs�eZdZddddgZdgZidd
6Zd
�Zed��Zej	d��Zd�Z
d�Zed�Z
d�Zd�Zd�Zd�Zd�Zd�Zd�ZRS(s+create a distribution's .egg-info directorys	egg-base=tesLdirectory containing .egg-info directories (default: top of the source tree)stag-datetds0Add date stamp (e.g. 20050528) to version numbers
tag-build=tbs-Specify explicit tag to add to version numbersno-datetDs"Don't include date stamp [default]cCsLd|_d|_d|_d|_d|_d|_t|_d|_	dS(Ni(
tNonetegg_nametegg_versiontegg_baseR5t	tag_buildttag_datetFalsetbroken_egg_infotvtags(tself((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytinitialize_options�s							cCsdS(N((RC((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyttag_svn_revision�scCsdS(N((RCtvalue((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRE�scCs@tj�}|j�|d<d|d<t|td|��dS(s�
        Materialize the value of date into the
        build tag. Install build keys in a deterministic order
        to avoid arbitrary reordering on subsequent builds.
        R>iR?R5N(tcollectionstOrderedDictttagsR	tdict(RCtfilenameR5((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytsave_version_info�s
cCs�t|jj��|_|j�|_|j�|_t|j�}yKt	|t
jj�}|ridnd}t
t||j|jf��Wn3tk
r�tjjd|j|jf��nX|jdkr|jj}|p�ijdtj�|_n|jd�t|j�d|_|jtjkrXtjj|j|j�|_nd|jkrt|j�n|j|jj_|jj }|dk	r�|j!|jj"�kr�|j|_#t|j�|_$d|j_ ndS(Ns%s==%ss%s===%ss2Invalid distribution name or version syntax: %s-%sRR=s	.egg-infot-(%Rtdistributiontget_nameR;RIRBttagged_versionR<R
t
isinstanceRtversiontVersiontlistRt
ValueErrort	distutilsterrorstDistutilsOptionErrorR=R:tpackage_dirtgetRtcurdirtensure_dirnameRR5Rtjointcheck_broken_egg_infotmetadatat
_patched_disttkeytlowert_versiont_parsed_version(RCtparsed_versiont
is_versiontspectdirstpd((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytfinalize_options�s8!
	!
!
$cCsl|r|j|||�nLtjj|�rh|dkrX|rXtjd||�dS|j|�ndS(s�Write `data` to `filename` or delete if empty

        If `data` is non-empty, this routine is the same as ``write_file()``.
        If `data` is empty but not ``None``, this is the same as calling
        ``delete_file(filename)`.  If `data` is ``None``, then this is a no-op
        unless `filename` exists, in which case a warning is issued about the
        orphaned file (if `force` is false), or deleted (if `force` is true).
        s$%s not set in setup(), but %s existsN(t
write_fileRRtexistsR:Rtwarntdelete_file(RCtwhatRKtdatatforce((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytwrite_or_delete_file�s	
cCsdtjd||�tjr.|jd�}n|js`t|d�}|j|�|j�ndS(s�Write `data` to `filename` (if not a dry run) after announcing it

        `what` is used in a log message to identify what is being written
        to the file.
        swriting %s to %ssutf-8twbN(	RtinfoRtPY3tencodetdry_runtopentwritetclose(RCRoRKRptf((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRk�s		
cCs-tjd|�|js)tj|�ndS(s8Delete `filename` (if not a dry run) after announcing itsdeleting %sN(RRtRwRtunlink(RCRK((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRn�s	cCsE|jj�}|jr4|j|j�r4t|�St||j�S(N(RNtget_versionRBtendswithR(RCRR((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRPs
cCs�|j|j�|jj}xXtd�D]J}|jd|�|j�}|||jtj	j
|j|j��q)Wtj	j
|jd�}tj	j|�r�|j|�n|j
�dS(Nsegg_info.writerst	installersnative_libs.txt(tmkpathR5RNtfetch_build_eggRtrequiretresolvetnameRRR]RlRntfind_sources(RCRteptwritertnl((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytrun	s,cCsBd}|jr||j7}n|jr>|tjd�7}n|S(NRs-%Y%m%d(R>R?ttimetstrftime(RCRR((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRIs		cCsJtjj|jd�}t|j�}||_|j�|j|_dS(s"Generate SOURCES.txt manifest filesSOURCES.txtN(	RRR]R5tmanifest_makerRNtmanifestR�tfilelist(RCtmanifest_filenametmm((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR� s
	
cCs�|jd}|jtjkr:tjj|j|�}ntjj|�r�tjddddd||j	�|j	|_
||_	ndS(Ns	.egg-infoRMiNs�
Note: Your current .egg-info directory has a '-' in its name;
this will not work correctly with "setup.py develop".

Please rename %s to %s to correct this problem.
(R;R=RR[RR]RlRRmR5RA(RCtbei((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR^(s

(s	egg-base=R6sLdirectory containing .egg-info directories (default: top of the source tree)(stag-dateR7s0Add date stamp (e.g. 20050528) to version number(s
tag-build=R8s-Specify explicit tag to add to version number(sno-dateR9s"Don't include date stamp [default](t__name__t
__module__tdescriptiontuser_optionstboolean_optionstnegative_optRDtpropertyREtsetterRLRjR@RrRkRnRPR�RIR�R^(((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR5ws*		
	
	
	/						RcBs�eZd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d	�Zd
�Zd�Z
d�Zd
�ZRS(cCs�|j|�\}}}}|dkrw|jddj|��x�|D](}|j|�sHtjd|�qHqHWnx|dkr�|jddj|��xO|D](}|j|�s�tjd|�q�q�Wn|dkr/|jd	dj|��x�|D](}|j|�stjd
|�qqWn�|dkr�|jddj|��x�|D](}|j|�s\tjd
|�q\q\Wnd|dkr�|jd|dj|�f�x5|D].}|j	||�s�tjd||�q�q�Wn�|dkr[|jd|dj|�f�x�|D].}|j
||�s&tjd||�q&q&Wn�|dkr�|jd|�|j|�s�tjd|�q�nR|dkr�|jd|�|j|�s�tjd|�q�nt
d|��dS(Ntincludesinclude t s%warning: no files found matching '%s'texcludesexclude s9warning: no previously-included files found matching '%s'sglobal-includesglobal-include s>warning: no files found matching '%s' anywhere in distributionsglobal-excludesglobal-exclude sRwarning: no previously-included files matching '%s' found anywhere in distributionsrecursive-includesrecursive-include %s %ss:warning: no files found matching '%s' under directory '%s'srecursive-excludesrecursive-exclude %s %ssNwarning: no previously-included files matching '%s' found under directory '%s'tgraftsgraft s+warning: no directories found matching '%s'tprunesprune s6no previously-included directories found matching '%s's'this cannot happen: invalid action '%s'(t_parse_template_linetdebug_printR]R�RRmR�tglobal_includetglobal_excludetrecursive_includetrecursive_excludeR�R�R(RCtlinetactiontpatternstdirtdir_patterntpattern((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytprocess_template_line;sd

	
	
		
		
		
	
cCsrt}xett|j�ddd�D]D}||j|�r&|jd|j|�|j|=t}q&q&W|S(s�
        Remove all files from the file list that match the predicate.
        Return True if any matching files were removed
        ii����s
 removing (R@trangeR$tfilesR�tTrue(RCt	predicatetfoundR.((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyt
_remove_files�s&

cCsHgt|�D]}tjj|�s
|^q
}|j|�t|�S(s#Include files that match 'pattern'.(RRRtisdirtextendtbool(RCR�R{R�((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR��s1
cCst|�}|j|j�S(s#Exclude files that match 'pattern'.(R4R�tmatch(RCR�R�((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR��scCsftjj|d|�}gt|dt�D]}tjj|�s+|^q+}|j|�t|�S(sN
        Include all files anywhere in 'dir/' that match the pattern.
        s**t	recursive(RRR]RR�R�R�R�(RCR�R�tfull_patternR{R�((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR��s

cCs.ttjj|d|��}|j|j�S(sM
        Exclude any file anywhere in 'dir/' that match the pattern.
        s**(R4RRR]R�R�(RCR�R�R�((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR��scCsOgt|�D]%}tjj|�D]}|^q#q
}|j|�t|�S(sInclude all files from 'dir/'.(RRVR�tfindallR�R�(RCR�t	match_dirtitemR�((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR��s
%
cCs+ttjj|d��}|j|j�S(sFilter out files from 'dir/'.s**(R4RRR]R�R�(RCR�R�((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR��scCsy|jdkr|j�nttjjd|��}g|jD]}|j|�rA|^qA}|j|�t	|�S(s�
        Include all files anywhere in the current directory that match the
        pattern. This is very inefficient on large file trees.
        s**N(
tallfilesR:R�R4RRR]R�R�R�(RCR�R�R{R�((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR��s
+
cCs+ttjjd|��}|j|j�S(sD
        Exclude all files anywhere that match the pattern.
        s**(R4RRR]R�R�(RCR�R�((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR��scCsN|jd�r|d }nt|�}|j|�rJ|jj|�ndS(Ns
i����(R~Rt
_safe_pathR�tappend(RCR�R((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR��s

cCs |jjt|j|��dS(N(R�R�tfilterR�(RCtpaths((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR��scCs"tt|j|j��|_dS(s�
        Replace self.files with only safe paths

        Because some owners of FileList manipulate the underlying
        ``files`` attribute directly, this method must be called to
        repair those paths.
        N(RTR�R�R�(RC((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyt_repair�scCs�d}tj|�}|dkr6tjd|�tStj|d�}|dkrktj||d�tSy,tjj	|�s�tjj	|�r�t
SWn*tk
r�tj||tj
��nXdS(Ns!'%s' not %s encodable -- skippings''%s' in unexpected encoding -- skippingsutf-8(t
unicode_utilstfilesys_decodeR:RRmR@t
try_encodeRRRlR�tUnicodeEncodeErrortsystgetfilesystemencoding(RCRtenc_warntu_patht	utf8_path((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR��s$
(R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�(((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR8s	I	
			
		
						
R�cBseeZdZd�Zd�Zd�Zd�Zd�Zd�Ze	d��Z
d�Zd	�ZRS(
sMANIFEST.incCs(d|_d|_d|_d|_dS(Ni(tuse_defaultsR�t
manifest_onlytforce_manifest(RC((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRD�s			cCsdS(N((RC((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRjscCs�t�|_tjj|j�s.|j�n|j�tjj|j�rZ|j	�n|j
�|jj�|jj�|j�dS(N(
RR�RRRlR�twrite_manifesttadd_defaultsttemplatet
read_templatetprune_file_listtsorttremove_duplicates(RC((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR�s





cCs"tj|�}|jtjd�S(Nt/(R�R�treplaceRR (RCR((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyt_manifest_normalizescCsb|jj�g|jjD]}|j|�^q}d|j}|jt|j|f|�dS(so
        Write the file list in 'self.filelist' to the manifest file
        named by 'self.manifest'.
        swriting manifest file '%s'N(R�R�R�R�R�texecuteRk(RCR{R�tmsg((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR�s
(
cCs&|j|�s"tj||�ndS(N(t_should_suppress_warningRRm(RCR�((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRm$scCstjd|�S(s;
        suppress missing-file warnings from sdist
        sstandard file .*not found(R!R�(R�((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR�(scCs�tj|�|jj|j�|jj|j�tt��}|r[|jj|�n"t	j
j|j�r}|j�n|j
d�}|jj|j�dS(NR5(RR�R�R�R�R�RTRR�RRRlt
read_manifesttget_finalized_commandR�R5(RCtrcfilestei_cmd((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR�/s

cCsy|jd�}|jj�}|jj|j�|jj|�tjtj	�}|jj
d|d|dd�dS(Ntbuilds(^|s)(RCS|CVS|\.svn)tis_regexi(R�RNtget_fullnameR�R�t
build_baseR!R"RR texclude_pattern(RCR�tbase_dirR ((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR�;s(
R�R�R�RDRjR�R�R�RmtstaticmethodR�R�R�(((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR��s							cCsGdj|�}|jd�}t|d��}|j|�WdQXdS(s{Create a file with the specified name and write 'contents' (a
    sequence of strings without line terminators) to it.
    s
sutf-8RsN(R]RvRxRy(RKtcontentsR{((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRkEscCs�tjd|�|js�|jj}|j|j|_}|j|j|_}z|j	|j
�Wd|||_|_Xt|jdd�}t
j|j
|�ndS(Ns
writing %stzip_safe(RRtRwRNR_R<RRR;R�twrite_pkg_infoR5tgetattrR:R
twrite_safety_flag(tcmdtbasenameRKR_toldvertoldnametsafe((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR�Rs	cCs&tjj|�r"tjd�ndS(NssWARNING: 'depends.txt' is not used by setuptools 0.6!
Use the install_requires/extras_require setup() args instead.(RRRlRRm(R�R�RK((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytwarn_depends_obsoleteescCs;t|pd�}d�}t||�}|j|�dS(NcSs|dS(Ns
((R�((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyt<lambda>oR((RRt
writelines(tstreamtreqstlinest	append_cr((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyt_write_requirementsms	cCs�|j}tj�}t||j�|jp1i}x>t|�D]0}|jdjt	���t|||�qAW|j
d||j��dS(Ns
[{extra}]
trequirements(RNRtStringIOR�tinstall_requirestextras_requiretsortedRytformattvarsRrtgetvalue(R�R�RKtdistRpR�textra((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytwrite_requirementsts	cCs<tj�}t||jj�|jd||j��dS(Nssetup-requirements(tioR�R�RNtsetup_requiresRrR�(R�R�RKRp((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytwrite_setup_requirementsscCsetjg|jj�D]}|jdd�d^q�}|jd|djt|��d�dS(Nt.iistop-level namess
(RJtfromkeysRNtiter_distribution_namesRRkR]R�(R�R�RKtktpkgs((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytwrite_toplevel_names�s2cCst|||t�dS(N(t	write_argR�(R�R�RK((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyt
overwrite_arg�scCsgtjj|�d}t|j|d�}|dk	rMdj|�d}n|j||||�dS(Nis
(RRtsplitextR�RNR:R]Rr(R�R�RKRqtargnameRF((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR�s
cCs�|jj}t|tj�s*|dkr3|}n�|dk	r�g}x�t|j��D]n\}}t|tj�s�tj	||�}dj
ttt|j
����}n|jd||f�qXWdj
|�}n|jd||t�dS(Ns
s	[%s]
%s

Rsentry points(RNtentry_pointsRQRtstring_typesR:R�titemsRtparse_groupR]RtstrtvaluesR�RrR�(R�R�RKR�RptsectionR�((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyt
write_entries�s	'cCs}tjdt�tjjd�rytjd��C}x9|D]1}tj	d|�}|r;t
|jd��Sq;WWdQXndS(sd
    Get a -r### off of PKG-INFO Version in case this is an sdist of
    a subversion revision.
    s$get_pkg_info_revision is deprecated.sPKG-INFOsVersion:.*-r(\d+)\s*$iNi(twarningsRmtDeprecationWarningRRRlRRxR!R�tinttgroup(R{R�R�((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytget_pkg_info_revision�s
 (;t__doc__tdistutils.filelistRt	_FileListtdistutils.errorsRtdistutils.utilRRVRRR!R�RRR�RGtsetuptools.externRtsetuptools.extern.six.movesRt
setuptoolsRtsetuptools.command.sdistRRtsetuptools.command.setoptR	tsetuptools.commandR
t
pkg_resourcesRRR
RRRRRtsetuptools.unicode_utilsR�tsetuptools.globRRR4R5R�RkR�R�R�RRR
RR@RRR(((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyt<module>sN:	S��I	
						
		command/rotate.py000064400000004164151733473640010054 0ustar00from distutils.util import convert_path
from distutils import log
from distutils.errors import DistutilsOptionError
import os
import shutil

from setuptools.extern import six

from setuptools import Command


class rotate(Command):
    """Delete older distributions"""

    description = "delete older distributions, keeping N newest files"
    user_options = [
        ('match=', 'm', "patterns to match (required)"),
        ('dist-dir=', 'd', "directory where the distributions are"),
        ('keep=', 'k', "number of matching distributions to keep"),
    ]

    boolean_options = []

    def initialize_options(self):
        self.match = None
        self.dist_dir = None
        self.keep = None

    def finalize_options(self):
        if self.match is None:
            raise DistutilsOptionError(
                "Must specify one or more (comma-separated) match patterns "
                "(e.g. '.zip' or '.egg')"
            )
        if self.keep is None:
            raise DistutilsOptionError("Must specify number of files to keep")
        try:
            self.keep = int(self.keep)
        except ValueError:
            raise DistutilsOptionError("--keep must be an integer")
        if isinstance(self.match, six.string_types):
            self.match = [
                convert_path(p.strip()) for p in self.match.split(',')
            ]
        self.set_undefined_options('bdist', ('dist_dir', 'dist_dir'))

    def run(self):
        self.run_command("egg_info")
        from glob import glob

        for pattern in self.match:
            pattern = self.distribution.get_name() + '*' + pattern
            files = glob(os.path.join(self.dist_dir, pattern))
            files = [(os.path.getmtime(f), f) for f in files]
            files.sort()
            files.reverse()

            log.info("%d file(s) matching %s", len(files), pattern)
            files = files[self.keep:]
            for (t, f) in files:
                log.info("Deleting %s", f)
                if not self.dry_run:
                    if os.path.isdir(f):
                        shutil.rmtree(f)
                    else:
                        os.unlink(f)
command/alias.pyo000064400000006032151733473640010022 0ustar00�
�fc@shddlmZddlmZddlmZmZmZd�Zdefd��YZ	d�Z
dS(	i����(tDistutilsOptionError(tmap(tedit_configtoption_basetconfig_filecCsJx$dD]}||krt|�SqW|j�|gkrFt|�S|S(s4Quote an argument for later parsing by shlex.split()t"t's\t#(RRs\R(treprtsplit(targtc((s</usr/lib/python2.7/site-packages/setuptools/command/alias.pytshquotes

taliascBsUeZdZdZeZdgejZejdgZd�Z	d�Z
d�ZRS(	s3Define a shortcut that invokes one or more commandss0define a shortcut to invoke one or more commandstremovetrsremove (unset) the aliascCs#tj|�d|_d|_dS(N(Rtinitialize_optionstNonetargsR(tself((s</usr/lib/python2.7/site-packages/setuptools/command/alias.pyRs
	cCs>tj|�|jr:t|j�dkr:td��ndS(NisFMust specify exactly one argument (the alias name) when using --remove(Rtfinalize_optionsRtlenRR(R((s</usr/lib/python2.7/site-packages/setuptools/command/alias.pyR#s
cCs	|jjd�}|jsNdGHdGHx"|D]}dt||�fGHq,WdSt|j�dkr�|j\}|jr�d}q�||kr�dt||�fGHdSd|GHdSn,|jd}djtt	|jd��}t
|jii||6d6|j�dS(	NtaliasessCommand Aliasess---------------ssetup.py aliasis No alias definition found for %rit (
tdistributiontget_option_dictRtformat_aliasRRRtjoinRRRtfilenametdry_run(RRR
tcommand((s</usr/lib/python2.7/site-packages/setuptools/command/alias.pytrun+s&	
			
(RRsremove (unset) the alias(t__name__t
__module__t__doc__tdescriptiontTruetcommand_consumes_argumentsRtuser_optionstboolean_optionsRRR(((s</usr/lib/python2.7/site-packages/setuptools/command/alias.pyR
s
		cCs{||\}}|td�kr+d}n@|td�krFd}n%|td�krad}n
d|}||d|S(	Ntglobals--global-config tusers--user-config tlocalts
--filename=%rR(R(tnameRtsourceR((s</usr/lib/python2.7/site-packages/setuptools/command/alias.pyRFs			
N(tdistutils.errorsRtsetuptools.extern.six.movesRtsetuptools.command.setoptRRRRR
R(((s</usr/lib/python2.7/site-packages/setuptools/command/alias.pyt<module>s
	
4command/bdist_wininst.py000064400000001175151733473640011435 0ustar00import distutils.command.bdist_wininst as orig


class bdist_wininst(orig.bdist_wininst):
    def reinitialize_command(self, command, reinit_subcommands=0):
        """
        Supplement reinitialize_command to work around
        http://bugs.python.org/issue20819
        """
        cmd = self.distribution.reinitialize_command(
            command, reinit_subcommands)
        if command in ('install', 'install_lib'):
            cmd.install_lib = None
        return cmd

    def run(self):
        self._is_running = True
        try:
            orig.bdist_wininst.run(self)
        finally:
            self._is_running = False
command/upload.pyo000064400000003144151733473640010216 0ustar00�
�fc@s9ddlZddlmZdejfd��YZdS(i����N(tuploadRcBs)eZdZd�Zd�Zd�ZRS(sa
    Override default upload behavior to obtain password
    in a variety of different ways.
    cCsPtjj|�|jp"tj�|_|jpF|j�pF|j�|_dS(N(	torigRtfinalize_optionstusernametgetpasstgetusertpasswordt_load_password_from_keyringt_prompt_for_password(tself((s=/usr/lib/python2.7/site-packages/setuptools/command/upload.pyRs		cCs>y&td�}|j|j|j�SWntk
r9nXdS(sM
        Attempt to load password from keyring. Suppress Exceptions.
        tkeyringN(t
__import__tget_passwordt
repositoryRt	Exception(R	R
((s=/usr/lib/python2.7/site-packages/setuptools/command/upload.pyRs

cCs,ytj�SWnttfk
r'nXdS(sH
        Prompt for a password on the tty. Suppress Exceptions.
        N(RRtKeyboardInterrupt(R	((s=/usr/lib/python2.7/site-packages/setuptools/command/upload.pyR#s(t__name__t
__module__t__doc__RRR(((s=/usr/lib/python2.7/site-packages/setuptools/command/upload.pyRs		
(Rtdistutils.commandRR(((s=/usr/lib/python2.7/site-packages/setuptools/command/upload.pyt<module>scommand/egg_info.pyo000064400000062450151733473650010515 0ustar00�
�fc@s@dZddlmZddlmZddlmZddlm	Z	ddlZddlZddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlmZddlmZdd	lmZdd
lmZddlmZddlmZdd
lmZddlmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&ddl'j(Z(ddl)m*Z*ddlm+Z+d�Z,defd��YZ-defd��YZdefd��YZ.d�Z/d�Z0d�Z1d�Z2d�Z3d�Z4d�Z5d�Z6e7d �Z8d!�Z9d"�Z:dS(#sUsetuptools.command.egg_info

Create a distribution's .egg-info directory and contentsi����(tFileList(tDistutilsInternalError(tconvert_path(tlogN(tsix(tmap(tCommand(tsdist(twalk_revctrl(tedit_config(t	bdist_egg(tparse_requirementst	safe_namet
parse_versiontsafe_versiontyield_linest
EntryPointtiter_entry_pointstto_filename(tglob(t	packagingcCs�d}|jtjj�}tjtj�}d|f}xt|�D]\}}|t|�dk}|dkr�|r�|d7}qG|d||f7}qGnd}t|�}	x�||	krA||}
|
dkr�||d7}nJ|
d	kr||7}n1|
d
kr!|d}||	krB||dkrB|d}n||	krk||dkrk|d}nx*||	kr�||dkr�|d}qnW||	kr�|tj|
�7}q4||d|!}d}
|ddkr�d
}
|d}n|
tj|�7}
|d|
f7}|}n|tj|
�7}|d7}q�W|sG||7}qGqGW|d7}tj|dtj	tj
B�S(s�
    Translate a file path glob like '*.txt' in to a regular expression.
    This differs from fnmatch.translate which allows wildcards to match
    directory separators. It also knows about '**/' which matches any number of
    directories.
    ts[^%s]is**s.*s
(?:%s+%s)*it*t?t[t!t]t^s[%s]s\Ztflags(tsplittostpathtseptretescapet	enumeratetlentcompilet	MULTILINEtDOTALL(RtpattchunksR t
valid_chartctchunkt
last_chunktit	chunk_lentchartinner_itinnert
char_class((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyttranslate_pattern$sV







	
tegg_infocBs�eZdZddddgZdgZidd
6Zd
�Zed��Zej	d��Zd�Z
d�Zed�Z
d�Zd�Zd�Zd�Zd�Zd�Zd�ZRS(s+create a distribution's .egg-info directorys	egg-base=tesLdirectory containing .egg-info directories (default: top of the source tree)stag-datetds0Add date stamp (e.g. 20050528) to version numbers
tag-build=tbs-Specify explicit tag to add to version numbersno-datetDs"Don't include date stamp [default]cCsLd|_d|_d|_d|_d|_d|_t|_d|_	dS(Ni(
tNonetegg_nametegg_versiontegg_baseR5t	tag_buildttag_datetFalsetbroken_egg_infotvtags(tself((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytinitialize_options�s							cCsdS(N((RC((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyttag_svn_revision�scCsdS(N((RCtvalue((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRE�scCs@tj�}|j�|d<d|d<t|td|��dS(s�
        Materialize the value of date into the
        build tag. Install build keys in a deterministic order
        to avoid arbitrary reordering on subsequent builds.
        R>iR?R5N(tcollectionstOrderedDictttagsR	tdict(RCtfilenameR5((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytsave_version_info�s
cCs�t|jj��|_|j�|_|j�|_t|j�}yKt	|t
jj�}|ridnd}t
t||j|jf��Wn3tk
r�tjjd|j|jf��nX|jdkr|jj}|p�ijdtj�|_n|jd�t|j�d|_|jtjkrXtjj|j|j�|_nd|jkrt|j�n|j|jj_|jj }|dk	r�|j!|jj"�kr�|j|_#t|j�|_$d|j_ ndS(Ns%s==%ss%s===%ss2Invalid distribution name or version syntax: %s-%sRR=s	.egg-infot-(%Rtdistributiontget_nameR;RIRBttagged_versionR<R
t
isinstanceRtversiontVersiontlistRt
ValueErrort	distutilsterrorstDistutilsOptionErrorR=R:tpackage_dirtgetRtcurdirtensure_dirnameRR5Rtjointcheck_broken_egg_infotmetadatat
_patched_disttkeytlowert_versiont_parsed_version(RCtparsed_versiont
is_versiontspectdirstpd((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytfinalize_options�s8!
	!
!
$cCsl|r|j|||�nLtjj|�rh|dkrX|rXtjd||�dS|j|�ndS(s�Write `data` to `filename` or delete if empty

        If `data` is non-empty, this routine is the same as ``write_file()``.
        If `data` is empty but not ``None``, this is the same as calling
        ``delete_file(filename)`.  If `data` is ``None``, then this is a no-op
        unless `filename` exists, in which case a warning is issued about the
        orphaned file (if `force` is false), or deleted (if `force` is true).
        s$%s not set in setup(), but %s existsN(t
write_fileRRtexistsR:Rtwarntdelete_file(RCtwhatRKtdatatforce((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytwrite_or_delete_file�s	
cCsdtjd||�tjr.|jd�}n|js`t|d�}|j|�|j�ndS(s�Write `data` to `filename` (if not a dry run) after announcing it

        `what` is used in a log message to identify what is being written
        to the file.
        swriting %s to %ssutf-8twbN(	RtinfoRtPY3tencodetdry_runtopentwritetclose(RCRoRKRptf((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRk�s		
cCs-tjd|�|js)tj|�ndS(s8Delete `filename` (if not a dry run) after announcing itsdeleting %sN(RRtRwRtunlink(RCRK((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRn�s	cCsE|jj�}|jr4|j|j�r4t|�St||j�S(N(RNtget_versionRBtendswithR(RCRR((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRPs
cCs�|j|j�|jj}xXtd�D]J}|jd|�|j�}|||jtj	j
|j|j��q)Wtj	j
|jd�}tj	j|�r�|j|�n|j
�dS(Nsegg_info.writerst	installersnative_libs.txt(tmkpathR5RNtfetch_build_eggRtrequiretresolvetnameRRR]RlRntfind_sources(RCRteptwritertnl((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytrun	s,cCsBd}|jr||j7}n|jr>|tjd�7}n|S(NRs-%Y%m%d(R>R?ttimetstrftime(RCRR((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRIs		cCsJtjj|jd�}t|j�}||_|j�|j|_dS(s"Generate SOURCES.txt manifest filesSOURCES.txtN(	RRR]R5tmanifest_makerRNtmanifestR�tfilelist(RCtmanifest_filenametmm((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR� s
	
cCs�|jd}|jtjkr:tjj|j|�}ntjj|�r�tjddddd||j	�|j	|_
||_	ndS(Ns	.egg-infoRMiNs�
Note: Your current .egg-info directory has a '-' in its name;
this will not work correctly with "setup.py develop".

Please rename %s to %s to correct this problem.
(R;R=RR[RR]RlRRmR5RA(RCtbei((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR^(s

(s	egg-base=R6sLdirectory containing .egg-info directories (default: top of the source tree)(stag-dateR7s0Add date stamp (e.g. 20050528) to version number(s
tag-build=R8s-Specify explicit tag to add to version number(sno-dateR9s"Don't include date stamp [default](t__name__t
__module__tdescriptiontuser_optionstboolean_optionstnegative_optRDtpropertyREtsetterRLRjR@RrRkRnRPR�RIR�R^(((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR5ws*		
	
	
	/						RcBs�eZd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d	�Zd
�Zd�Z
d�Zd
�ZRS(cCs�|j|�\}}}}|dkrw|jddj|��x�|D](}|j|�sHtjd|�qHqHWnx|dkr�|jddj|��xO|D](}|j|�s�tjd|�q�q�Wn|dkr/|jd	dj|��x�|D](}|j|�stjd
|�qqWn�|dkr�|jddj|��x�|D](}|j|�s\tjd
|�q\q\Wnd|dkr�|jd|dj|�f�x5|D].}|j	||�s�tjd||�q�q�Wn�|dkr[|jd|dj|�f�x�|D].}|j
||�s&tjd||�q&q&Wn�|dkr�|jd|�|j|�s�tjd|�q�nR|dkr�|jd|�|j|�s�tjd|�q�nt
d|��dS(Ntincludesinclude t s%warning: no files found matching '%s'texcludesexclude s9warning: no previously-included files found matching '%s'sglobal-includesglobal-include s>warning: no files found matching '%s' anywhere in distributionsglobal-excludesglobal-exclude sRwarning: no previously-included files matching '%s' found anywhere in distributionsrecursive-includesrecursive-include %s %ss:warning: no files found matching '%s' under directory '%s'srecursive-excludesrecursive-exclude %s %ssNwarning: no previously-included files matching '%s' found under directory '%s'tgraftsgraft s+warning: no directories found matching '%s'tprunesprune s6no previously-included directories found matching '%s's'this cannot happen: invalid action '%s'(t_parse_template_linetdebug_printR]R�RRmR�tglobal_includetglobal_excludetrecursive_includetrecursive_excludeR�R�R(RCtlinetactiontpatternstdirtdir_patterntpattern((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytprocess_template_line;sd

	
	
		
		
		
	
cCsrt}xett|j�ddd�D]D}||j|�r&|jd|j|�|j|=t}q&q&W|S(s�
        Remove all files from the file list that match the predicate.
        Return True if any matching files were removed
        ii����s
 removing (R@trangeR$tfilesR�tTrue(RCt	predicatetfoundR.((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyt
_remove_files�s&

cCsHgt|�D]}tjj|�s
|^q
}|j|�t|�S(s#Include files that match 'pattern'.(RRRtisdirtextendtbool(RCR�R{R�((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR��s1
cCst|�}|j|j�S(s#Exclude files that match 'pattern'.(R4R�tmatch(RCR�R�((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR��scCsftjj|d|�}gt|dt�D]}tjj|�s+|^q+}|j|�t|�S(sN
        Include all files anywhere in 'dir/' that match the pattern.
        s**t	recursive(RRR]RR�R�R�R�(RCR�R�tfull_patternR{R�((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR��s

cCs.ttjj|d|��}|j|j�S(sM
        Exclude any file anywhere in 'dir/' that match the pattern.
        s**(R4RRR]R�R�(RCR�R�R�((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR��scCsOgt|�D]%}tjj|�D]}|^q#q
}|j|�t|�S(sInclude all files from 'dir/'.(RRVR�tfindallR�R�(RCR�t	match_dirtitemR�((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR��s
%
cCs+ttjj|d��}|j|j�S(sFilter out files from 'dir/'.s**(R4RRR]R�R�(RCR�R�((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR��scCsy|jdkr|j�nttjjd|��}g|jD]}|j|�rA|^qA}|j|�t	|�S(s�
        Include all files anywhere in the current directory that match the
        pattern. This is very inefficient on large file trees.
        s**N(
tallfilesR:R�R4RRR]R�R�R�(RCR�R�R{R�((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR��s
+
cCs+ttjjd|��}|j|j�S(sD
        Exclude all files anywhere that match the pattern.
        s**(R4RRR]R�R�(RCR�R�((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR��scCsN|jd�r|d }nt|�}|j|�rJ|jj|�ndS(Ns
i����(R~Rt
_safe_pathR�tappend(RCR�R((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR��s

cCs |jjt|j|��dS(N(R�R�tfilterR�(RCtpaths((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR��scCs"tt|j|j��|_dS(s�
        Replace self.files with only safe paths

        Because some owners of FileList manipulate the underlying
        ``files`` attribute directly, this method must be called to
        repair those paths.
        N(RTR�R�R�(RC((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyt_repair�scCs�d}tj|�}|dkr6tjd|�tStj|d�}|dkrktj||d�tSy,tjj	|�s�tjj	|�r�t
SWn*tk
r�tj||tj
��nXdS(Ns!'%s' not %s encodable -- skippings''%s' in unexpected encoding -- skippingsutf-8(t
unicode_utilstfilesys_decodeR:RRmR@t
try_encodeRRRlR�tUnicodeEncodeErrortsystgetfilesystemencoding(RCRtenc_warntu_patht	utf8_path((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR��s$
(R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�(((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR8s	I	
			
		
						
R�cBseeZdZd�Zd�Zd�Zd�Zd�Zd�Ze	d��Z
d�Zd	�ZRS(
sMANIFEST.incCs(d|_d|_d|_d|_dS(Ni(tuse_defaultsR�t
manifest_onlytforce_manifest(RC((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRD�s			cCsdS(N((RC((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRjscCs�t�|_tjj|j�s.|j�n|j�tjj|j�rZ|j	�n|j
�|jj�|jj�|j�dS(N(
RR�RRRlR�twrite_manifesttadd_defaultsttemplatet
read_templatetprune_file_listtsorttremove_duplicates(RC((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR�s





cCs"tj|�}|jtjd�S(Nt/(R�R�treplaceRR (RCR((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyt_manifest_normalizescCsb|jj�g|jjD]}|j|�^q}d|j}|jt|j|f|�dS(so
        Write the file list in 'self.filelist' to the manifest file
        named by 'self.manifest'.
        swriting manifest file '%s'N(R�R�R�R�R�texecuteRk(RCR{R�tmsg((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR�s
(
cCs&|j|�s"tj||�ndS(N(t_should_suppress_warningRRm(RCR�((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRm$scCstjd|�S(s;
        suppress missing-file warnings from sdist
        sstandard file .*not found(R!R�(R�((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR�(scCs�tj|�|jj|j�|jj|j�tt��}|r[|jj|�n"t	j
j|j�r}|j�n|j
d�}|jj|j�dS(NR5(RR�R�R�R�R�RTRR�RRRlt
read_manifesttget_finalized_commandR�R5(RCtrcfilestei_cmd((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR�/s

cCsy|jd�}|jj�}|jj|j�|jj|�tjtj	�}|jj
d|d|dd�dS(Ntbuilds(^|s)(RCS|CVS|\.svn)tis_regexi(R�RNtget_fullnameR�R�t
build_baseR!R"RR texclude_pattern(RCR�tbase_dirR ((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR�;s(
R�R�R�RDRjR�R�R�RmtstaticmethodR�R�R�(((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR��s							cCsGdj|�}|jd�}t|d��}|j|�WdQXdS(s{Create a file with the specified name and write 'contents' (a
    sequence of strings without line terminators) to it.
    s
sutf-8RsN(R]RvRxRy(RKtcontentsR{((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyRkEscCs�tjd|�|js�|jj}|j|j|_}|j|j|_}z|j	|j
�Wd|||_|_Xt|jdd�}t
j|j
|�ndS(Ns
writing %stzip_safe(RRtRwRNR_R<RRR;R�twrite_pkg_infoR5tgetattrR:R
twrite_safety_flag(tcmdtbasenameRKR_toldvertoldnametsafe((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR�Rs	cCs&tjj|�r"tjd�ndS(NssWARNING: 'depends.txt' is not used by setuptools 0.6!
Use the install_requires/extras_require setup() args instead.(RRRlRRm(R�R�RK((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytwarn_depends_obsoleteescCs;t|pd�}d�}t||�}|j|�dS(NcSs|dS(Ns
((R�((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyt<lambda>oR((RRt
writelines(tstreamtreqstlinest	append_cr((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyt_write_requirementsms	cCs�|j}tj�}t||j�|jp1i}x>t|�D]0}|jdjt	���t|||�qAW|j
d||j��dS(Ns
[{extra}]
trequirements(RNRtStringIOR�tinstall_requirestextras_requiretsortedRytformattvarsRrtgetvalue(R�R�RKtdistRpR�textra((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytwrite_requirementsts	cCs<tj�}t||jj�|jd||j��dS(Nssetup-requirements(tioR�R�RNtsetup_requiresRrR�(R�R�RKRp((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytwrite_setup_requirementsscCsetjg|jj�D]}|jdd�d^q�}|jd|djt|��d�dS(Nt.iistop-level namess
(RJtfromkeysRNtiter_distribution_namesRRkR]R�(R�R�RKtktpkgs((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytwrite_toplevel_names�s2cCst|||t�dS(N(t	write_argR�(R�R�RK((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyt
overwrite_arg�scCsgtjj|�d}t|j|d�}|dk	rMdj|�d}n|j||||�dS(Nis
(RRtsplitextR�RNR:R]Rr(R�R�RKRqtargnameRF((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyR�s
cCs�|jj}t|tj�s*|dkr3|}n�|dk	r�g}x�t|j��D]n\}}t|tj�s�tj	||�}dj
ttt|j
����}n|jd||f�qXWdj
|�}n|jd||t�dS(Ns
s	[%s]
%s

Rsentry points(RNtentry_pointsRQRtstring_typesR:R�titemsRtparse_groupR]RtstrtvaluesR�RrR�(R�R�RKR�RptsectionR�((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyt
write_entries�s	'cCs}tjdt�tjjd�rytjd��C}x9|D]1}tj	d|�}|r;t
|jd��Sq;WWdQXndS(sd
    Get a -r### off of PKG-INFO Version in case this is an sdist of
    a subversion revision.
    s$get_pkg_info_revision is deprecated.sPKG-INFOsVersion:.*-r(\d+)\s*$iNi(twarningsRmtDeprecationWarningRRRlRRxR!R�tinttgroup(R{R�R�((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pytget_pkg_info_revision�s
 (;t__doc__tdistutils.filelistRt	_FileListtdistutils.errorsRtdistutils.utilRRVRRR!R�RRR�RGtsetuptools.externRtsetuptools.extern.six.movesRt
setuptoolsRtsetuptools.command.sdistRRtsetuptools.command.setoptR	tsetuptools.commandR
t
pkg_resourcesRRR
RRRRRtsetuptools.unicode_utilsR�tsetuptools.globRRR4R5R�RkR�R�R�RRR
RR@RRR(((s?/usr/lib/python2.7/site-packages/setuptools/command/egg_info.pyt<module>sN:	S��I	
						
		command/develop.pyc000064400000017334151733473650010363 0ustar00�
�fc@s�ddlmZddlmZddlmZmZddlZddlZddl	Z	ddl
mZddlm
Z
mZmZddlmZddlmZddlZd	ejefd
��YZdefd��YZdS(
i����(tconvert_path(tlog(tDistutilsErrortDistutilsOptionErrorN(tsix(tDistributiontPathMetadatatnormalize_path(teasy_install(t
namespacestdevelopcBs�eZdZdZejddgZejdgZeZ	d�Z
d�Zd	�Ze
d
��Zd�Zd�Zd
�Zd�ZRS(sSet up package for developments%install package in 'development mode't	uninstalltusUninstall this source packages	egg-path=s-Set the path to be used in the .egg-link filecCsA|jr)t|_|j�|j�n
|j�|j�dS(N(RtTruet
multi_versiontuninstall_linktuninstall_namespacestinstall_for_developmenttwarn_deprecated_options(tself((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pytruns		


cCs5d|_d|_tj|�d|_d|_dS(Nt.(tNoneRtegg_pathRtinitialize_optionst
setup_pathtalways_copy_from(R((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyR's
		
	cCs�|jd�}|jrCd}|j|jf}t||��n|jg|_tj|�|j�|j	�|j
jtjd��|jd}t
jj|j|�|_|j|_|jdkr�t
jj|j�|_nt|j�}tt
jj|j|j��}||kr9td|��nt|t|t
jj|j��d|j�|_|j|j|j|j�|_dS(Ntegg_infos-Please rename %r to %r before using 'develop's*.eggs	.egg-linksA--egg-path must be a relative path from the install directory to tproject_name(tget_finalized_commandtbroken_egg_infoRRtegg_nametargsRtfinalize_optionstexpand_basedirstexpand_dirst
package_indextscantglobtostpathtjointinstall_dirtegg_linktegg_baseRRtabspathRRRRtdistt_resolve_setup_pathR(RteittemplateR tegg_link_fnttargetR((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyR!.s<	




cCs�|jtjd�jd�}|tjkrGd|jd�d}nttjj|||��}|ttj�kr�t	d|ttj���n|S(s�
        Generate a path from egg_base back to '.' where the
        setup script resides and ensure that path points to the
        setup path from $install_dir/$egg_path.
        t/s../isGCan't get a consistent path to setup script from installation directory(
treplaceR'tseptrstriptcurdirtcountRR(R)R(R,R*Rt
path_to_setuptresolved((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyR/XscCs�tjr�t|jdt�r�|jddd�|jd�|jd�}t|j	�}|jdd|�|jd�|jddd�|jd�|jd�}||_
||j_t
||j�|j_n-|jd�|jddd�|jd�|j�tjr7|jtj�dt_n|j�tjd	|j|j�|js�t|jd
��"}|j|j
d|j�WdQXn|jd|j|j�dS(Ntuse_2to3tbuild_pytinplaceiRR,t	build_extisCreating %s (link to %s)tws
( RtPY3tgetattrtdistributiontFalsetreinitialize_commandtrun_commandRRt	build_libRR.tlocationRRt	_providertinstall_site_pyt
setuptoolstbootstrap_install_fromRRtinstall_namespacesRtinfoR+R,tdry_runtopentwriteRtprocess_distributiontno_deps(Rtbpy_cmdt
build_pathtei_cmdtf((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyRks4


	


	
	$cCs�tjj|j�r�tjd|j|j�t|j�}g|D]}|j�^qD}|j	�||j
g|j
|jgfkr�tjd|�dS|j
s�tj|j�q�n|j
s�|j|j�n|jjr�tjd�ndS(NsRemoving %s (link to %s)s$Link points to %s: uninstall aborteds5Note: you must uninstall or replace scripts manually!(R'R(texistsR+RRNR,RPR7tcloseRRtwarnROtunlinkt
update_pthR.RCtscripts(Rt
egg_link_filetlinetcontents((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyR�s
		cCs�||jk	rtj||�S|j|�x~|jjp>gD]j}tjjt	|��}tjj
|�}tj|��}|j
�}WdQX|j||||�q?WdS(N(R.Rtinstall_egg_scriptstinstall_wrapper_scriptsRCR]R'R(R-RtbasenametioRPtreadtinstall_script(RR.tscript_nametscript_pathtstrmtscript_text((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyRa�s
cCst|�}tj||�S(N(tVersionlessRequirementRRb(RR.((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyRb�s(RRsUninstall this source packageN(s	egg-path=Ns-Set the path to be used in the .egg-link file(t__name__t
__module__t__doc__tdescriptionRtuser_optionsRtboolean_optionsRDtcommand_consumes_argumentsRRR!tstaticmethodR/RRRaRb(((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyR
s
				*	/		RkcBs)eZdZd�Zd�Zd�ZRS(sz
    Adapt a pkg_resources.Distribution to simply return the project
    name as the 'requirement' so that scripts will work across
    multiple versions.

    >>> dist = Distribution(project_name='foo', version='1.0')
    >>> str(dist.as_requirement())
    'foo==1.0'
    >>> adapted_dist = VersionlessRequirement(dist)
    >>> str(adapted_dist.as_requirement())
    'foo'
    cCs
||_dS(N(t_VersionlessRequirement__dist(RR.((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyt__init__�scCst|j|�S(N(RBRt(Rtname((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyt__getattr__�scCs|jS(N(R(R((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pytas_requirement�s(RlRmRnRuRwRx(((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyRk�s		(tdistutils.utilRt	distutilsRtdistutils.errorsRRR'R&Rdtsetuptools.externRt
pkg_resourcesRRRtsetuptools.command.easy_installRRKR	tDevelopInstallerR
tobjectRk(((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyt<module>s�command/install_egg_info.py000064400000004233151733473650012057 0ustar00from distutils import log, dir_util
import os

from setuptools import Command
from setuptools import namespaces
from setuptools.archive_util import unpack_archive
import pkg_resources


class install_egg_info(namespaces.Installer, Command):
    """Install an .egg-info directory for the package"""

    description = "Install an .egg-info directory for the package"

    user_options = [
        ('install-dir=', 'd', "directory to install to"),
    ]

    def initialize_options(self):
        self.install_dir = None

    def finalize_options(self):
        self.set_undefined_options('install_lib',
                                   ('install_dir', 'install_dir'))
        ei_cmd = self.get_finalized_command("egg_info")
        basename = pkg_resources.Distribution(
            None, None, ei_cmd.egg_name, ei_cmd.egg_version
        ).egg_name() + '.egg-info'
        self.source = ei_cmd.egg_info
        self.target = os.path.join(self.install_dir, basename)
        self.outputs = []

    def run(self):
        self.run_command('egg_info')
        if os.path.isdir(self.target) and not os.path.islink(self.target):
            dir_util.remove_tree(self.target, dry_run=self.dry_run)
        elif os.path.exists(self.target):
            self.execute(os.unlink, (self.target,), "Removing " + self.target)
        if not self.dry_run:
            pkg_resources.ensure_directory(self.target)
        self.execute(
            self.copytree, (), "Copying %s to %s" % (self.source, self.target)
        )
        self.install_namespaces()

    def get_outputs(self):
        return self.outputs

    def copytree(self):
        # Copy the .egg-info tree to site-packages
        def skimmer(src, dst):
            # filter out source-control directories; note that 'src' is always
            # a '/'-separated path, regardless of platform.  'dst' is a
            # platform-specific path.
            for skip in '.svn/', 'CVS/':
                if src.startswith(skip) or '/' + skip in src:
                    return None
            self.outputs.append(dst)
            log.debug("Copying %s to %s", src, dst)
            return dst

        unpack_archive(self.source, self.target, skimmer)
command/easy_install.pyo000064400000234705151733473650011433 0ustar00�
�fc@sedZddlmZddlmZddlmZmZddlmZmZm	Z	m
Z
ddlmZm
Z
ddlmZmZddlmZdd	lmZdd
lZdd
lZdd
lZdd
lZdd
lZdd
lZdd
lZdd
lZdd
lZdd
lZdd
lZdd
l Z dd
l!Z!dd
l"Z"dd
l#Z#dd
l$Z$dd
l%Z%ddl&m'Z'ddl(m)Z)m*Z*dd
l+m,Z,ddl-m.Z.ddl/m0Z0m1Z1ddl2m3Z3ddl4m5Z5ddl6m7Z7ddl8m9Z9m:Z:m;Z;ddl4m<Z<m=Z=ddl>m?Z?ddl@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOdd
lPZ@ejQdde@jR�ddddddgZSd�ZTd �ZUe'jVrd!�ZWd"�ZXnd#�ZWd$�ZXd%�ZYde,fd&��YZZd'�Z[d(�Z\d)�Z]d*�Z^d+�Z_deGfd,��YZ`d-e`fd.��YZaejbjcd/d0�d1kr�eaZ`nd2�Zdd3�Zed4�Zfd5�Zgehd6�Zid7�Zjd8�Zkd9ejlkrekZmn	d:�Zmd;d<�Znd=�Zod>�Zpd?�Zqydd@lmrZsWnetk
rzdA�ZsnXdB�ZrdCeufdD��YZvevjw�ZxdEevfdF��YZydGezfdH��YZ{dIe{fdJ��YZ|dKe|fdL��YZ}e{j~Z~e{jZdM�Z�dN�Z�e�eedO�Z�dP�Z�dQ�Z�ehdR�Z�e"j�dS��Z�d
S(Ts%
Easy Install
------------

A tool for doing automatic download/extract/build of distutils-based Python
packages.  For detailed documentation, see the accompanying EasyInstall.txt
file, or visit the `EasyInstall home page`__.

__ https://setuptools.readthedocs.io/en/latest/easy_install.html

i����(tglob(tget_platform(tconvert_patht
subst_vars(tDistutilsArgErrortDistutilsOptionErrortDistutilsErrortDistutilsPlatformError(tINSTALL_SCHEMEStSCHEME_KEYS(tlogtdir_util(t
first_line_re(tfind_executableN(tsix(tconfigparsertmap(tCommand(t	run_setup(tget_pathtget_config_vars(trmtree_safe(tsetopt(tunpack_archive(tPackageIndextparse_requirement_argt
URL_SCHEME(t	bdist_eggtegg_info(tWheel(tyield_linestnormalize_pathtresource_stringtensure_directorytget_distributiontfind_distributionstEnvironmenttRequirementtDistributiontPathMetadatatEggMetadatat
WorkingSettDistributionNotFoundtVersionConflicttDEVELOP_DISTtdefaulttcategorytsamefileteasy_installtPthDistributionstextract_wininst_cfgtmaintget_exe_prefixescCstjd�dkS(NtPi(tstructtcalcsize(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytis_64bitIscCs�tjj|�o!tjj|�}ttjd�o9|}|rUtjj||�Stjjtjj|��}tjjtjj|��}||kS(s�
    Determine if two paths reference the same file.

    Augments os.path.samefile to work on Windows and
    suppresses errors if the path doesn't exist.
    R/(tostpathtexiststhasattrR/tnormpathtnormcase(tp1tp2t
both_existtuse_samefiletnorm_p1tnorm_p2((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR/Ms$cCs|S(N((ts((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt	_to_ascii_scCs1ytj|d�tSWntk
r,tSXdS(Ntascii(Rt	text_typetTruetUnicodeErrortFalse(RE((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytisasciibs

cCs
|jd�S(NRG(tencode(RE((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRFjscCs.y|jd�tSWntk
r)tSXdS(NRG(RMRIRJRK(RE((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRLms


cCstj|�j�jdd�S(Ns
s; (ttextwraptdedenttstriptreplace(ttext((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt<lambda>utcBsreZdZdZeZd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�gZdddd
dd-d0d6d9g	Ze	j
r�d=e	jZej
d>d�ef�ej
d>�nidd'6ZeZd?�Zd@�ZdA�ZedB��ZdC�ZdD�ZdE�ZdF�ZdG�ZdH�ZdI�ZdJ�ZdK�Zej dL�j!�Z"ej dM�j!�Z#ej dN�j!�Z$dO�Z%dP�Z&dQ�Z'dR�Z(dS�Z)dT�Z*e+j,dU��Z-e.dV�Z/e.dW�Z0dX�Z1edY�Z2dZ�Z3d[�Z4d\�Z5d�d]�Z6ed^��Z7d_d�d`�Z8da�Z9db�Z:dc�Z;dd�Z<de�Z=df�Z>ej dg�j!�Z?ej dh�Z@didj�ZAej dk�j!�ZBdl�ZCdm�ZDdn�ZEdo�ZFdp�ZGdq�ZHdr�ZIds�ZJej dt�j!�ZKdu�ZLdv�ZMdw�ZNeOdxeOdydzd{d|��ZPeOdyd}d{d~�ZQd�ZRRS(�s'Manage a download/build/install processs Find/get/install Python packagessprefix=sinstallation prefixszip-oktzsinstall package as a zipfiles
multi-versiontms%make apps have to require() a versiontupgradetUs1force upgrade (searches PyPI for latest versions)sinstall-dir=tdsinstall package to DIRsscript-dir=REsinstall scripts to DIRsexclude-scriptstxsDon't install scriptssalways-copytas'Copy all needed packages to install dirs
index-url=tis base URL of Python Package Indexsfind-links=tfs(additional URL(s) to search for packagessbuild-directory=tbs/download/extract/build in DIR; keep the resultss	optimize=tOslalso compile with optimization: -O1 for "python -O", -O2 for "python -OO", and -O0 to disable [default: -O0]srecord=s3filename in which to record list of installed filessalways-unziptZs*don't install as a zipfile, no matter whats
site-dirs=tSs)list of directories where .pth files workteditabletes+Install specified packages in editable formsno-depstNsdon't install dependenciessallow-hosts=tHs$pattern(s) that hostnames must matchslocal-snapshots-oktls(allow building eggs from local checkoutstversions"print version information and exits
no-find-linkss9Don't load find-links defined in packages being installeds!install in user site-package '%s'tusercCs�d|_d|_|_d|_|_|_d|_d|_d|_	d|_
d|_|_d|_
|_|_d|_|_|_d|_|_|_d|_d|_d|_d|_d|_d|_d|_d|_d|_tj rtj!|_"tj#|_$nd|_"d|_$d|_%d|_&d|_'|_(d|_)i|_*t+|_,d|_-|j.j/|_/|j.j0||j.j1d��dS(NiR0(2RhtNonetzip_oktlocal_snapshots_oktinstall_dirt
script_dirtexclude_scriptst	index_urlt
find_linkstbuild_directorytargstoptimizetrecordRWtalways_copyt
multi_versionRbtno_depstallow_hoststroottprefixt	no_reportRgtinstall_purelibtinstall_platlibtinstall_headerstinstall_libtinstall_scriptstinstall_datatinstall_basetinstall_platbasetsitetENABLE_USER_SITEt	USER_BASEtinstall_userbaset	USER_SITEtinstall_usersitet
no_find_linkst
package_indextpth_filetalways_copy_fromt	site_dirstinstalled_projectsRKtsitepy_installedt_dry_runtdistributiontverboset_set_command_optionstget_option_dict(tself((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytinitialize_options�sF																								cCs*d�|D�}tt|j|��dS(Ncss9|]/}tjj|�s-tjj|�r|VqdS(N(R9R:R;tislink(t.0tfilename((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pys	<genexpr>�s(tlistRt_delete_path(R�tblockerstextant_blockers((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytdelete_blockers�scCsetjd|�|jrdStjj|�o?tjj|�}|rNtntj}||�dS(NsDeleting %s(	R
tinfotdry_runR9R:tisdirR�trmtreetunlink(R�R:tis_treetremover((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s	%cCs=tjd }td�}d}|jt��GHt��dS(sT
        Render the Setuptools version and installation details, then exit.
        it
setuptoolss=setuptools {dist.version} from {dist.location} (Python {ver})N(tsysRgR"tformattlocalst
SystemExit(tvertdistttmpl((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt_render_version�s

c
Cs�|jo|j�tjj�d}tdd�\}}i|jj�d6|jj�d6|jj�d6|d6|dd!d	6|d|d
d6|d6|d6|d
6|d6t	tdd�d6|_
tjr�|j
|j
d<|j|j
d<n|j�|j�|j�|jdddd�|jdkrI|j|_n|jdkrdt|_n|jdd%�|jdd&�|jr�|jr�|j|_|j|_n|jdd'�tttj�}t�|_ |j!dk	r�g|j!jd�D]}t"jj#|j$��^q}xq|D]f}t"jj%|�sWt&j'd|�q,t|�|kr|t(|d��q,|j j)t|��q,Wn|j*s�|j+�n|j,p�d|_,|j |_-xE|jt|j�fD]+}||j-kr�|j-j.d|�q�q�W|j/dk	rSg|j/jd�D]}|j$�^q8}	n	dg}	|j0dkr�|j1|j,d|j-d |	�|_0nt2|j-tj�|_3|j4dk	r�t5|j4t6j7�r�|j4j�|_4q�n	g|_4|j8r|j0j9|j-tj�n|js5|j0j:|j4�n|jdd(�t5|j;t<�s�y>t<|j;�|_;d|j;ko�d
kns�t=�nWq�t=k
r�t(d"��q�Xn|j*r�|j>r�t?d#��n|j@s�t?d$��ng|_AdS()NiRztexec_prefixt	dist_nametdist_versiont
dist_fullnamet
py_versionitpy_version_shortitpy_version_nodott
sys_prefixtsys_exec_prefixtabiflagsRTtuserbasetusersiteRlRmRqR�RR�tinstallRtt,s"%s (in --site-dirs) does not exists$ (in --site-dirs) is not on sys.pathshttps://pypi.python.org/simplet*tsearch_paththostsRss--optimize must be 0, 1, or 2s9Must specify a build directory (-b) when using --editables:No urls, filenames, or requirements specified (see --help)(RlRl(RlRm(RtRt(RsRs(BRgR�R�tsplitRR�tget_nametget_versiontget_fullnametgetattrtconfig_varsR�R�R�R�t_fix_install_dir_for_user_sitetexpand_basedirstexpand_dirst_expandRmRiRlR�RKtset_undefined_optionsRhR|R�RRR:t
get_site_dirst
all_site_dirsR�R9t
expanduserRPR�R
twarnRtappendRbtcheck_site_dirRotshadow_pathtinsertRxR�tcreate_indexR$tlocal_indexRpt
isinstanceRtstring_typesRktscan_egg_linkstadd_find_linksRstintt
ValueErrorRqRRrtoutputs(
R�R�RzR�R=RER�RYt	path_itemR�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytfinalize_options�s�	


	

4
	

.	!			

	cCs�|jstjrdS|j�|jdkrFd}t|��n|j|_|_t	j
jdd�d}|j|�dS(s;
        Fix the install_dir if "--user" was used.
        Ns$User base directory is not specifiedtposixtunixt_user(
RhR�R�tcreate_home_pathR�RiRR�R�R9tnameRQt
select_scheme(R�tmsgtscheme_name((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR�ms
cCs�x�|D]y}t||�}|dk	rtjdksFtjdkr[tjj|�}nt||j�}t|||�qqWdS(NR�tnt(	R�RiR9R�R:R�RR�tsetattr(R�tattrstattrtval((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt
_expand_attrs|s
cCs|jdddg�dS(sNCalls `os.path.expanduser` on install_base, install_platbase and
        root.R�R�RyN(R�(R�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��scCs)ddddddg}|j|�dS(s+Calls `os.path.expanduser` on install dirs.R|R}RR~R�R�N(R�(R�tdirs((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s	cCs|j|jjkr(tj|j�nz�x%|jD]}|j||j�q5W|jr�|j}|j	r�t
|j	�}x/tt
|��D]}|||||<q�Wnddlm
}|j|j|j|fd|j�n|j�Wdtj|jj�XdS(Ni����(t	file_utils'writing list of installed files to '%s'(R�R�R
t
set_verbosityRrR0RwRtR�Rytlentranget	distutilsR�texecutet
write_filetwarn_deprecated_options(R�tspecR�troot_lentcounterR�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytrun�s$			cCsSytj�}Wn&tk
r8tjdtj�}nXtjj|j	d|�S(s�Return a pseudo-tempname base in the install directory.
        This code is intentionally naive; if a malicious party can write to
        the target directory you're already in deep doodoo.
        istest-easy-install-%s(
R9tgetpidt	ExceptiontrandomtrandintR�tmaxsizeR:tjoinRl(R�tpid((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytpseudo_tempname�s

cCsdS(N((R�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��scCs�t|j�}tjj|d�}||jk}|rS|jrS|j�}n�|j�d}tjj	|�}y:|r�tj
|�nt|d�j�tj
|�Wn!t
tfk
r�|j�nX|r�|jr�t|j���n|r)|jdkr2t||j�|_q2n	d|_|ttt��krVt|_n1|jr�tjj	|�r�t|_d|_n||_dS(s;Verify that self.install_dir is .pth-capable dir, if neededseasy-install.pths.write-testtwN(RRlR9R:R�R�Rvtcheck_pth_processingRR;R�topentclosetOSErrortIOErrortcant_write_to_targetRtno_default_version_msgR�RiR1Rt_pythonpathRIR�(R�tinstdirR�tis_site_dirttestfilettest_exists((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s4		sS
        can't create or remove files in install directory

        The following error occurred while trying to add or remove files in the
        installation directory:

            %s

        The installation directory you specified (via --install-dir, --prefix, or
        the distutils default setting) was:

            %s
        s�
        This directory does not currently exist.  Please create it and try again, or
        choose a different installation directory (using the -d or --install-dir
        option).
        s�
        Perhaps your account does not have write access to this directory?  If the
        installation directory is a system-owned directory, you may need to sign in
        as the administrator or "root" account.  If you do not have administrative
        access to this machine, you may wish to choose a different installation
        directory, preferably one that is listed in your PYTHONPATH environment
        variable.

        For information on other options, you may wish to consult the
        documentation at:

          https://setuptools.readthedocs.io/en/latest/easy_install.html

        Please make the appropriate changes for your system and try again.
        cCsj|jtj�d|jf}tjj|j�sI|d|j7}n|d|j7}t	|��dS(Nis
(
t_easy_install__cant_write_msgR�texc_infoRlR9R:R;t_easy_install__not_exists_idt_easy_install__access_msgR(R�R�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR	s
 c
Cs<|j}tjd|�|j�d}|d}tjj|�}td�d}yQ|rntj|�ntjj	|�}t
jj|dt
�t|d�}Wn!ttfk
r�|j�nSXz�|j|jt���|j�d}tj}tjdkrqtjj|�\}}	tjj|d	�}
|	j�d
ko\tjj|
�}|rq|
}qqnddlm}||d
ddgd�tjj|�r�tjd|�t
SWd|r�|j�ntjj|�r�tj|�ntjj|�rtj|�nX|js8tj d|�nt!S(s@Empirically verify whether .pth files are supported in inst. dirs Checking .pth file support in %ss.pths.oksz
            import os
            f = open({ok_file!r}, 'w')
            f.write('OK')
            f.close()
            s
texist_okRR�spythonw.exes
python.exei����(tspawns-Es-ctpassis-TEST PASSED: %s appears to support .pth filesNs+TEST FAILED: %s does NOT support .pth files("RlR
R�RR9R:R;t
_one_linerR�tdirnamet
pkg_resourcest
py31compattmakedirsRIRRRRtwriteR�R�RRiR�t
executableR�R�R�tlowertdistutils.spawnRRvR�RK(
R�RR�tok_filet	ok_existsR�RR]Rtbasenametalttuse_altR((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRsV	


	
	cCs�|jro|jd�roxS|jd�D]?}|jd|�rHq)n|j|||jd|��q)Wn|j|�dS(s=Write all the scripts for `dist`, unless scripts are excludedtscriptssscripts/N(Rntmetadata_isdirtmetadata_listdirtinstall_scripttget_metadatatinstall_wrapper_scripts(R�R�tscript_name((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytinstall_egg_scriptsMscCs|tjj|�rhxctj|�D]?\}}}x-|D]%}|jjtjj||��q8Wq"Wn|jj|�dS(N(R9R:R�twalkR�R�R�(R�R:tbaseR�tfilesR�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt
add_output[s

*cCs#|jrtd|f��ndS(NsjInvalid argument %r: you can't use filenames or URLs with --editable (except via the --find-links option).(RbR(R�R�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytnot_editablecs	cCsW|js
dStjjtjj|j|j��rStd|j|jf��ndS(Ns2%r already exists in %s; can't do a checkout there(RbR9R:R;R�RqtkeyR(R�R�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytcheck_editableks	'ccsTtjdtjd��}zt|�VWdtjj|�oNtt	|��XdS(NRzs
easy_install-(
ttempfiletmkdtempRtutstrR9R:R;R�R(R�ttmpdir((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt_tmpdiruscCs�|js|j�n|j��\}t|t�s�t|�r{|j|�|jj||�}|j	d|||t�Stj
j|�r�|j|�|j	d|||t�St|�}n|j|�|jj|||j|j|j|j�}|dkr8d|}|jr)|d7}nt|��nB|jtkra|j|||d�|S|j	||j||�SWdQXdS(Ns+Could not find suitable distribution for %rs2 (--always-copy skips system and development eggs)tUsing(Rbtinstall_site_pyR8R�R%RR0R�tdownloadtinstall_itemRiRIR9R:R;RR2tfetch_distributionRWRuR�Rt
precedenceR,tprocess_distributiontlocation(R�R�tdepsR7tdlR�R�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR0~s2	



	
	
cCs�|p|j}|p*tjj|�|k}|p@|jd�}|p||jdk	o|tjjt|��t|j�k}|r�|r�x4|j|j	D]}|j
|kr�Pq�q�Wt}ntj
dtjj|��|r!|j|||�}xP|D]}|j|||�qWn,|j|�g}|j||d|d�|dk	r}x!|D]}||kr`|Sq`WndS(Ns.eggs
Processing %siR9(RuR9R:RtendswithR�RiRR�tproject_nameR@RIR
R�R!tinstall_eggsR?tegg_distribution(R�R�R;R7RAtinstall_neededR�tdists((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR<�s.
	

cCsUt|}xDtD]<}d|}t||�dkrt||||�qqWdS(s=Sets the install directories by applying the install schemes.tinstall_N(RR	R�RiR�(R�R�tschemeR1tattrname((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s



cGs*|j|�|jj|�||j|jkrF|jj|�n|jj|�|j|�||j|j<tj	|j
|||��|jd�r�|jr�|jj
|jd��n|r�|jr�dS|dk	r|j|jkrtjd|�dS|dks#||krD|j�}tt|��}ntj	d|�y(tg�j|g|j|j�}WnItk
r�}tt|���n%tk
r�}t|j���nX|js�|jrx9|D].}|j|jkr�|j|j��q�q�Wntj	d|�dS(Nsdependency_links.txtsSkipping dependencies for %ssProcessing dependencies for %ss'Finished processing dependencies for %s(t
update_pthR�taddR�R1tremoveR+R�R
R�tinstallation_reportthas_metadataR�R�tget_metadata_linesRuRiR�tas_requirementR%R6R)tresolveR0R*RR+treportR�(R�trequirementR�RAR�tdistreqtdistrosRc((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR?�sB


	
cCsA|jdk	r|jS|jd�r*tS|jd�s=tStS(Nsnot-zip-safeszip-safe(RjRiRPRIRK(R�R�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytshould_unzip�scCstjj|j|j�}tjj|�rSd}tj||j|j|�|Stjj|�rn|}n�tjj	|�|kr�tj
|�ntj|�}t|�dkr�tjj||d�}tjj|�r�|}q�nt
|�tj||�|S(Ns<%r already exists in %s; build directory %s will not be keptii(R9R:R�RqR1R;R
R�R�RR�tlistdirR�R!tshutiltmove(R�R�t
dist_filenamet
setup_basetdstR�tcontents((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt
maybe_move�s"	
cCs>|jr
dSx*tj�j|�D]}|j|�q#WdS(N(RntScriptWritertbesttget_argstwrite_script(R�R�Rr((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR)s	cCspt|j��}t||�}|rS|j|�t�}tj|�|}n|j|t|�d�dS(s/Generate a legacy script wrapper and install itR^N(	R6RRtis_python_scriptt_load_templateR�Rat
get_headerRdRF(R�R�R*tscript_texttdev_pathR�t	is_scripttbody((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR'scCs=d}|r!|jdd�}ntd|�}|jd�S(s�
        There are a couple of template scripts in the package. This
        function loads one of them and prepares it for use.
        sscript.tmpls.tmpls (dev).tmplR�sutf-8(RQR tdecode(RiR�t	raw_bytes((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRf&s
ttc	Cs�|jg|D]}tjj|j|�^q
�tjd||j�tjj|j|�}|j|�|jrzdSt	�}t
|�tjj|�r�tj|�nt
|d|��}|j|�WdQXt|d|�dS(s1Write an executable file to the scripts directorysInstalling %s script to %sNRi�(R�R9R:R�RmR
R�R/R�t
current_umaskR!R;R�RRtchmod(	R�R*R_tmodeR�RZttargettmaskR]((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRd5s,
		
cCs�|j�jd�r(|j||�gS|j�jd�rP|j||�gS|j�jd�rx|j||�gS|}tjj|�r�|jd�r�t|||j	�n'tjj
|�r�tjj|�}n|j|�r|j
r|dk	r|j|||�}ntjj|d�}tjj|�s�ttjj|dd��}|s�tdtjj|���nt|�dkr�td	tjj|���n|d
}n|jr�tj|j||��gS|j||�SdS(Ns.eggs.exes.whls.pyssetup.pyR�s"Couldn't find a setup script in %sisMultiple setup scripts in %si(RRCtinstall_eggtinstall_exet
install_wheelR9R:tisfileRtunpack_progressR�tabspatht
startswithRqRiR`R�R;RRR�RbR
R�treport_editabletbuild_and_install(R�R�R\R7R]tsetup_scripttsetups((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyREIs<"
	cCs[tjj|�r3t|tjj|d��}nttj|��}tj	|d|�S(NsEGG-INFOtmetadata(
R9R:R�R'R�R(t	zipimporttzipimporterR&t
from_filename(R�tegg_pathR((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRFus
cCs%tjj|jtjj|��}tjj|�}|jsLt|�n|j|�}t	||�stjj
|�r�tjj|�r�tj
|d|j�n2tjj|�r�|jtj|fd|�nyt}tjj
|�r*|j|�rtjd}}q�tjd}}ng|j|�rY|j|�|jd}}n8t}|j|�r�tjd}}ntjd}}|j|||f|dtjj|�tjj|�f�t|d|�Wqtk
rt|dt��qXn|j|�|j|�S(NR�s	Removing tMovingtCopyingt
Extractings	 %s to %stfix_zipimporter_caches(R9R:R�RlR!RyR�R!RFR/R�R�Rtremove_treeR;R�R�RKRzRZR[tcopytreeRXtmkpathtunpack_and_compileRItcopy2Rtupdate_dist_cachesR�R/(R�R�R7tdestinationR�tnew_dist_is_zippedR]RV((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRt}sT		
%
	


cCst|�}|dkr+td|��ntdd|jdd�d|jdd�dt��}tjj||j	�d�}||_
|d}tjj|d	�}tjj|d
�}t|�t||�|_
|j||�tjj|�st|d�}	|	jd�xU|jd�D]D\}
}|
d
kr*|	jd|
jdd�j�|f�q*q*W|	j�ntjj|d�}|jgtj|�D]}
tjj||
d�^q��tj||d|jd|j�|j||�S(Ns(%s is not a valid distutils Windows .exeRDRR�Rgtplatforms.eggs.tmpsEGG-INFOsPKG-INFORsMetadata-Version: 1.0
ttarget_versions%s: %s
t_t-R$iR�R�(R2RiRR&tgetRR9R:R�tegg_nameR@R!R't	_providert
exe_to_eggR;RRtitemsRQttitleRR�RaRcRtmake_zipfileR�R�Rt(R�R\R7tcfgR�R�tegg_tmpt	_egg_infotpkg_infR]tktvRmRr((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRu�s<	


0
3cs�t|��g�g�i������fd�}t|�|�g}x��D]�}|j�jd�rV|jd�}|d}tj|d�d|d<tjj	�|�}�j
|�|j
|�tj||�qVqVW|j��tj
tjj	�d�tj�|��x�d
D]�}	t�|	r*tjj	�d|	d	�}
tjj|
�s�t|
d
�}|jdj	t�|	�d�|j�q�q*q*WdS(s;Extract a bdist_wininst to the directories an egg would usecsL|j�}x�D]\}}|j|�r||t|�}|jd�}tjj�|�}|j�}|jd�s�|jd�r�tj	|d�|d<d�tjj
|d�d<�j|�nI|jd�r|dkrd�tjj
|d�d<�j|�n|SqW|jd	�sHtj
d
|�ndS(Nt/s.pyds.dlli����iis.pysSCRIPTS/s.pthsWARNING: can't process %s(RRzR�R�R9R:R�RCRtstrip_moduletsplitextR�R
R�Ri(tsrcR^REtoldtnewtpartsRB(R�tnative_libstprefixest
to_compilet	top_level(sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytprocess�s$s.pydR�i����s.pysEGG-INFOR�R�s.txtRs
N(R�R�(R4RRRCR�RR�R9R:R�R�t
write_stubtbyte_compiletwrite_safety_flagtanalyze_eggR�R;RRR(R�R\R�R�tstubstresR�tresourcetpyfileR�ttxtR]((R�R�R�R�R�sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s6






!cCs/t|�}tjj|j|j��}tjj|�}|jsRt|�ntjj	|�r�tjj
|�r�tj|d|j�n2tjj
|�r�|jtj|fd|�nz?|j|j|fdtjj|�tjj|�f�Wdt|dt�X|j|�|j|�S(NR�s	Removing sInstalling %s to %sR�(RR9R:R�RlR�RyR�R!R�R�RR�R;R�R�tinstall_as_eggR!RR�RKR/RF(R�t
wheel_pathR7twheelR�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRvs,	
%
s(
        Because this distribution was installed --multi-version, before you can
        import modules from this package in an application, you will need to
        'import pkg_resources' and then use a 'require()' call similar to one of
        these examples, in order to select the desired version:

            pkg_resources.require("%(name)s")  # latest installed version
            pkg_resources.require("%(name)s==%(version)s")  # this exact version
            pkg_resources.require("%(name)s>=%(version)s")  # this version or higher
        s�
        Note also that the installation directory must be on sys.path at runtime for
        this to work.  (e.g. by being the application's script directory, by being on
        PYTHONPATH, or by being added to sys.path by your code.)
        t	Installedc	Cs�d}|jr\|jr\|d|j7}|jtttj�kr\|d|j7}q\n|j	}|j
}|j}d}|t�S(s9Helpful installation message for display to package userss
%(what)s %(eggloc)s%(extras)ss
RT(
RvR{t_easy_install__mv_warningRlRRR�R:t_easy_install__id_warningR@RDRgR�(	R�treqR�twhatR�tegglocR�Rgtextras((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyROCs			sR
        Extracted editable version of %(spec)s to %(dirname)s

        If it uses setuptools in its setup script, you can activate it in
        "development" mode by going to that directory and running::

            %(python)s setup.py develop

        See the setuptools documentation for the "develop" command for more info.
        cCs-tjj|�}tj}d|jt�S(Ns
(R9R:RR�Rt_easy_install__editable_msgR�(R�R�R}Rtpython((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR{\s	cCstjjdt�tjjdt�t|�}|jdkrid|jd}|jdd|�n"|jdkr�|jdd�n|jr�|jdd	�nt	j
d
|t|�ddj|��yt
||�Wn-tk
r}td|jdf��nXdS(
Nsdistutils.command.bdist_eggsdistutils.command.egg_infoiR�iiR�s-qs-ns
Running %s %st sSetup script exited with %s(R�tmodulest
setdefaultRRR�R�R�R�R
R�R�R�RR�RRr(R�R}R]RrR�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRas 	$c	Csddg}tjdddtjj|��}z�|jtjj|��|j|�|j|||�t|g�}g}x?|D]7}x.||D]"}|j|j	|j
|��q�Wq�W|r�|jr�tj
d|�n|SWdt|�tj|j�XdS(NRs
--dist-dirRzs
egg-dist-tmp-tdirs+No eggs found in %s (setup script problem?)(R3R4R9R:Rt_set_fetcher_optionsR�RR$RtR@R�R
R�R�R�R�(	R�R}R]Rrtdist_dirtall_eggsteggsR1R�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR|us$	

$	

c	Cs�|jjd�j�}d}i}xF|j�D]8\}}||krOq1n|d||jdd	�<q1Wtd|�}tjj|d
�}t	j
||�dS(
s
        When easy_install is about to run bdist_egg on a source dist, that
        source dist might have 'setup_requires' directives, requiring
        additional fetching. Ensure the fetcher options given to easy_install
        are available to that command as well.
        R0RpR�RoRsRxiR�R�s	setup.cfgN(RpR�RoRsR�Rx(R�R�tcopyR�RQtdictR9R:R�Rtedit_config(	R�R-tei_optstfetch_directivest
fetch_optionsR1R�tsettingstcfg_filename((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s	cCs�|jdkrdSx~|j|jD]l}|jsE|j|jkr$tjd|�|jj|�|j|jkr�|jj|j�q�q$q$W|js|j|jj	kr�tjd|�qtjd|�|jj
|�|j|jkr|jj|j�qn|js�|jj
�|jdkr�tjj|jd�}tjj|�rotj|�nt|d�}|j|jj|j�d�|j�q�ndS(Ns&Removing %s from easy-install.pth files4%s is already the active version in easy-install.pths"Adding %s to easy-install.pth fileR�ssetuptools.pthtwts
(R�RiR1RvR@R
R�RNR�tpathsRMR�R�tsaveR9R:R�RlR�R�RRt
make_relativeR(R�R�RYR�R]((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRL�s4	
	
 cCstjd||�|S(NsUnpacking %s to %s(R
tdebug(R�R�R^((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRx�scs�g�g����fd�}t|||��j���js�x<�D]1}tj|�tjdBd@}t||�qNWndS(Ncs�|jd�r/|jd�r/�j|�n.|jd�sM|jd�r]�j|�n�j||��jr}|p�dS(Ns.pys	EGG-INFO/s.dlls.so(RCRzR�RxR�Ri(R�R^(R�tto_chmodR�(sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytpf�simi�(RR�R�R9tstattST_MODERp(R�R�R�R�R]Rq((R�R�R�sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s
	
cCs�tjr
dSddlm}zetj|jd�||ddddd|j�|jr�||d|jddd|j�nWdtj|j�XdS(Ni����(R�iRsitforceR�(	R�tdont_write_bytecodetdistutils.utilR�R
R�R�R�Rs(R�R�R�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s		s�
        bad install directory or PYTHONPATH

        You are attempting to install a package to a directory that is not
        on PYTHONPATH and which Python does not read ".pth" files from.  The
        installation directory you specified (via --install-dir, --prefix, or
        the distutils default setting) was:

            %s

        and your PYTHONPATH environment variable currently contains:

            %r

        Here are some of your options for correcting the problem:

        * You can choose a different installation directory, i.e., one that is
          on PYTHONPATH or supports .pth files

        * You can add the installation directory to the PYTHONPATH environment
          variable.  (It must then also be on PYTHONPATH whenever you run
          Python and want to use the package(s) you are installing.)

        * You can set up the installation directory to support ".pth" files by
          using one of the approaches described here:

          https://setuptools.readthedocs.io/en/latest/easy_install.html#custom-installation-locations


        Please make the appropriate changes for your system and try again.cCs)|j}||jtjjdd�fS(Nt
PYTHONPATHRT(t_easy_install__no_default_msgRlR9tenvironR�(R�ttemplate((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR	s	cCs7|jr
dStjj|jd�}tdd�}|jd�}d}tjj|�r�tj	d|j�t
j|��}|j�}WdQX|j
d�s�td	|��q�n||kr*tjd
|�|jst|�t
j|ddd��}|j|�WdQXn|j|g�nt|_dS(
s8Make sure there's a site.py in the target dir, if neededNssite.pyR�s
site-patch.pysutf-8RTsChecking existing site.py in %ss
def __boot():s;%s is not a setuptools-generated site.py; please remove it.sCreating %sRtencoding(R�R9R:R�RlR RlR;R
R�tioRtreadRzRR�R�R!RR�RI(R�tsitepytsourcetcurrenttstrm((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR:s,		
cCs�|js
dSttjjd��}xftj|j�D]R\}}|j|�r8tjj	|�r8|j
d|�tj|d�q8q8WdS(sCreate directories under ~.Nt~sos.makedirs('%s', 0o700)i�(RhRR9R:R�Rt	iteritemsR�RzR�tdebug_printR(R�thomeR�R:((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR�8s	"R�Rls/$base/lib/python$py_version_short/site-packagesRms	$base/bins$base/Lib/site-packagess
$base/ScriptscGs |jd�j}|jr�|j�}|j|d<|jjtj|j�}xH|j	�D]7\}}t
||d�dkr\t|||�q\q\Wnddl
m}xo|D]g}t
||�}|dk	r�|||�}tjdkrtjj|�}nt|||�q�q�WdS(NR�R-i����(RR�(tget_finalized_commandR�RzR�RR�R9R�tDEFAULT_SCHEMER�R�RiR�R�RR:R�(R�R�R�RJR�R�R((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR�Ns 	

N(sprefix=Nsinstallation prefix(szip-okRUsinstall package as a zipfile(s
multi-versionRVs%make apps have to require() a version(RWRXs1force upgrade (searches PyPI for latest versions)(sinstall-dir=RYsinstall package to DIR(sscript-dir=REsinstall scripts to DIR(sexclude-scriptsRZsDon't install scripts(salways-copyR[s'Copy all needed packages to install dir(s
index-url=R\s base URL of Python Package Index(sfind-links=R]s(additional URL(s) to search for packages(sbuild-directory=R^s/download/extract/build in DIR; keep the results(s	optimize=R_slalso compile with optimization: -O1 for "python -O", -O2 for "python -OO", and -O0 to disable [default: -O0](srecord=Ns3filename in which to record list of installed files(salways-unzipR`s*don't install as a zipfile, no matter what(s
site-dirs=Ras)list of directories where .pth files work(RbRcs+Install specified packages in editable form(sno-depsRdsdon't install dependencies(sallow-hosts=Res$pattern(s) that hostnames must match(slocal-snapshots-okRfs(allow building eggs from local checkouts(RgNs"print version information and exit(s
no-find-linksNs9Don't load find-links defined in packages being installed((St__name__t
__module__t__doc__tdescriptionRItcommand_consumes_argumentsRituser_optionstboolean_optionsR�R�R�thelp_msgR�tnegative_optRR�R�R�R�tstaticmethodR�R�R�R�R�R�R�RR�R�RNROtlstripRRRRRR+R/R0R2t
contextlibtcontextmanagerR8RKR0R<R�R?RXR`R)R'RfRdRERFRtRuR�RvR�R�ROR�R{RR|R�RLRxR�R�R�R	R:R�R�RR�R�(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR0xs�		

	0				z									*			;				
	$$		'				
	,		6	-	5									%					 	
	cCs.tjjdd�jtj�}td|�S(NR�RT(R9R�R�R�tpathseptfilterRi(R�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR
es!cCs!g}|jt��tjg}tjtjkrG|jtj�nx2|D]*}|rNtjdkr�|jtjj	|dd��n|tj
dkr�|jtjj	|ddtjd d�tjj	|dd	�g�n%|j|tjj	|dd�g�tjd
krxd|krutjj
d�}|rrtjj	|d
dtjd d�}|j|�qrquqxqNqNWtd�td�f}x*|D]"}||kr�|j|�q�q�Wtjr�|jtj�ny|jtj��Wntk
rnXttt|��}|S(s&
    Return a list of 'site' dirs
    tos2emxtriscostLibs
site-packagesR�tlibR�issite-pythontdarwinsPython.frameworktHOMEtLibrarytPythontpurelibtplatlib(R�R�(textendR
R�RzR�R�R�R9R:R�tsepRgR�R�RR�R�R�tgetsitepackagestAttributeErrorR�RR(tsitedirsR�RzR�thome_spt	lib_pathstsite_lib((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR�jsV
"		
	
	
ccs^i}xQ|D]I}t|�}||kr1q
nd||<tjj|�sSq
ntj|�}||fVx�|D]�}|jd�s�qtn|dkr�qtnttjj||��}tt	|��}|j
�xw|D]o}|jd�s�t|j��}||krNd||<tjj|�s4q�n|tj|�fVqNq�q�WqtWq
WdS(sBYield sys.path directories that might contain "old-style" packagesis.pthseasy-install.pthssetuptools.pthtimportN(seasy-install.pthssetuptools.pth(
RR9R:R�RYRCRR�R�RRRztrstrip(tinputstseenRR.R�R]tlinestline((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytexpand_paths�s4





cCst|d�}z^tj|�}|dkr1dS|d|d|d}|dkr[dS|j|d�tjd|jd��\}}}|dkr�dS|j|d|�id	d
6d	d6}tj	|�}yT|j|�}	|	j
dd
�d}
|
jtj
��}
|jtj|
��Wntjk
rCdSX|jd�sd|jd�rhdS|SWd|j�XdS(snExtract configuration data from a bdist_wininst .exe

    Returns a configparser.RawConfigParser, or None
    trbi	iiis<iiiizV4i{V4RTRgR�siiRtSetupN(izV4i{V4(Rtzipfilet_EndRecDataRitseekR6tunpackR�RtRawConfigParserR�RlR�tgetfilesystemencodingtreadfpRtStringIOtErrorthas_sectionR(R\R]tendrect	prependedttagtcfglentbmlentinitR�tparttconfig((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR2�s4$ c
Cs�dddddg}tj|�}zqxj|j�D]\}|j}|jd�}t|�d	kr�|d
dkr�|djd
�r�|jddj|d
 �df�Pq�nt|�d
ks4|jd�r�q4n|jd�r�q4n|dj	�dkr4|j
|�}tjr+|j
�}nxbt|�D]Q}|j�jdd�}|jd�s8|jd|d|fdf�q8q8Wq4q4WWd|j�Xg|D]\}}	|j�|	f^q�}|j�|j�|S(s4Get exe->egg path translations for a given .exe filesPURELIB/RTsPLATLIB/pywin32_system32sPLATLIB/sSCRIPTS/sEGG-INFO/scripts/sDATA/lib/site-packagesR�iisPKG-INFOis	.egg-infois	EGG-INFO/s.pths
-nspkg.pthtPURELIBtPLATLIBs\Rs%s/%s/N(sPURELIB/RT(sPLATLIB/pywin32_system32RT(sPLATLIB/RT(sSCRIPTS/sEGG-INFO/scripts/(sDATA/lib/site-packagesRT(R+R,(RtZipFiletinfolistR�R�R�RCR�R�tupperR�RtPY3RlRRPRQRzR�RRtsorttreverse(
texe_filenameR�RUR�R�R�R_tpthRZty((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR4�s>		"#"	3+

cBs\eZdZeZdd�Zd�Zd�Zed��Z	d�Z
d�Zd�ZRS(	s)A .pth file with Distribution paths in itcCs�||_ttt|��|_ttjj|j��|_|j	�t
j|gdd�x6t
|j�D]%}tt|jt|t���qoWdS(N(R�R�RRRR9R:Rtbasedirt_loadR$t__init__RiRR�RMR#RI(R�R�RR:((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR8)s	
cCs�g|_t}tj|j�}tjj|j�r3t	|jd�}x�|D]�}|j
d�rpt}qOn|j�}|jj
|�|j�sO|j�j
d�r�qOnttjj|j|��}|jd<tjj|�s�||kr|jj�t|_qOnd||<qOW|j�n|jrO|rOt|_nx.|jr|jdj�r|jj�qRWdS(NtrtRt#i����i(R�RKR�tfromkeysRR9R:RwR�RRzRIRR�RPRR�R6R;tpoptdirtyR(R�t
saw_importRR]RR:((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR72s2	
"&
	
 cCs�|js
dStt|j|j��}|r�tjd|j�|j|�}dj	|�d}t
jj|j�r�t
j
|j�nt|jd��}|j|�WdQXn;t
jj|j�r�tjd|j�t
j
|j�nt|_dS(s$Write changed .pth file back to diskNs	Saving %ss
R�sDeleting empty %s(R=R�RR�R�R
R�R�t_wrap_linesR�R9R:R�R�RRR;RK(R�t	rel_pathsRtdataR]((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR�Qs	cCs|S(N((R((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR?gscCsr|j|jko6|j|jkp6|jtj�k}|r^|jj|j�t|_ntj	||�dS(s"Add `dist` to the distribution mapN(
R@R�RR9tgetcwdR�RIR=R$RM(R�R�tnew_path((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRMkscCsIx2|j|jkr4|jj|j�t|_qWtj||�dS(s'Remove `dist` from the distribution mapN(R@R�RNRIR=R$(R�R�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRNys
cCs�tjjt|��\}}t|j�}|g}tjdkrKdpQtj}xut|�|kr�||jkr�|jtj	�|j
�|j|�Stjj|�\}}|j|�qWW|SdS(NR�(R9R:R�RR�R6taltsepR	R�tcurdirR2R�(R�R:tnpathtlasttbaselenR�R	((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s	

((
R�R�R�RKR=R8R7R�R�R?RMRNR�(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR1$s					tRewritePthDistributionscBs/eZed��Zed�Zed�ZRS(ccs*|jVx|D]}|VqW|jVdS(N(tpreludetpostlude(tclsRR((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR?�s
	s?
        import sys
        sys.__plen = len(sys.path)
        s�
        import sys
        new = sys.path[sys.__plen:]
        del sys.path[sys.__plen:]
        p = getattr(sys, '__egginsert', 0)
        sys.path[p:p] = new
        sys.__egginsert = p + len(new)
        (R�R�tclassmethodR?RRJRK(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRI�s
	tSETUPTOOLS_SYS_PATH_TECHNIQUEtrawtrewritecCs,ttjt�rtStjtjj��S(s_
    Return a regular expression based on first_line_re suitable for matching
    strings.
    (R�RtpatternR6tretcompileRl(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt_first_line_re�scCs�|tjtjgkrAtjdkrAt|tj�||�Stj�\}}}t	j
||d|dd||ff�dS(NR�iis %s %s(R9R�RNR�RpR�tS_IWRITER�RRtreraise(tfunctargtexctettevR�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt
auto_chmod�s
'
cCs=t|�}t|tj�|r/t|�n
t|�dS(sa

    Fix any globally cached `dist_path` related data

    `dist_path` should be a path of a newly installed egg distribution (zipped
    or unzipped).

    sys.path_importer_cache contains finder objects that have been cached when
    importing data from the original distribution. Any such finders need to be
    cleared since the replacement distribution might be packaged differently,
    e.g. a zipped egg distribution might get replaced with an unzipped egg
    folder or vice versa. Having the old finders cached may then cause Python
    to attempt loading modules from the replacement distribution using an
    incorrect loader.

    zipimport.zipimporter objects are Python loaders charged with importing
    data packaged inside zip archives. If stale loaders referencing the
    original distribution, are left behind, they can fail to load modules from
    the replacement distribution. E.g. if an old zipimport.zipimporter instance
    is used to load data from a new zipped egg archive, it may cause the
    operation to attempt to locate the requested data in the wrong location -
    one indicated by the original distribution's zip archive directory
    information. Such an operation may then fail outright, e.g. report having
    read a 'bad local file header', or even worse, it may fail silently &
    return invalid data.

    zipimport._zip_directory_cache contains cached zip archive directory
    information for all existing zipimport.zipimporter instances and all such
    instances connected to the same archive share the same cached directory
    information.

    If asked, and the underlying Python implementation allows it, we can fix
    all existing zipimport.zipimporter instances instead of having to track
    them down and remove them one by one, by updating their shared cached zip
    archive directory information. This, of course, assumes that the
    replacement distribution is packaged as a zipped egg.

    If not asked to fix existing zipimport.zipimporter instances, we still do
    our best to clear any remaining zipimport.zipimporter related cached data
    that might somehow later get used when attempting to load data from the new
    distribution and thus cause such load operations to fail. Note that when
    tracking down such remaining stale data, we can not catch every conceivable
    usage from here, and we clear only those that we know of and have found to
    cause problems if left alive. Any remaining caches should be updated by
    whomever is in charge of maintaining them, i.e. they should be ready to
    handle us replacing their zip archives with new distributions at runtime.

    N(Rt_uncacheR�tpath_importer_cachet!_replace_zip_directory_cache_datat*_remove_and_clear_zip_directory_cache_data(t	dist_pathR�tnormalized_path((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s
<
cCsrg}t|�}xY|D]Q}t|�}|j|�r|||d!tjdfkr|j|�qqW|S(sp
    Return zipimporter cache entry keys related to a given normalized path.

    Alternative path spellings (e.g. those using different character case or
    those using alternative path separators) related to the same path are
    included. Any sub-path entries are included as well, i.e. those
    corresponding to zip archives embedded in other zip archives.

    iRT(R�RRzR9R	R�(Rbtcachetresultt
prefix_lentptnp((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt"_collect_zipimporter_cache_entriess

 cCs]xVt||�D]E}||}||=|o9|||�}|dk	r|||<qqWdS(s�
    Update zipimporter cache data for a given normalized path.

    Any sub-path entries are processed as well, i.e. those corresponding to zip
    archives embedded in other zip archives.

    Given updater is a callable taking a cache entry key and the original entry
    (after already removing the entry from the cache), and expected to update
    the entry and possibly return a new one to be inserted in its place.
    Returning None indicates that the entry should not be replaced with a new
    one. If no updater is given, the cache entries are simply removed without
    any additional processing, the same as if the updater simply returned None.

    N(RhRi(RbRctupdaterRft	old_entryt	new_entry((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt_update_zipimporter_cache$s

cCst||�dS(N(Rl(RbRc((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR]DscCs#d�}t|tjd|�dS(NcSs|j�dS(N(tclear(R:Rj((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt2clear_and_remove_cached_zip_archive_directory_dataIsRi(RlR�t_zip_directory_cache(RbRn((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR`Hs	t__pypy__cCs#d�}t|tjd|�dS(NcSs/|j�tj|�|jtj|�|S(N(RmR�R�tupdateRo(R:Rj((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt)replace_cached_zip_archive_directory_data_s

Ri(RlR�Ro(RbRr((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR_^s	
s<string>cCs7yt||d�Wnttfk
r.tSXtSdS(s%Is this string a valid Python script?texecN(RStSyntaxErrort	TypeErrorRKRI(RRR�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt	is_pythonqs
cCsVy1tj|dd��}|jd�}WdQXWnttfk
rK|SX|dkS(sCDetermine if the specified executable is a .sh (contains a #! line)R�slatin-1iNs#!(R�RR�RR(Rtfptmagic((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytis_sh{scCstj|g�S(s@Quote a command line argument according to Windows parsing rules(t
subprocesstlist2cmdline(RX((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytnt_quote_arg�scCsb|jd�s|jd�r"tSt||�r5tS|jd�r^d|j�dj�kStS(sMIs this text, as a whole, a Python script? (as opposed to shell/bat/etc.
    s.pys.pyws#!R�i(RCRIRvRzt
splitlinesRRK(RhR�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRe�s(RpcGsdS(N((Rr((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt_chmod�scCsQtjd||�yt||�Wn&tjk
rL}tjd|�nXdS(Nschanging mode of %s to %oschmod failed: %s(R
R�R~R9terror(R:RqRc((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRp�s
tCommandSpeccBs�eZdZgZe�Zed��Zed��Zed��Z	ed��Z
ed��Zd�Ze
d��Zd�Ze
d	��Ze
d
��ZRS(sm
    A command spec for a #! header, specified as a list of arguments akin to
    those passed to Popen.
    cCs|S(sV
        Choose the best CommandSpec class based on environmental conditions.
        ((RL((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRb�scCs(tjjtj�}tjjd|�S(Nt__PYVENV_LAUNCHER__(R9R:R=R�RR�R�(RLt_default((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt_sys_executable�scCsOt||�r|St|t�r,||�S|dkrB|j�S|j|�S(sg
        Construct a CommandSpec from a parameter to build_scripts, which may
        be None.
        N(R�R�Ritfrom_environmenttfrom_string(RLtparam((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt
from_param�s

cCs||j�g�S(N(R�(RL((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��scCstj||j�}||�S(s}
        Construct a command spec from a simple string representing a command
        line parseable by shlex.split.
        (tshlexR�t
split_args(RLtstringR�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��scCsMtj|j|��|_tj|�}t|�sIdg|jd*ndS(Ns-xi(R�R�t_extract_optionstoptionsRzR{RL(R�Rhtcmdline((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytinstall_options�scCsQ|dj�d}t�j|�}|rA|jd�pDdnd}|j�S(sH
        Extract any options from the first line of the script.
        s
iiRT(R}RTtmatchtgroupRP(torig_scripttfirstR�R�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s!cCs|j|t|j��S(N(t_renderR�R�(R�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt	as_header�scCsDd}x7|D]/}|j|�r
|j|�r
|dd!Sq
W|S(Ns"'ii����(RzRC(titemt_QUOTEStq((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt
_strip_quotes�s

cCs%tjd�|D��}d|dS(Ncss$|]}tj|j��VqdS(N(R�R�RP(R�R�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pys	<genexpr>�ss#!s
(RzR{(R�R�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s(R�R�R�R�R�R�RMRbR�R�R�R�R�R�R�R�R�R�(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s			
	tWindowsCommandSpeccBseZede�ZRS(R�(R�R�R�RKR�(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��sRacBs�eZdZejd�j�ZeZe	ded��Ze	ded��Z
e	dd��Zed��Ze	d��Ze	d��Ze	d��Ze	d	dd
��ZRS(s`
    Encapsulates behavior around writing entry point scripts for console and
    gui apps.
    s�
        # EASY-INSTALL-ENTRY-SCRIPT: %(spec)r,%(group)r,%(name)r
        __requires__ = %(spec)r
        import re
        import sys
        from pkg_resources import load_entry_point

        if __name__ == '__main__':
            sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
            sys.exit(
                load_entry_point(%(spec)r, %(group)r, %(name)r)()
            )
    cCsMtjdt�|rtntj�}|jd||�}|j||�S(NsUse get_argsRT(twarningsR�tDeprecationWarningtWindowsScriptWriterRaRbtget_script_headerRc(RLR�Rtwininsttwritertheader((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytget_script_argsscCsNtjdt�|rd}n|jj�j|�}|j|�|j�S(NsUse get_headers
python.exe(R�R�R�tcommand_spec_classRbR�R�R�(RLRhRR�tcmd((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR�!s	
ccs�|dkr|j�}nt|j��}x�dD]�}|d}xn|j|�j�D]W\}}|j|�|jt�}|j	||||�}	x|	D]}
|
Vq�WqZWq4WdS(s�
        Yield write_script() argument tuples for a distribution's
        console_scripts and gui_scripts entry points.
        tconsoletguit_scriptsN(R�R�(
RiRgR6RRt
get_entry_mapR�t_ensure_safe_nameR�R�t_get_script_args(RLR�R�R�ttype_R�R�tepRhRrR�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRc+s

"

cCs+tjd|�}|r'td��ndS(s?
        Prevent paths in *_scripts entry point names.
        s[\\/]s+Path separators not allowed in script namesN(RRtsearchR�(R�thas_path_sep((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR�=scCs*tjdt�|r tj�S|j�S(NsUse best(R�R�R�R�Rb(RLt
force_windows((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt
get_writerFscCs?tjdks-tjdkr7tjdkr7tj�S|SdS(sD
        Select the best ScriptWriter for this environment.
        twin32tjavaR�N(R�R�R9R�t_nameR�Rb(RL((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRbLs-
ccs|||fVdS(N((RLR�R�R�Rh((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR�VsRTcCs/|jj�j|�}|j|�|j�S(s;Create a #! line, getting options (if any) from script_text(R�RbR�R�R�(RLRhRR�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRg[s
N(R�R�R�RNROR�R�R�R�RMRiRKR�R�RcR�R�R�RbR�Rg(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRas 		
R�cBsYeZeZed��Zed��Zed��Zed��Ze	d��Z
RS(cCstjdt�|j�S(NsUse best(R�R�R�Rb(RL((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR�fscCs2tdtd|�}tjjdd�}||S(sC
        Select the best ScriptWriter suitable for Windows
        RtnaturaltSETUPTOOLS_LAUNCHER(R�tWindowsExecutableLauncherWriterR9R�R�(RLt
writer_lookuptlauncher((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRbls
	c
cs�tdddd�|}|tjdj�jd�kr`djt��}tj|t	�nddd	d
dddg}|j
|�|j||�}g|D]}||^q�}	||||d
|	fVdS(s For Windows, add a .py extensionR�s.pyaR�s.pywtPATHEXTt;sK{ext} not listed in PATHEXT; scripts will not be recognized as executables.s.pys
-script.pys.pycs.pyos.exeRnN(R�R9R�RR�R�R�R�R�tUserWarningRNt_adjust_header(
RLR�R�R�RhtextR�R�RZR�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR�ys"
cCsud}d}|dkr(||}}ntjtj|�tj�}|jd|d|�}|j|�rq|S|S(s�
        Make sure 'pythonw' is used for gui and and 'python' is used for
        console (regardless of what sys.executable is).
        spythonw.exes
python.exeR�R�trepl(RRRStescapet
IGNORECASEtsubt_use_header(RLR�torig_headerRQR�t
pattern_obt
new_header((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��scCs/|dd!jd�}tjdkp.t|�S(s�
        Should _adjust_header use the replaced header?

        On non-windows systems, always use. On
        Windows systems, only use the replaced header if it resolves
        to an executable on the system.
        ii����t"R�(RPR�R�R
(R�tclean_header((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s	(R�R�R�R�RMR�RbR�R�R�R�(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR�cs
R�cBseZed��ZRS(ccs�|dkr$d}d}dg}nd}d}dddg}|j||�}g|D]}	||	^qX}
||||d	|
fV|d
t|�dfVt�s�|d}|t|�d	fVnd
S(sG
        For Windows, add a .py extension and an .exe launcher
        R�s-script.pyws.pywtclis
-script.pys.pys.pycs.pyoRns.exeR^s
.exe.manifestN(R�tget_win_launcherR8tload_launcher_manifest(RLR�R�R�Rht
launcher_typeR�R�thdrRZR�tm_name((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s	
(R�R�RMR�(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��scCsGd|}t�r(|jdd�}n|jdd�}td|�S(s�
    Load the Windows launcher (executable) suitable for launching a script.

    `type` should be either 'cli' or 'gui'

    Returns the executable as a byte string.
    s%s.exet.s-64.s-32.R�(R8RQR (ttypetlauncher_fn((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s

	cCs>tjtd�}tjr&|t�S|jd�t�SdS(Nslauncher manifest.xmlsutf-8(RR R�RtPY2tvarsRl(R�tmanifest((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s	cCstj|||�S(N(RZR�(R:t
ignore_errorstonerror((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��scCs tjd�}tj|�|S(Ni(R9tumask(ttmp((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRo�s
cCsMddl}tjj|jd�}|tjd<tjj|�t�dS(Ni����i(	R�R9R:Rt__path__R�targvR�R3(R�targv0((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt	bootstrap�s

cs�ddlm}ddlm�d�f�fd��Y}|dkrXtjd}nt��;|ddd	d
g|dtjdp�d	d
||�WdQXdS(Ni����(tsetup(R&tDistributionWithoutHelpCommandscseZdZ�fd�ZRS(RTcs't���j|||�WdQXdS(N(t_patch_usaget
_show_help(R�Rrtkw(R&(sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s
(R�R�tcommon_usageR�((R&(sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��sitscript_argss-qR0s-vR*it	distclass(R�R�tsetuptools.distR&RiR�R�R�(R�R�R�R�((R&sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR3�s
c#seddl}tjd�j���fd�}|jj}||j_z	dVWd||j_XdS(Ni����se
        usage: %(script)s [options] requirement_or_url ...
           or: %(script)s --help
        cs�tdtjj|��S(Ntscript(R�R9R:R!(R*(tUSAGE(sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt	gen_usage	s	(tdistutils.coreRNROR�tcoreR�(R�R�tsaved((R�sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR�	s	(�R�RR�RRRtdistutils.errorsRRRRtdistutils.command.installRR	R�R
Rtdistutils.command.build_scriptsRRR
R�R9R�RZR3RRRR�R�RNR�R�R6R�RzR�R�tsetuptools.externRtsetuptools.extern.six.movesRRR�Rtsetuptools.sandboxRtsetuptools.py31compatRRtsetuptools.py27compatRtsetuptools.commandRtsetuptools.archive_utilRtsetuptools.package_indexRRRRRtsetuptools.wheelRRRRR R!R"R#R$R%R&R'R(R)R*R+R,tpkg_resources.py31compattfilterwarningst
PEP440Warningt__all__R8R/R�RFRLRR0R
R�RR2R4R1RIR�R�RTR\R�RhRiRlR]R`tbuiltin_module_namesR_RvRyR|ReRpR~tImportErrorR�R�R�tsys_executableR�tobjectRaR�R�R�R�R�R�RKR�RoR�R3R�R�(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt<module>s�"d							�����		A	)	)	'l				R	 				
	
		

	T`A 						
command/saveopts.pyc000064400000002151151733473650010560 0ustar00�
�fc@s0ddlmZmZdefd��YZdS(i����(tedit_configtoption_basetsaveoptscBseZdZdZd�ZRS(s#Save command-line options to a files7save supplied options to setup.cfg or other config filecCs�|j}i}xt|jD]i}|dkr1qnxN|j|�j�D]7\}\}}|dkrG||j|i�|<qGqGWqWt|j||j�dS(NRscommand line(tdistributiontcommand_optionstget_option_dicttitemst
setdefaultRtfilenametdry_run(tselftdisttsettingstcmdtopttsrctval((s?/usr/lib/python2.7/site-packages/setuptools/command/saveopts.pytrun	s	(!(t__name__t
__module__t__doc__tdescriptionR(((s?/usr/lib/python2.7/site-packages/setuptools/command/saveopts.pyRsN(tsetuptools.command.setoptRRR(((s?/usr/lib/python2.7/site-packages/setuptools/command/saveopts.pyt<module>scommand/test.pyc000064400000024344151733473650007703 0ustar00�
�fc@s:ddlZddlZddlZddlZddlZddlZddlmZmZddl	m
Z
ddlmZddlm
Z
ddlmZmZddlmZmZmZmZmZmZmZmZmZddlmZd	efd
��YZdefd��YZd
efd��YZ dS(i����N(tDistutilsErrortDistutilsOptionError(tlog(t
TestLoader(tsix(tmaptfilter(	tresource_listdirtresource_existstnormalize_pathtworking_sett_namespace_packagestevaluate_markertadd_activation_listenertrequiret
EntryPoint(tCommandtScanningLoadercBseZd�Zdd�ZRS(cCstj|�t�|_dS(N(Rt__init__tsett_visited(tself((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyRs
cCs7||jkrdS|jj|�g}|jtj||��t|d�rg|j|j��nt|d�rx�t|j	d�D]|}|j
d�r�|dkr�|j	d|d }n-t|j	|d�r�|j	d|}nq�|j|j|��q�Wnt
|�d	kr+|j|�S|d
SdS(sReturn a suite of all tests cases contained in the given module

        If the module is a package, load tests from all the modules in it.
        If the module has an ``additional_tests`` function, call it and add
        the return value to the tests.
        tadditional_testst__path__ts.pys__init__.pyt.i����s/__init__.pyiiN(RtNonetaddtappendRtloadTestsFromModulethasattrRRt__name__tendswithRtloadTestsFromNametlent
suiteClass(Rtmoduletpatterntteststfilet	submodule((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyRs$
N(Rt
__module__RRR(((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyRs	tNonDataPropertycBseZd�Zdd�ZRS(cCs
||_dS(N(tfget(RR+((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyR>scCs|dkr|S|j|�S(N(RR+(Rtobjtobjtype((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyt__get__AsN(RR)RRR.(((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyR*=s	ttestcBs�eZdZdZdddgZd�Zd�Zed
��Zd�Z	d�Z
ejgd��Z
eejd���Zed��Zd�Zd�Zed��Zed��ZRS(s.Command to run unit tests after in-place builds#run unit tests after in-place buildstest-module=tms$Run 'test_suite' in specified modulestest-suite=tss9Run single test, case or suite (e.g. 'module.test_suite')stest-runner=trsTest runner to usecCs(d|_d|_d|_d|_dS(N(Rt
test_suitettest_modulettest_loaderttest_runner(R((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pytinitialize_optionsSs			cCs�|jr'|jr'd}t|��n|jdkrj|jdkrW|jj|_qj|jd|_n|jdkr�t|jdd�|_n|jdkr�d|_n|jdkr�t|jdd�|_ndS(Ns1You may specify a module or a suite, but not boths.test_suiteR5s&setuptools.command.test:ScanningLoaderR6(R3R4RRtdistributionR5tgetattrR6(Rtmsg((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pytfinalize_optionsYscCst|j��S(N(tlistt
_test_args(R((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyt	test_argslsccsJ|jr!tjdkr!dVn|jr2dVn|jrF|jVndS(Niitdiscovers	--verbose(ii(R3tsystversion_infotverbose(R((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyR=ps		cCs|j��|�WdQXdS(sI
        Backward compatibility for project_on_sys_path context.
        N(tproject_on_sys_path(Rtfunc((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pytwith_project_on_sys_pathxs
c	cs�tjot|jdt�}|r�|jddd�|jd�|jd�}t|j	�}|jdd|�|jd�|jddd�|jd�n-|jd�|jddd�|jd�|jd�}t
j}t
jj
�}zut|j�}t
jjd|�tj�td	��td
|j|jf�|j|g��
dVWdQXWd|t
j(t
jj�t
jj|�tj�XdS(Ntuse_2to3tbuild_pytinplaceitegg_infotegg_baset	build_exticSs
|j�S(N(tactivate(tdist((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyt<lambda>�Rs%s==%s(RtPY3R9R8tFalsetreinitialize_commandtrun_commandtget_finalized_commandR	t	build_libR@tpathtmodulestcopyRJtinsertR
RR
Rtegg_nametegg_versiontpaths_on_pythonpathtcleartupdate(	Rt
include_distst	with_2to3tbpy_cmdt
build_pathtei_cmdtold_pathtold_modulestproject_path((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyRCs8








ccs�t�}tjjd|�}tjjdd�}zXtjj|�}td||g�}tjj|�}|r�|tjd<ndVWd||kr�tjjdd�n
|tjd<XdS(s�
        Add the indicated paths to the head of the PYTHONPATH environment
        variable so that subprocesses will also see the packages at
        these paths.

        Do this in a context that restores the value on exit.
        t
PYTHONPATHRN(	tobjecttostenvirontgettpathseptjoinRRtpop(tpathstnothingtorig_pythonpathtcurrent_pythonpathtprefixtto_jointnew_path((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyR[�s
		cCs_|j|j�}|j|jp$g�}|jd�|jj�D��}tj|||�S(s�
        Install the requirements indicated by self.distribution and
        return an iterable of the dists that were built.
        css:|]0\}}|jd�rt|d�r|VqdS(t:iN(t
startswithR(t.0tktv((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pys	<genexpr>�s	(tfetch_build_eggstinstall_requirest
tests_requiretextras_requiretitemst	itertoolstchain(RMtir_dttr_dter_d((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyt
install_dists�s
c	Cs�|j|j�}dj|j�}|jrB|jd|�dS|jd|�ttjd�|�}|j	|��"|j
��|j�WdQXWdQXdS(Nt sskipping "%s" (dry run)srunning "%s"tlocation(R�R8Rlt_argvtdry_runtannounceRtoperatort
attrgetterR[RCt	run_tests(Rtinstalled_diststcmdRn((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pytrun�s	
c
CsEtjr�t|jdt�r�|jjd�d}|tkr�g}|tj	kre|j
|�n|d7}x0tj	D]%}|j|�ry|j
|�qyqyWtt
tj	j|��q�ntjdd|jd|j|j�d|j|j�dt�}|jj�sAd|j}|j|tj�t|��ndS(NRFRit
testLoadert
testRunnertexitsTest failed: %s(RROR9R8RPR3tsplitRR@RVRRvR<Rt__delitem__tunittesttmainRR�t_resolve_as_epR5R6tresultt
wasSuccessfulR�RtERRORR(RR$tdel_modulestnameR/R:((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyR��s(
	
cCsdg|jS(NR�(R>(R((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyR��scCs0|dkrdStjd|�}|j��S(su
        Load the indicated attribute value, called, as a as if it were
        specified as an entry point.
        Nsx=(RRtparsetresolve(tvaltparsed((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyR�s(stest-module=R0s$Run 'test_suite' in specified module(stest-suite=R1s9Run single test, case or suite (e.g. 'module.test_suite')(stest-runner=R2sTest runner to use(RR)t__doc__tdescriptiontuser_optionsR7R;R*R>R=REt
contextlibtcontextmanagerRCtstaticmethodR[R�R�R�tpropertyR�R�(((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyR/Gs(					-		(!RhR�R@R�RR�tdistutils.errorsRRt	distutilsRRtsetuptools.externRtsetuptools.extern.six.movesRRt
pkg_resourcesRRR	R
RRR
RRt
setuptoolsRRRgR*R/(((s;/usr/lib/python2.7/site-packages/setuptools/command/test.pyt<module>s@)
command/build_clib.pyc000064400000005434151733473650011013 0ustar00�
�fc@s_ddljjZddlmZddlmZddlm	Z	dejfd��YZdS(i����N(tDistutilsSetupError(tlog(tnewer_pairwise_groupt
build_clibcBseZdZd�ZRS(sv
    Override the default build_clib behaviour to do the following:

    1. Implement a rudimentary timestamp-based dependency system
       so 'compile()' doesn't run every time.
    2. Add more keys to the 'build_info' dictionary:
        * obj_deps - specify dependencies for each object compiled.
                     this should be a dictionary mapping a key
                     with the source filename to a list of
                     dependencies. Use an empty string for global
                     dependencies.
        * cflags   - specify a list of additional flags to pass to
                     the compiler.
    c
Cs4x-|D]%\}}|jd�}|dksDt|ttf�rWtd|��nt|�}tjd|�|jdt��}t|t�s�td|��ng}|jdt��}t|ttf�s�td|��nx{|D]s}|g}	|	j	|�|j|t��}
t|
ttf�sMtd|��n|	j	|
�|j
|	�q�W|jj|d|j
�}t||�ggfkr|jd�}|jd	�}
|jd
�}|jj|d|j
d|d	|
d|d|j�}n|jj||d|jd|j�qWdS(
Ntsourcessfin 'libraries' option (library '%s'), 'sources' must be present and must be a list of source filenamessbuilding '%s' librarytobj_depss\in 'libraries' option (library '%s'), 'obj_deps' must be a dictionary of type 'source: list'tt
output_dirtmacrostinclude_dirstcflagstextra_postargstdebug(tgettNonet
isinstancetlistttupleRRtinfotdicttextendtappendtcompilertobject_filenamest
build_tempRtcompileRtcreate_static_libR(tselft	librariestlib_namet
build_infoRRtdependenciestglobal_depstsourcetsrc_depst
extra_depstexpected_objectsRR	R
tobjects((sA/usr/lib/python2.7/site-packages/setuptools/command/build_clib.pytbuild_librariess`"



	


					(t__name__t
__module__t__doc__R&(((sA/usr/lib/python2.7/site-packages/setuptools/command/build_clib.pyRs(
tdistutils.command.build_clibtcommandRtorigtdistutils.errorsRt	distutilsRtsetuptools.dep_utilR(((sA/usr/lib/python2.7/site-packages/setuptools/command/build_clib.pyt<module>scommand/easy_install.py000064400000251770151733473650011255 0ustar00"""
Easy Install
------------

A tool for doing automatic download/extract/build of distutils-based Python
packages.  For detailed documentation, see the accompanying EasyInstall.txt
file, or visit the `EasyInstall home page`__.

__ https://setuptools.readthedocs.io/en/latest/easy_install.html

"""

from glob import glob
from distutils.util import get_platform
from distutils.util import convert_path, subst_vars
from distutils.errors import (
    DistutilsArgError, DistutilsOptionError,
    DistutilsError, DistutilsPlatformError,
)
from distutils.command.install import INSTALL_SCHEMES, SCHEME_KEYS
from distutils import log, dir_util
from distutils.command.build_scripts import first_line_re
from distutils.spawn import find_executable
import sys
import os
import zipimport
import shutil
import tempfile
import zipfile
import re
import stat
import random
import textwrap
import warnings
import site
import struct
import contextlib
import subprocess
import shlex
import io

from setuptools.extern import six
from setuptools.extern.six.moves import configparser, map

from setuptools import Command
from setuptools.sandbox import run_setup
from setuptools.py31compat import get_path, get_config_vars
from setuptools.py27compat import rmtree_safe
from setuptools.command import setopt
from setuptools.archive_util import unpack_archive
from setuptools.package_index import (
    PackageIndex, parse_requirement_arg, URL_SCHEME,
)
from setuptools.command import bdist_egg, egg_info
from setuptools.wheel import Wheel
from pkg_resources import (
    yield_lines, normalize_path, resource_string, ensure_directory,
    get_distribution, find_distributions, Environment, Requirement,
    Distribution, PathMetadata, EggMetadata, WorkingSet, DistributionNotFound,
    VersionConflict, DEVELOP_DIST,
)
import pkg_resources.py31compat

# Turn on PEP440Warnings
warnings.filterwarnings("default", category=pkg_resources.PEP440Warning)

__all__ = [
    'samefile', 'easy_install', 'PthDistributions', 'extract_wininst_cfg',
    'main', 'get_exe_prefixes',
]


def is_64bit():
    return struct.calcsize("P") == 8


def samefile(p1, p2):
    """
    Determine if two paths reference the same file.

    Augments os.path.samefile to work on Windows and
    suppresses errors if the path doesn't exist.
    """
    both_exist = os.path.exists(p1) and os.path.exists(p2)
    use_samefile = hasattr(os.path, 'samefile') and both_exist
    if use_samefile:
        return os.path.samefile(p1, p2)
    norm_p1 = os.path.normpath(os.path.normcase(p1))
    norm_p2 = os.path.normpath(os.path.normcase(p2))
    return norm_p1 == norm_p2


if six.PY2:

    def _to_ascii(s):
        return s

    def isascii(s):
        try:
            six.text_type(s, 'ascii')
            return True
        except UnicodeError:
            return False
else:

    def _to_ascii(s):
        return s.encode('ascii')

    def isascii(s):
        try:
            s.encode('ascii')
            return True
        except UnicodeError:
            return False


_one_liner = lambda text: textwrap.dedent(text).strip().replace('\n', '; ')


class easy_install(Command):
    """Manage a download/build/install process"""
    description = "Find/get/install Python packages"
    command_consumes_arguments = True

    user_options = [
        ('prefix=', None, "installation prefix"),
        ("zip-ok", "z", "install package as a zipfile"),
        ("multi-version", "m", "make apps have to require() a version"),
        ("upgrade", "U", "force upgrade (searches PyPI for latest versions)"),
        ("install-dir=", "d", "install package to DIR"),
        ("script-dir=", "s", "install scripts to DIR"),
        ("exclude-scripts", "x", "Don't install scripts"),
        ("always-copy", "a", "Copy all needed packages to install dir"),
        ("index-url=", "i", "base URL of Python Package Index"),
        ("find-links=", "f", "additional URL(s) to search for packages"),
        ("build-directory=", "b",
         "download/extract/build in DIR; keep the results"),
        ('optimize=', 'O',
         "also compile with optimization: -O1 for \"python -O\", "
         "-O2 for \"python -OO\", and -O0 to disable [default: -O0]"),
        ('record=', None,
         "filename in which to record list of installed files"),
        ('always-unzip', 'Z', "don't install as a zipfile, no matter what"),
        ('site-dirs=', 'S', "list of directories where .pth files work"),
        ('editable', 'e', "Install specified packages in editable form"),
        ('no-deps', 'N', "don't install dependencies"),
        ('allow-hosts=', 'H', "pattern(s) that hostnames must match"),
        ('local-snapshots-ok', 'l',
         "allow building eggs from local checkouts"),
        ('version', None, "print version information and exit"),
        ('no-find-links', None,
         "Don't load find-links defined in packages being installed")
    ]
    boolean_options = [
        'zip-ok', 'multi-version', 'exclude-scripts', 'upgrade', 'always-copy',
        'editable',
        'no-deps', 'local-snapshots-ok', 'version'
    ]

    if site.ENABLE_USER_SITE:
        help_msg = "install in user site-package '%s'" % site.USER_SITE
        user_options.append(('user', None, help_msg))
        boolean_options.append('user')

    negative_opt = {'always-unzip': 'zip-ok'}
    create_index = PackageIndex

    def initialize_options(self):
        # the --user option seems to be an opt-in one,
        # so the default should be False.
        self.user = 0
        self.zip_ok = self.local_snapshots_ok = None
        self.install_dir = self.script_dir = self.exclude_scripts = None
        self.index_url = None
        self.find_links = None
        self.build_directory = None
        self.args = None
        self.optimize = self.record = None
        self.upgrade = self.always_copy = self.multi_version = None
        self.editable = self.no_deps = self.allow_hosts = None
        self.root = self.prefix = self.no_report = None
        self.version = None
        self.install_purelib = None  # for pure module distributions
        self.install_platlib = None  # non-pure (dists w/ extensions)
        self.install_headers = None  # for C/C++ headers
        self.install_lib = None  # set to either purelib or platlib
        self.install_scripts = None
        self.install_data = None
        self.install_base = None
        self.install_platbase = None
        if site.ENABLE_USER_SITE:
            self.install_userbase = site.USER_BASE
            self.install_usersite = site.USER_SITE
        else:
            self.install_userbase = None
            self.install_usersite = None
        self.no_find_links = None

        # Options not specifiable via command line
        self.package_index = None
        self.pth_file = self.always_copy_from = None
        self.site_dirs = None
        self.installed_projects = {}
        self.sitepy_installed = False
        # Always read easy_install options, even if we are subclassed, or have
        # an independent instance created.  This ensures that defaults will
        # always come from the standard configuration file(s)' "easy_install"
        # section, even if this is a "develop" or "install" command, or some
        # other embedding.
        self._dry_run = None
        self.verbose = self.distribution.verbose
        self.distribution._set_command_options(
            self, self.distribution.get_option_dict('easy_install')
        )

    def delete_blockers(self, blockers):
        extant_blockers = (
            filename for filename in blockers
            if os.path.exists(filename) or os.path.islink(filename)
        )
        list(map(self._delete_path, extant_blockers))

    def _delete_path(self, path):
        log.info("Deleting %s", path)
        if self.dry_run:
            return

        is_tree = os.path.isdir(path) and not os.path.islink(path)
        remover = rmtree if is_tree else os.unlink
        remover(path)

    @staticmethod
    def _render_version():
        """
        Render the Setuptools version and installation details, then exit.
        """
        ver = sys.version[:3]
        dist = get_distribution('setuptools')
        tmpl = 'setuptools {dist.version} from {dist.location} (Python {ver})'
        print(tmpl.format(**locals()))
        raise SystemExit()

    def finalize_options(self):
        self.version and self._render_version()

        py_version = sys.version.split()[0]
        prefix, exec_prefix = get_config_vars('prefix', 'exec_prefix')

        self.config_vars = {
            'dist_name': self.distribution.get_name(),
            'dist_version': self.distribution.get_version(),
            'dist_fullname': self.distribution.get_fullname(),
            'py_version': py_version,
            'py_version_short': py_version[0:3],
            'py_version_nodot': py_version[0] + py_version[2],
            'sys_prefix': prefix,
            'prefix': prefix,
            'sys_exec_prefix': exec_prefix,
            'exec_prefix': exec_prefix,
            # Only python 3.2+ has abiflags
            'abiflags': getattr(sys, 'abiflags', ''),
        }

        if site.ENABLE_USER_SITE:
            self.config_vars['userbase'] = self.install_userbase
            self.config_vars['usersite'] = self.install_usersite

        self._fix_install_dir_for_user_site()

        self.expand_basedirs()
        self.expand_dirs()

        self._expand(
            'install_dir', 'script_dir', 'build_directory',
            'site_dirs',
        )
        # If a non-default installation directory was specified, default the
        # script directory to match it.
        if self.script_dir is None:
            self.script_dir = self.install_dir

        if self.no_find_links is None:
            self.no_find_links = False

        # Let install_dir get set by install_lib command, which in turn
        # gets its info from the install command, and takes into account
        # --prefix and --home and all that other crud.
        self.set_undefined_options(
            'install_lib', ('install_dir', 'install_dir')
        )
        # Likewise, set default script_dir from 'install_scripts.install_dir'
        self.set_undefined_options(
            'install_scripts', ('install_dir', 'script_dir')
        )

        if self.user and self.install_purelib:
            self.install_dir = self.install_purelib
            self.script_dir = self.install_scripts
        # default --record from the install command
        self.set_undefined_options('install', ('record', 'record'))
        # Should this be moved to the if statement below? It's not used
        # elsewhere
        normpath = map(normalize_path, sys.path)
        self.all_site_dirs = get_site_dirs()
        if self.site_dirs is not None:
            site_dirs = [
                os.path.expanduser(s.strip()) for s in
                self.site_dirs.split(',')
            ]
            for d in site_dirs:
                if not os.path.isdir(d):
                    log.warn("%s (in --site-dirs) does not exist", d)
                elif normalize_path(d) not in normpath:
                    raise DistutilsOptionError(
                        d + " (in --site-dirs) is not on sys.path"
                    )
                else:
                    self.all_site_dirs.append(normalize_path(d))
        if not self.editable:
            self.check_site_dir()
        self.index_url = self.index_url or "https://pypi.python.org/simple"
        self.shadow_path = self.all_site_dirs[:]
        for path_item in self.install_dir, normalize_path(self.script_dir):
            if path_item not in self.shadow_path:
                self.shadow_path.insert(0, path_item)

        if self.allow_hosts is not None:
            hosts = [s.strip() for s in self.allow_hosts.split(',')]
        else:
            hosts = ['*']
        if self.package_index is None:
            self.package_index = self.create_index(
                self.index_url, search_path=self.shadow_path, hosts=hosts,
            )
        self.local_index = Environment(self.shadow_path + sys.path)

        if self.find_links is not None:
            if isinstance(self.find_links, six.string_types):
                self.find_links = self.find_links.split()
        else:
            self.find_links = []
        if self.local_snapshots_ok:
            self.package_index.scan_egg_links(self.shadow_path + sys.path)
        if not self.no_find_links:
            self.package_index.add_find_links(self.find_links)
        self.set_undefined_options('install_lib', ('optimize', 'optimize'))
        if not isinstance(self.optimize, int):
            try:
                self.optimize = int(self.optimize)
                if not (0 <= self.optimize <= 2):
                    raise ValueError
            except ValueError:
                raise DistutilsOptionError("--optimize must be 0, 1, or 2")

        if self.editable and not self.build_directory:
            raise DistutilsArgError(
                "Must specify a build directory (-b) when using --editable"
            )
        if not self.args:
            raise DistutilsArgError(
                "No urls, filenames, or requirements specified (see --help)")

        self.outputs = []

    def _fix_install_dir_for_user_site(self):
        """
        Fix the install_dir if "--user" was used.
        """
        if not self.user or not site.ENABLE_USER_SITE:
            return

        self.create_home_path()
        if self.install_userbase is None:
            msg = "User base directory is not specified"
            raise DistutilsPlatformError(msg)
        self.install_base = self.install_platbase = self.install_userbase
        scheme_name = os.name.replace('posix', 'unix') + '_user'
        self.select_scheme(scheme_name)

    def _expand_attrs(self, attrs):
        for attr in attrs:
            val = getattr(self, attr)
            if val is not None:
                if os.name == 'posix' or os.name == 'nt':
                    val = os.path.expanduser(val)
                val = subst_vars(val, self.config_vars)
                setattr(self, attr, val)

    def expand_basedirs(self):
        """Calls `os.path.expanduser` on install_base, install_platbase and
        root."""
        self._expand_attrs(['install_base', 'install_platbase', 'root'])

    def expand_dirs(self):
        """Calls `os.path.expanduser` on install dirs."""
        dirs = [
            'install_purelib',
            'install_platlib',
            'install_lib',
            'install_headers',
            'install_scripts',
            'install_data',
        ]
        self._expand_attrs(dirs)

    def run(self):
        if self.verbose != self.distribution.verbose:
            log.set_verbosity(self.verbose)
        try:
            for spec in self.args:
                self.easy_install(spec, not self.no_deps)
            if self.record:
                outputs = self.outputs
                if self.root:  # strip any package prefix
                    root_len = len(self.root)
                    for counter in range(len(outputs)):
                        outputs[counter] = outputs[counter][root_len:]
                from distutils import file_util

                self.execute(
                    file_util.write_file, (self.record, outputs),
                    "writing list of installed files to '%s'" %
                    self.record
                )
            self.warn_deprecated_options()
        finally:
            log.set_verbosity(self.distribution.verbose)

    def pseudo_tempname(self):
        """Return a pseudo-tempname base in the install directory.
        This code is intentionally naive; if a malicious party can write to
        the target directory you're already in deep doodoo.
        """
        try:
            pid = os.getpid()
        except Exception:
            pid = random.randint(0, sys.maxsize)
        return os.path.join(self.install_dir, "test-easy-install-%s" % pid)

    def warn_deprecated_options(self):
        pass

    def check_site_dir(self):
        """Verify that self.install_dir is .pth-capable dir, if needed"""

        instdir = normalize_path(self.install_dir)
        pth_file = os.path.join(instdir, 'easy-install.pth')

        # Is it a configured, PYTHONPATH, implicit, or explicit site dir?
        is_site_dir = instdir in self.all_site_dirs

        if not is_site_dir and not self.multi_version:
            # No?  Then directly test whether it does .pth file processing
            is_site_dir = self.check_pth_processing()
        else:
            # make sure we can write to target dir
            testfile = self.pseudo_tempname() + '.write-test'
            test_exists = os.path.exists(testfile)
            try:
                if test_exists:
                    os.unlink(testfile)
                open(testfile, 'w').close()
                os.unlink(testfile)
            except (OSError, IOError):
                self.cant_write_to_target()

        if not is_site_dir and not self.multi_version:
            # Can't install non-multi to non-site dir
            raise DistutilsError(self.no_default_version_msg())

        if is_site_dir:
            if self.pth_file is None:
                self.pth_file = PthDistributions(pth_file, self.all_site_dirs)
        else:
            self.pth_file = None

        if instdir not in map(normalize_path, _pythonpath()):
            # only PYTHONPATH dirs need a site.py, so pretend it's there
            self.sitepy_installed = True
        elif self.multi_version and not os.path.exists(pth_file):
            self.sitepy_installed = True  # don't need site.py in this case
            self.pth_file = None  # and don't create a .pth file
        self.install_dir = instdir

    __cant_write_msg = textwrap.dedent("""
        can't create or remove files in install directory

        The following error occurred while trying to add or remove files in the
        installation directory:

            %s

        The installation directory you specified (via --install-dir, --prefix, or
        the distutils default setting) was:

            %s
        """).lstrip()

    __not_exists_id = textwrap.dedent("""
        This directory does not currently exist.  Please create it and try again, or
        choose a different installation directory (using the -d or --install-dir
        option).
        """).lstrip()

    __access_msg = textwrap.dedent("""
        Perhaps your account does not have write access to this directory?  If the
        installation directory is a system-owned directory, you may need to sign in
        as the administrator or "root" account.  If you do not have administrative
        access to this machine, you may wish to choose a different installation
        directory, preferably one that is listed in your PYTHONPATH environment
        variable.

        For information on other options, you may wish to consult the
        documentation at:

          https://setuptools.readthedocs.io/en/latest/easy_install.html

        Please make the appropriate changes for your system and try again.
        """).lstrip()

    def cant_write_to_target(self):
        msg = self.__cant_write_msg % (sys.exc_info()[1], self.install_dir,)

        if not os.path.exists(self.install_dir):
            msg += '\n' + self.__not_exists_id
        else:
            msg += '\n' + self.__access_msg
        raise DistutilsError(msg)

    def check_pth_processing(self):
        """Empirically verify whether .pth files are supported in inst. dir"""
        instdir = self.install_dir
        log.info("Checking .pth file support in %s", instdir)
        pth_file = self.pseudo_tempname() + ".pth"
        ok_file = pth_file + '.ok'
        ok_exists = os.path.exists(ok_file)
        tmpl = _one_liner("""
            import os
            f = open({ok_file!r}, 'w')
            f.write('OK')
            f.close()
            """) + '\n'
        try:
            if ok_exists:
                os.unlink(ok_file)
            dirname = os.path.dirname(ok_file)
            pkg_resources.py31compat.makedirs(dirname, exist_ok=True)
            f = open(pth_file, 'w')
        except (OSError, IOError):
            self.cant_write_to_target()
        else:
            try:
                f.write(tmpl.format(**locals()))
                f.close()
                f = None
                executable = sys.executable
                if os.name == 'nt':
                    dirname, basename = os.path.split(executable)
                    alt = os.path.join(dirname, 'pythonw.exe')
                    use_alt = (
                        basename.lower() == 'python.exe' and
                        os.path.exists(alt)
                    )
                    if use_alt:
                        # use pythonw.exe to avoid opening a console window
                        executable = alt

                from distutils.spawn import spawn

                spawn([executable, '-E', '-c', 'pass'], 0)

                if os.path.exists(ok_file):
                    log.info(
                        "TEST PASSED: %s appears to support .pth files",
                        instdir
                    )
                    return True
            finally:
                if f:
                    f.close()
                if os.path.exists(ok_file):
                    os.unlink(ok_file)
                if os.path.exists(pth_file):
                    os.unlink(pth_file)
        if not self.multi_version:
            log.warn("TEST FAILED: %s does NOT support .pth files", instdir)
        return False

    def install_egg_scripts(self, dist):
        """Write all the scripts for `dist`, unless scripts are excluded"""
        if not self.exclude_scripts and dist.metadata_isdir('scripts'):
            for script_name in dist.metadata_listdir('scripts'):
                if dist.metadata_isdir('scripts/' + script_name):
                    # The "script" is a directory, likely a Python 3
                    # __pycache__ directory, so skip it.
                    continue
                self.install_script(
                    dist, script_name,
                    dist.get_metadata('scripts/' + script_name)
                )
        self.install_wrapper_scripts(dist)

    def add_output(self, path):
        if os.path.isdir(path):
            for base, dirs, files in os.walk(path):
                for filename in files:
                    self.outputs.append(os.path.join(base, filename))
        else:
            self.outputs.append(path)

    def not_editable(self, spec):
        if self.editable:
            raise DistutilsArgError(
                "Invalid argument %r: you can't use filenames or URLs "
                "with --editable (except via the --find-links option)."
                % (spec,)
            )

    def check_editable(self, spec):
        if not self.editable:
            return

        if os.path.exists(os.path.join(self.build_directory, spec.key)):
            raise DistutilsArgError(
                "%r already exists in %s; can't do a checkout there" %
                (spec.key, self.build_directory)
            )

    @contextlib.contextmanager
    def _tmpdir(self):
        tmpdir = tempfile.mkdtemp(prefix=six.u("easy_install-"))
        try:
            # cast to str as workaround for #709 and #710 and #712
            yield str(tmpdir)
        finally:
            os.path.exists(tmpdir) and rmtree(rmtree_safe(tmpdir))

    def easy_install(self, spec, deps=False):
        if not self.editable:
            self.install_site_py()

        with self._tmpdir() as tmpdir:
            if not isinstance(spec, Requirement):
                if URL_SCHEME(spec):
                    # It's a url, download it to tmpdir and process
                    self.not_editable(spec)
                    dl = self.package_index.download(spec, tmpdir)
                    return self.install_item(None, dl, tmpdir, deps, True)

                elif os.path.exists(spec):
                    # Existing file or directory, just process it directly
                    self.not_editable(spec)
                    return self.install_item(None, spec, tmpdir, deps, True)
                else:
                    spec = parse_requirement_arg(spec)

            self.check_editable(spec)
            dist = self.package_index.fetch_distribution(
                spec, tmpdir, self.upgrade, self.editable,
                not self.always_copy, self.local_index
            )
            if dist is None:
                msg = "Could not find suitable distribution for %r" % spec
                if self.always_copy:
                    msg += " (--always-copy skips system and development eggs)"
                raise DistutilsError(msg)
            elif dist.precedence == DEVELOP_DIST:
                # .egg-info dists don't need installing, just process deps
                self.process_distribution(spec, dist, deps, "Using")
                return dist
            else:
                return self.install_item(spec, dist.location, tmpdir, deps)

    def install_item(self, spec, download, tmpdir, deps, install_needed=False):

        # Installation is also needed if file in tmpdir or is not an egg
        install_needed = install_needed or self.always_copy
        install_needed = install_needed or os.path.dirname(download) == tmpdir
        install_needed = install_needed or not download.endswith('.egg')
        install_needed = install_needed or (
            self.always_copy_from is not None and
            os.path.dirname(normalize_path(download)) ==
            normalize_path(self.always_copy_from)
        )

        if spec and not install_needed:
            # at this point, we know it's a local .egg, we just don't know if
            # it's already installed.
            for dist in self.local_index[spec.project_name]:
                if dist.location == download:
                    break
            else:
                install_needed = True  # it's not in the local index

        log.info("Processing %s", os.path.basename(download))

        if install_needed:
            dists = self.install_eggs(spec, download, tmpdir)
            for dist in dists:
                self.process_distribution(spec, dist, deps)
        else:
            dists = [self.egg_distribution(download)]
            self.process_distribution(spec, dists[0], deps, "Using")

        if spec is not None:
            for dist in dists:
                if dist in spec:
                    return dist

    def select_scheme(self, name):
        """Sets the install directories by applying the install schemes."""
        # it's the caller's problem if they supply a bad name!
        scheme = INSTALL_SCHEMES[name]
        for key in SCHEME_KEYS:
            attrname = 'install_' + key
            if getattr(self, attrname) is None:
                setattr(self, attrname, scheme[key])

    def process_distribution(self, requirement, dist, deps=True, *info):
        self.update_pth(dist)
        self.package_index.add(dist)
        if dist in self.local_index[dist.key]:
            self.local_index.remove(dist)
        self.local_index.add(dist)
        self.install_egg_scripts(dist)
        self.installed_projects[dist.key] = dist
        log.info(self.installation_report(requirement, dist, *info))
        if (dist.has_metadata('dependency_links.txt') and
                not self.no_find_links):
            self.package_index.add_find_links(
                dist.get_metadata_lines('dependency_links.txt')
            )
        if not deps and not self.always_copy:
            return
        elif requirement is not None and dist.key != requirement.key:
            log.warn("Skipping dependencies for %s", dist)
            return  # XXX this is not the distribution we were looking for
        elif requirement is None or dist not in requirement:
            # if we wound up with a different version, resolve what we've got
            distreq = dist.as_requirement()
            requirement = Requirement(str(distreq))
        log.info("Processing dependencies for %s", requirement)
        try:
            distros = WorkingSet([]).resolve(
                [requirement], self.local_index, self.easy_install
            )
        except DistributionNotFound as e:
            raise DistutilsError(str(e))
        except VersionConflict as e:
            raise DistutilsError(e.report())
        if self.always_copy or self.always_copy_from:
            # Force all the relevant distros to be copied or activated
            for dist in distros:
                if dist.key not in self.installed_projects:
                    self.easy_install(dist.as_requirement())
        log.info("Finished processing dependencies for %s", requirement)

    def should_unzip(self, dist):
        if self.zip_ok is not None:
            return not self.zip_ok
        if dist.has_metadata('not-zip-safe'):
            return True
        if not dist.has_metadata('zip-safe'):
            return True
        return False

    def maybe_move(self, spec, dist_filename, setup_base):
        dst = os.path.join(self.build_directory, spec.key)
        if os.path.exists(dst):
            msg = (
                "%r already exists in %s; build directory %s will not be kept"
            )
            log.warn(msg, spec.key, self.build_directory, setup_base)
            return setup_base
        if os.path.isdir(dist_filename):
            setup_base = dist_filename
        else:
            if os.path.dirname(dist_filename) == setup_base:
                os.unlink(dist_filename)  # get it out of the tmp dir
            contents = os.listdir(setup_base)
            if len(contents) == 1:
                dist_filename = os.path.join(setup_base, contents[0])
                if os.path.isdir(dist_filename):
                    # if the only thing there is a directory, move it instead
                    setup_base = dist_filename
        ensure_directory(dst)
        shutil.move(setup_base, dst)
        return dst

    def install_wrapper_scripts(self, dist):
        if self.exclude_scripts:
            return
        for args in ScriptWriter.best().get_args(dist):
            self.write_script(*args)

    def install_script(self, dist, script_name, script_text, dev_path=None):
        """Generate a legacy script wrapper and install it"""
        spec = str(dist.as_requirement())
        is_script = is_python_script(script_text, script_name)

        if is_script:
            body = self._load_template(dev_path) % locals()
            script_text = ScriptWriter.get_header(script_text) + body
        self.write_script(script_name, _to_ascii(script_text), 'b')

    @staticmethod
    def _load_template(dev_path):
        """
        There are a couple of template scripts in the package. This
        function loads one of them and prepares it for use.
        """
        # See https://github.com/pypa/setuptools/issues/134 for info
        # on script file naming and downstream issues with SVR4
        name = 'script.tmpl'
        if dev_path:
            name = name.replace('.tmpl', ' (dev).tmpl')

        raw_bytes = resource_string('setuptools', name)
        return raw_bytes.decode('utf-8')

    def write_script(self, script_name, contents, mode="t", blockers=()):
        """Write an executable file to the scripts directory"""
        self.delete_blockers(  # clean up old .py/.pyw w/o a script
            [os.path.join(self.script_dir, x) for x in blockers]
        )
        log.info("Installing %s script to %s", script_name, self.script_dir)
        target = os.path.join(self.script_dir, script_name)
        self.add_output(target)

        if self.dry_run:
            return

        mask = current_umask()
        ensure_directory(target)
        if os.path.exists(target):
            os.unlink(target)
        with open(target, "w" + mode) as f:
            f.write(contents)
        chmod(target, 0o777 - mask)

    def install_eggs(self, spec, dist_filename, tmpdir):
        # .egg dirs or files are already built, so just return them
        if dist_filename.lower().endswith('.egg'):
            return [self.install_egg(dist_filename, tmpdir)]
        elif dist_filename.lower().endswith('.exe'):
            return [self.install_exe(dist_filename, tmpdir)]
        elif dist_filename.lower().endswith('.whl'):
            return [self.install_wheel(dist_filename, tmpdir)]

        # Anything else, try to extract and build
        setup_base = tmpdir
        if os.path.isfile(dist_filename) and not dist_filename.endswith('.py'):
            unpack_archive(dist_filename, tmpdir, self.unpack_progress)
        elif os.path.isdir(dist_filename):
            setup_base = os.path.abspath(dist_filename)

        if (setup_base.startswith(tmpdir)  # something we downloaded
                and self.build_directory and spec is not None):
            setup_base = self.maybe_move(spec, dist_filename, setup_base)

        # Find the setup.py file
        setup_script = os.path.join(setup_base, 'setup.py')

        if not os.path.exists(setup_script):
            setups = glob(os.path.join(setup_base, '*', 'setup.py'))
            if not setups:
                raise DistutilsError(
                    "Couldn't find a setup script in %s" %
                    os.path.abspath(dist_filename)
                )
            if len(setups) > 1:
                raise DistutilsError(
                    "Multiple setup scripts in %s" %
                    os.path.abspath(dist_filename)
                )
            setup_script = setups[0]

        # Now run it, and return the result
        if self.editable:
            log.info(self.report_editable(spec, setup_script))
            return []
        else:
            return self.build_and_install(setup_script, setup_base)

    def egg_distribution(self, egg_path):
        if os.path.isdir(egg_path):
            metadata = PathMetadata(egg_path, os.path.join(egg_path,
                                                           'EGG-INFO'))
        else:
            metadata = EggMetadata(zipimport.zipimporter(egg_path))
        return Distribution.from_filename(egg_path, metadata=metadata)

    def install_egg(self, egg_path, tmpdir):
        destination = os.path.join(
            self.install_dir,
            os.path.basename(egg_path),
        )
        destination = os.path.abspath(destination)
        if not self.dry_run:
            ensure_directory(destination)

        dist = self.egg_distribution(egg_path)
        if not samefile(egg_path, destination):
            if os.path.isdir(destination) and not os.path.islink(destination):
                dir_util.remove_tree(destination, dry_run=self.dry_run)
            elif os.path.exists(destination):
                self.execute(
                    os.unlink,
                    (destination,),
                    "Removing " + destination,
                )
            try:
                new_dist_is_zipped = False
                if os.path.isdir(egg_path):
                    if egg_path.startswith(tmpdir):
                        f, m = shutil.move, "Moving"
                    else:
                        f, m = shutil.copytree, "Copying"
                elif self.should_unzip(dist):
                    self.mkpath(destination)
                    f, m = self.unpack_and_compile, "Extracting"
                else:
                    new_dist_is_zipped = True
                    if egg_path.startswith(tmpdir):
                        f, m = shutil.move, "Moving"
                    else:
                        f, m = shutil.copy2, "Copying"
                self.execute(
                    f,
                    (egg_path, destination),
                    (m + " %s to %s") % (
                        os.path.basename(egg_path),
                        os.path.dirname(destination)
                    ),
                )
                update_dist_caches(
                    destination,
                    fix_zipimporter_caches=new_dist_is_zipped,
                )
            except Exception:
                update_dist_caches(destination, fix_zipimporter_caches=False)
                raise

        self.add_output(destination)
        return self.egg_distribution(destination)

    def install_exe(self, dist_filename, tmpdir):
        # See if it's valid, get data
        cfg = extract_wininst_cfg(dist_filename)
        if cfg is None:
            raise DistutilsError(
                "%s is not a valid distutils Windows .exe" % dist_filename
            )
        # Create a dummy distribution object until we build the real distro
        dist = Distribution(
            None,
            project_name=cfg.get('metadata', 'name'),
            version=cfg.get('metadata', 'version'), platform=get_platform(),
        )

        # Convert the .exe to an unpacked egg
        egg_path = os.path.join(tmpdir, dist.egg_name() + '.egg')
        dist.location = egg_path
        egg_tmp = egg_path + '.tmp'
        _egg_info = os.path.join(egg_tmp, 'EGG-INFO')
        pkg_inf = os.path.join(_egg_info, 'PKG-INFO')
        ensure_directory(pkg_inf)  # make sure EGG-INFO dir exists
        dist._provider = PathMetadata(egg_tmp, _egg_info)  # XXX
        self.exe_to_egg(dist_filename, egg_tmp)

        # Write EGG-INFO/PKG-INFO
        if not os.path.exists(pkg_inf):
            f = open(pkg_inf, 'w')
            f.write('Metadata-Version: 1.0\n')
            for k, v in cfg.items('metadata'):
                if k != 'target_version':
                    f.write('%s: %s\n' % (k.replace('_', '-').title(), v))
            f.close()
        script_dir = os.path.join(_egg_info, 'scripts')
        # delete entry-point scripts to avoid duping
        self.delete_blockers([
            os.path.join(script_dir, args[0])
            for args in ScriptWriter.get_args(dist)
        ])
        # Build .egg file from tmpdir
        bdist_egg.make_zipfile(
            egg_path, egg_tmp, verbose=self.verbose, dry_run=self.dry_run,
        )
        # install the .egg
        return self.install_egg(egg_path, tmpdir)

    def exe_to_egg(self, dist_filename, egg_tmp):
        """Extract a bdist_wininst to the directories an egg would use"""
        # Check for .pth file and set up prefix translations
        prefixes = get_exe_prefixes(dist_filename)
        to_compile = []
        native_libs = []
        top_level = {}

        def process(src, dst):
            s = src.lower()
            for old, new in prefixes:
                if s.startswith(old):
                    src = new + src[len(old):]
                    parts = src.split('/')
                    dst = os.path.join(egg_tmp, *parts)
                    dl = dst.lower()
                    if dl.endswith('.pyd') or dl.endswith('.dll'):
                        parts[-1] = bdist_egg.strip_module(parts[-1])
                        top_level[os.path.splitext(parts[0])[0]] = 1
                        native_libs.append(src)
                    elif dl.endswith('.py') and old != 'SCRIPTS/':
                        top_level[os.path.splitext(parts[0])[0]] = 1
                        to_compile.append(dst)
                    return dst
            if not src.endswith('.pth'):
                log.warn("WARNING: can't process %s", src)
            return None

        # extract, tracking .pyd/.dll->native_libs and .py -> to_compile
        unpack_archive(dist_filename, egg_tmp, process)
        stubs = []
        for res in native_libs:
            if res.lower().endswith('.pyd'):  # create stubs for .pyd's
                parts = res.split('/')
                resource = parts[-1]
                parts[-1] = bdist_egg.strip_module(parts[-1]) + '.py'
                pyfile = os.path.join(egg_tmp, *parts)
                to_compile.append(pyfile)
                stubs.append(pyfile)
                bdist_egg.write_stub(resource, pyfile)
        self.byte_compile(to_compile)  # compile .py's
        bdist_egg.write_safety_flag(
            os.path.join(egg_tmp, 'EGG-INFO'),
            bdist_egg.analyze_egg(egg_tmp, stubs))  # write zip-safety flag

        for name in 'top_level', 'native_libs':
            if locals()[name]:
                txt = os.path.join(egg_tmp, 'EGG-INFO', name + '.txt')
                if not os.path.exists(txt):
                    f = open(txt, 'w')
                    f.write('\n'.join(locals()[name]) + '\n')
                    f.close()

    def install_wheel(self, wheel_path, tmpdir):
        wheel = Wheel(wheel_path)
        assert wheel.is_compatible()
        destination = os.path.join(self.install_dir, wheel.egg_name())
        destination = os.path.abspath(destination)
        if not self.dry_run:
            ensure_directory(destination)
        if os.path.isdir(destination) and not os.path.islink(destination):
            dir_util.remove_tree(destination, dry_run=self.dry_run)
        elif os.path.exists(destination):
            self.execute(
                os.unlink,
                (destination,),
                "Removing " + destination,
            )
        try:
            self.execute(
                wheel.install_as_egg,
                (destination,),
                ("Installing %s to %s") % (
                    os.path.basename(wheel_path),
                    os.path.dirname(destination)
                ),
            )
        finally:
            update_dist_caches(destination, fix_zipimporter_caches=False)
        self.add_output(destination)
        return self.egg_distribution(destination)

    __mv_warning = textwrap.dedent("""
        Because this distribution was installed --multi-version, before you can
        import modules from this package in an application, you will need to
        'import pkg_resources' and then use a 'require()' call similar to one of
        these examples, in order to select the desired version:

            pkg_resources.require("%(name)s")  # latest installed version
            pkg_resources.require("%(name)s==%(version)s")  # this exact version
            pkg_resources.require("%(name)s>=%(version)s")  # this version or higher
        """).lstrip()

    __id_warning = textwrap.dedent("""
        Note also that the installation directory must be on sys.path at runtime for
        this to work.  (e.g. by being the application's script directory, by being on
        PYTHONPATH, or by being added to sys.path by your code.)
        """)

    def installation_report(self, req, dist, what="Installed"):
        """Helpful installation message for display to package users"""
        msg = "\n%(what)s %(eggloc)s%(extras)s"
        if self.multi_version and not self.no_report:
            msg += '\n' + self.__mv_warning
            if self.install_dir not in map(normalize_path, sys.path):
                msg += '\n' + self.__id_warning

        eggloc = dist.location
        name = dist.project_name
        version = dist.version
        extras = ''  # TODO: self.report_extras(req, dist)
        return msg % locals()

    __editable_msg = textwrap.dedent("""
        Extracted editable version of %(spec)s to %(dirname)s

        If it uses setuptools in its setup script, you can activate it in
        "development" mode by going to that directory and running::

            %(python)s setup.py develop

        See the setuptools documentation for the "develop" command for more info.
        """).lstrip()

    def report_editable(self, spec, setup_script):
        dirname = os.path.dirname(setup_script)
        python = sys.executable
        return '\n' + self.__editable_msg % locals()

    def run_setup(self, setup_script, setup_base, args):
        sys.modules.setdefault('distutils.command.bdist_egg', bdist_egg)
        sys.modules.setdefault('distutils.command.egg_info', egg_info)

        args = list(args)
        if self.verbose > 2:
            v = 'v' * (self.verbose - 1)
            args.insert(0, '-' + v)
        elif self.verbose < 2:
            args.insert(0, '-q')
        if self.dry_run:
            args.insert(0, '-n')
        log.info(
            "Running %s %s", setup_script[len(setup_base) + 1:], ' '.join(args)
        )
        try:
            run_setup(setup_script, args)
        except SystemExit as v:
            raise DistutilsError("Setup script exited with %s" % (v.args[0],))

    def build_and_install(self, setup_script, setup_base):
        args = ['bdist_egg', '--dist-dir']

        dist_dir = tempfile.mkdtemp(
            prefix='egg-dist-tmp-', dir=os.path.dirname(setup_script)
        )
        try:
            self._set_fetcher_options(os.path.dirname(setup_script))
            args.append(dist_dir)

            self.run_setup(setup_script, setup_base, args)
            all_eggs = Environment([dist_dir])
            eggs = []
            for key in all_eggs:
                for dist in all_eggs[key]:
                    eggs.append(self.install_egg(dist.location, setup_base))
            if not eggs and not self.dry_run:
                log.warn("No eggs found in %s (setup script problem?)",
                         dist_dir)
            return eggs
        finally:
            rmtree(dist_dir)
            log.set_verbosity(self.verbose)  # restore our log verbosity

    def _set_fetcher_options(self, base):
        """
        When easy_install is about to run bdist_egg on a source dist, that
        source dist might have 'setup_requires' directives, requiring
        additional fetching. Ensure the fetcher options given to easy_install
        are available to that command as well.
        """
        # find the fetch options from easy_install and write them out
        # to the setup.cfg file.
        ei_opts = self.distribution.get_option_dict('easy_install').copy()
        fetch_directives = (
            'find_links', 'site_dirs', 'index_url', 'optimize',
            'site_dirs', 'allow_hosts',
        )
        fetch_options = {}
        for key, val in ei_opts.items():
            if key not in fetch_directives:
                continue
            fetch_options[key.replace('_', '-')] = val[1]
        # create a settings dictionary suitable for `edit_config`
        settings = dict(easy_install=fetch_options)
        cfg_filename = os.path.join(base, 'setup.cfg')
        setopt.edit_config(cfg_filename, settings)

    def update_pth(self, dist):
        if self.pth_file is None:
            return

        for d in self.pth_file[dist.key]:  # drop old entries
            if self.multi_version or d.location != dist.location:
                log.info("Removing %s from easy-install.pth file", d)
                self.pth_file.remove(d)
                if d.location in self.shadow_path:
                    self.shadow_path.remove(d.location)

        if not self.multi_version:
            if dist.location in self.pth_file.paths:
                log.info(
                    "%s is already the active version in easy-install.pth",
                    dist,
                )
            else:
                log.info("Adding %s to easy-install.pth file", dist)
                self.pth_file.add(dist)  # add new entry
                if dist.location not in self.shadow_path:
                    self.shadow_path.append(dist.location)

        if not self.dry_run:

            self.pth_file.save()

            if dist.key == 'setuptools':
                # Ensure that setuptools itself never becomes unavailable!
                # XXX should this check for latest version?
                filename = os.path.join(self.install_dir, 'setuptools.pth')
                if os.path.islink(filename):
                    os.unlink(filename)
                f = open(filename, 'wt')
                f.write(self.pth_file.make_relative(dist.location) + '\n')
                f.close()

    def unpack_progress(self, src, dst):
        # Progress filter for unpacking
        log.debug("Unpacking %s to %s", src, dst)
        return dst  # only unpack-and-compile skips files for dry run

    def unpack_and_compile(self, egg_path, destination):
        to_compile = []
        to_chmod = []

        def pf(src, dst):
            if dst.endswith('.py') and not src.startswith('EGG-INFO/'):
                to_compile.append(dst)
            elif dst.endswith('.dll') or dst.endswith('.so'):
                to_chmod.append(dst)
            self.unpack_progress(src, dst)
            return not self.dry_run and dst or None

        unpack_archive(egg_path, destination, pf)
        self.byte_compile(to_compile)
        if not self.dry_run:
            for f in to_chmod:
                mode = ((os.stat(f)[stat.ST_MODE]) | 0o555) & 0o7755
                chmod(f, mode)

    def byte_compile(self, to_compile):
        if sys.dont_write_bytecode:
            return

        from distutils.util import byte_compile

        try:
            # try to make the byte compile messages quieter
            log.set_verbosity(self.verbose - 1)

            byte_compile(to_compile, optimize=0, force=1, dry_run=self.dry_run)
            if self.optimize:
                byte_compile(
                    to_compile, optimize=self.optimize, force=1,
                    dry_run=self.dry_run,
                )
        finally:
            log.set_verbosity(self.verbose)  # restore original verbosity

    __no_default_msg = textwrap.dedent("""
        bad install directory or PYTHONPATH

        You are attempting to install a package to a directory that is not
        on PYTHONPATH and which Python does not read ".pth" files from.  The
        installation directory you specified (via --install-dir, --prefix, or
        the distutils default setting) was:

            %s

        and your PYTHONPATH environment variable currently contains:

            %r

        Here are some of your options for correcting the problem:

        * You can choose a different installation directory, i.e., one that is
          on PYTHONPATH or supports .pth files

        * You can add the installation directory to the PYTHONPATH environment
          variable.  (It must then also be on PYTHONPATH whenever you run
          Python and want to use the package(s) you are installing.)

        * You can set up the installation directory to support ".pth" files by
          using one of the approaches described here:

          https://setuptools.readthedocs.io/en/latest/easy_install.html#custom-installation-locations


        Please make the appropriate changes for your system and try again.""").lstrip()

    def no_default_version_msg(self):
        template = self.__no_default_msg
        return template % (self.install_dir, os.environ.get('PYTHONPATH', ''))

    def install_site_py(self):
        """Make sure there's a site.py in the target dir, if needed"""

        if self.sitepy_installed:
            return  # already did it, or don't need to

        sitepy = os.path.join(self.install_dir, "site.py")
        source = resource_string("setuptools", "site-patch.py")
        source = source.decode('utf-8')
        current = ""

        if os.path.exists(sitepy):
            log.debug("Checking existing site.py in %s", self.install_dir)
            with io.open(sitepy) as strm:
                current = strm.read()

            if not current.startswith('def __boot():'):
                raise DistutilsError(
                    "%s is not a setuptools-generated site.py; please"
                    " remove it." % sitepy
                )

        if current != source:
            log.info("Creating %s", sitepy)
            if not self.dry_run:
                ensure_directory(sitepy)
                with io.open(sitepy, 'w', encoding='utf-8') as strm:
                    strm.write(source)
            self.byte_compile([sitepy])

        self.sitepy_installed = True

    def create_home_path(self):
        """Create directories under ~."""
        if not self.user:
            return
        home = convert_path(os.path.expanduser("~"))
        for name, path in six.iteritems(self.config_vars):
            if path.startswith(home) and not os.path.isdir(path):
                self.debug_print("os.makedirs('%s', 0o700)" % path)
                os.makedirs(path, 0o700)

    INSTALL_SCHEMES = dict(
        posix=dict(
            install_dir='$base/lib/python$py_version_short/site-packages',
            script_dir='$base/bin',
        ),
    )

    DEFAULT_SCHEME = dict(
        install_dir='$base/Lib/site-packages',
        script_dir='$base/Scripts',
    )

    def _expand(self, *attrs):
        config_vars = self.get_finalized_command('install').config_vars

        if self.prefix:
            # Set default install_dir/scripts from --prefix
            config_vars = config_vars.copy()
            config_vars['base'] = self.prefix
            scheme = self.INSTALL_SCHEMES.get(os.name, self.DEFAULT_SCHEME)
            for attr, val in scheme.items():
                if getattr(self, attr, None) is None:
                    setattr(self, attr, val)

        from distutils.util import subst_vars

        for attr in attrs:
            val = getattr(self, attr)
            if val is not None:
                val = subst_vars(val, config_vars)
                if os.name == 'posix':
                    val = os.path.expanduser(val)
                setattr(self, attr, val)


def _pythonpath():
    items = os.environ.get('PYTHONPATH', '').split(os.pathsep)
    return filter(None, items)


def get_site_dirs():
    """
    Return a list of 'site' dirs
    """

    sitedirs = []

    # start with PYTHONPATH
    sitedirs.extend(_pythonpath())

    prefixes = [sys.prefix]
    if sys.exec_prefix != sys.prefix:
        prefixes.append(sys.exec_prefix)
    for prefix in prefixes:
        if prefix:
            if sys.platform in ('os2emx', 'riscos'):
                sitedirs.append(os.path.join(prefix, "Lib", "site-packages"))
            elif os.sep == '/':
                sitedirs.extend([
                    os.path.join(
                        prefix,
                        "lib",
                        "python" + sys.version[:3],
                        "site-packages",
                    ),
                    os.path.join(prefix, "lib", "site-python"),
                ])
            else:
                sitedirs.extend([
                    prefix,
                    os.path.join(prefix, "lib", "site-packages"),
                ])
            if sys.platform == 'darwin':
                # for framework builds *only* we add the standard Apple
                # locations. Currently only per-user, but /Library and
                # /Network/Library could be added too
                if 'Python.framework' in prefix:
                    home = os.environ.get('HOME')
                    if home:
                        home_sp = os.path.join(
                            home,
                            'Library',
                            'Python',
                            sys.version[:3],
                            'site-packages',
                        )
                        sitedirs.append(home_sp)
    lib_paths = get_path('purelib'), get_path('platlib')
    for site_lib in lib_paths:
        if site_lib not in sitedirs:
            sitedirs.append(site_lib)

    if site.ENABLE_USER_SITE:
        sitedirs.append(site.USER_SITE)

    try:
        sitedirs.extend(site.getsitepackages())
    except AttributeError:
        pass

    sitedirs = list(map(normalize_path, sitedirs))

    return sitedirs


def expand_paths(inputs):
    """Yield sys.path directories that might contain "old-style" packages"""

    seen = {}

    for dirname in inputs:
        dirname = normalize_path(dirname)
        if dirname in seen:
            continue

        seen[dirname] = 1
        if not os.path.isdir(dirname):
            continue

        files = os.listdir(dirname)
        yield dirname, files

        for name in files:
            if not name.endswith('.pth'):
                # We only care about the .pth files
                continue
            if name in ('easy-install.pth', 'setuptools.pth'):
                # Ignore .pth files that we control
                continue

            # Read the .pth file
            f = open(os.path.join(dirname, name))
            lines = list(yield_lines(f))
            f.close()

            # Yield existing non-dupe, non-import directory lines from it
            for line in lines:
                if not line.startswith("import"):
                    line = normalize_path(line.rstrip())
                    if line not in seen:
                        seen[line] = 1
                        if not os.path.isdir(line):
                            continue
                        yield line, os.listdir(line)


def extract_wininst_cfg(dist_filename):
    """Extract configuration data from a bdist_wininst .exe

    Returns a configparser.RawConfigParser, or None
    """
    f = open(dist_filename, 'rb')
    try:
        endrec = zipfile._EndRecData(f)
        if endrec is None:
            return None

        prepended = (endrec[9] - endrec[5]) - endrec[6]
        if prepended < 12:  # no wininst data here
            return None
        f.seek(prepended - 12)

        tag, cfglen, bmlen = struct.unpack("<iii", f.read(12))
        if tag not in (0x1234567A, 0x1234567B):
            return None  # not a valid tag

        f.seek(prepended - (12 + cfglen))
        init = {'version': '', 'target_version': ''}
        cfg = configparser.RawConfigParser(init)
        try:
            part = f.read(cfglen)
            # Read up to the first null byte.
            config = part.split(b'\0', 1)[0]
            # Now the config is in bytes, but for RawConfigParser, it should
            #  be text, so decode it.
            config = config.decode(sys.getfilesystemencoding())
            cfg.readfp(six.StringIO(config))
        except configparser.Error:
            return None
        if not cfg.has_section('metadata') or not cfg.has_section('Setup'):
            return None
        return cfg

    finally:
        f.close()


def get_exe_prefixes(exe_filename):
    """Get exe->egg path translations for a given .exe file"""

    prefixes = [
        ('PURELIB/', ''),
        ('PLATLIB/pywin32_system32', ''),
        ('PLATLIB/', ''),
        ('SCRIPTS/', 'EGG-INFO/scripts/'),
        ('DATA/lib/site-packages', ''),
    ]
    z = zipfile.ZipFile(exe_filename)
    try:
        for info in z.infolist():
            name = info.filename
            parts = name.split('/')
            if len(parts) == 3 and parts[2] == 'PKG-INFO':
                if parts[1].endswith('.egg-info'):
                    prefixes.insert(0, ('/'.join(parts[:2]), 'EGG-INFO/'))
                    break
            if len(parts) != 2 or not name.endswith('.pth'):
                continue
            if name.endswith('-nspkg.pth'):
                continue
            if parts[0].upper() in ('PURELIB', 'PLATLIB'):
                contents = z.read(name)
                if six.PY3:
                    contents = contents.decode()
                for pth in yield_lines(contents):
                    pth = pth.strip().replace('\\', '/')
                    if not pth.startswith('import'):
                        prefixes.append((('%s/%s/' % (parts[0], pth)), ''))
    finally:
        z.close()
    prefixes = [(x.lower(), y) for x, y in prefixes]
    prefixes.sort()
    prefixes.reverse()
    return prefixes


class PthDistributions(Environment):
    """A .pth file with Distribution paths in it"""

    dirty = False

    def __init__(self, filename, sitedirs=()):
        self.filename = filename
        self.sitedirs = list(map(normalize_path, sitedirs))
        self.basedir = normalize_path(os.path.dirname(self.filename))
        self._load()
        Environment.__init__(self, [], None, None)
        for path in yield_lines(self.paths):
            list(map(self.add, find_distributions(path, True)))

    def _load(self):
        self.paths = []
        saw_import = False
        seen = dict.fromkeys(self.sitedirs)
        if os.path.isfile(self.filename):
            f = open(self.filename, 'rt')
            for line in f:
                if line.startswith('import'):
                    saw_import = True
                    continue
                path = line.rstrip()
                self.paths.append(path)
                if not path.strip() or path.strip().startswith('#'):
                    continue
                # skip non-existent paths, in case somebody deleted a package
                # manually, and duplicate paths as well
                path = self.paths[-1] = normalize_path(
                    os.path.join(self.basedir, path)
                )
                if not os.path.exists(path) or path in seen:
                    self.paths.pop()  # skip it
                    self.dirty = True  # we cleaned up, so we're dirty now :)
                    continue
                seen[path] = 1
            f.close()

        if self.paths and not saw_import:
            self.dirty = True  # ensure anything we touch has import wrappers
        while self.paths and not self.paths[-1].strip():
            self.paths.pop()

    def save(self):
        """Write changed .pth file back to disk"""
        if not self.dirty:
            return

        rel_paths = list(map(self.make_relative, self.paths))
        if rel_paths:
            log.debug("Saving %s", self.filename)
            lines = self._wrap_lines(rel_paths)
            data = '\n'.join(lines) + '\n'

            if os.path.islink(self.filename):
                os.unlink(self.filename)
            with open(self.filename, 'wt') as f:
                f.write(data)

        elif os.path.exists(self.filename):
            log.debug("Deleting empty %s", self.filename)
            os.unlink(self.filename)

        self.dirty = False

    @staticmethod
    def _wrap_lines(lines):
        return lines

    def add(self, dist):
        """Add `dist` to the distribution map"""
        new_path = (
            dist.location not in self.paths and (
                dist.location not in self.sitedirs or
                # account for '.' being in PYTHONPATH
                dist.location == os.getcwd()
            )
        )
        if new_path:
            self.paths.append(dist.location)
            self.dirty = True
        Environment.add(self, dist)

    def remove(self, dist):
        """Remove `dist` from the distribution map"""
        while dist.location in self.paths:
            self.paths.remove(dist.location)
            self.dirty = True
        Environment.remove(self, dist)

    def make_relative(self, path):
        npath, last = os.path.split(normalize_path(path))
        baselen = len(self.basedir)
        parts = [last]
        sep = os.altsep == '/' and '/' or os.sep
        while len(npath) >= baselen:
            if npath == self.basedir:
                parts.append(os.curdir)
                parts.reverse()
                return sep.join(parts)
            npath, last = os.path.split(npath)
            parts.append(last)
        else:
            return path


class RewritePthDistributions(PthDistributions):
    @classmethod
    def _wrap_lines(cls, lines):
        yield cls.prelude
        for line in lines:
            yield line
        yield cls.postlude

    prelude = _one_liner("""
        import sys
        sys.__plen = len(sys.path)
        """)
    postlude = _one_liner("""
        import sys
        new = sys.path[sys.__plen:]
        del sys.path[sys.__plen:]
        p = getattr(sys, '__egginsert', 0)
        sys.path[p:p] = new
        sys.__egginsert = p + len(new)
        """)


if os.environ.get('SETUPTOOLS_SYS_PATH_TECHNIQUE', 'raw') == 'rewrite':
    PthDistributions = RewritePthDistributions


def _first_line_re():
    """
    Return a regular expression based on first_line_re suitable for matching
    strings.
    """
    if isinstance(first_line_re.pattern, str):
        return first_line_re

    # first_line_re in Python >=3.1.4 and >=3.2.1 is a bytes pattern.
    return re.compile(first_line_re.pattern.decode())


def auto_chmod(func, arg, exc):
    if func in [os.unlink, os.remove] and os.name == 'nt':
        chmod(arg, stat.S_IWRITE)
        return func(arg)
    et, ev, _ = sys.exc_info()
    six.reraise(et, (ev[0], ev[1] + (" %s %s" % (func, arg))))


def update_dist_caches(dist_path, fix_zipimporter_caches):
    """
    Fix any globally cached `dist_path` related data

    `dist_path` should be a path of a newly installed egg distribution (zipped
    or unzipped).

    sys.path_importer_cache contains finder objects that have been cached when
    importing data from the original distribution. Any such finders need to be
    cleared since the replacement distribution might be packaged differently,
    e.g. a zipped egg distribution might get replaced with an unzipped egg
    folder or vice versa. Having the old finders cached may then cause Python
    to attempt loading modules from the replacement distribution using an
    incorrect loader.

    zipimport.zipimporter objects are Python loaders charged with importing
    data packaged inside zip archives. If stale loaders referencing the
    original distribution, are left behind, they can fail to load modules from
    the replacement distribution. E.g. if an old zipimport.zipimporter instance
    is used to load data from a new zipped egg archive, it may cause the
    operation to attempt to locate the requested data in the wrong location -
    one indicated by the original distribution's zip archive directory
    information. Such an operation may then fail outright, e.g. report having
    read a 'bad local file header', or even worse, it may fail silently &
    return invalid data.

    zipimport._zip_directory_cache contains cached zip archive directory
    information for all existing zipimport.zipimporter instances and all such
    instances connected to the same archive share the same cached directory
    information.

    If asked, and the underlying Python implementation allows it, we can fix
    all existing zipimport.zipimporter instances instead of having to track
    them down and remove them one by one, by updating their shared cached zip
    archive directory information. This, of course, assumes that the
    replacement distribution is packaged as a zipped egg.

    If not asked to fix existing zipimport.zipimporter instances, we still do
    our best to clear any remaining zipimport.zipimporter related cached data
    that might somehow later get used when attempting to load data from the new
    distribution and thus cause such load operations to fail. Note that when
    tracking down such remaining stale data, we can not catch every conceivable
    usage from here, and we clear only those that we know of and have found to
    cause problems if left alive. Any remaining caches should be updated by
    whomever is in charge of maintaining them, i.e. they should be ready to
    handle us replacing their zip archives with new distributions at runtime.

    """
    # There are several other known sources of stale zipimport.zipimporter
    # instances that we do not clear here, but might if ever given a reason to
    # do so:
    # * Global setuptools pkg_resources.working_set (a.k.a. 'master working
    # set') may contain distributions which may in turn contain their
    #   zipimport.zipimporter loaders.
    # * Several zipimport.zipimporter loaders held by local variables further
    #   up the function call stack when running the setuptools installation.
    # * Already loaded modules may have their __loader__ attribute set to the
    #   exact loader instance used when importing them. Python 3.4 docs state
    #   that this information is intended mostly for introspection and so is
    #   not expected to cause us problems.
    normalized_path = normalize_path(dist_path)
    _uncache(normalized_path, sys.path_importer_cache)
    if fix_zipimporter_caches:
        _replace_zip_directory_cache_data(normalized_path)
    else:
        # Here, even though we do not want to fix existing and now stale
        # zipimporter cache information, we still want to remove it. Related to
        # Python's zip archive directory information cache, we clear each of
        # its stale entries in two phases:
        #   1. Clear the entry so attempting to access zip archive information
        #      via any existing stale zipimport.zipimporter instances fails.
        #   2. Remove the entry from the cache so any newly constructed
        #      zipimport.zipimporter instances do not end up using old stale
        #      zip archive directory information.
        # This whole stale data removal step does not seem strictly necessary,
        # but has been left in because it was done before we started replacing
        # the zip archive directory information cache content if possible, and
        # there are no relevant unit tests that we can depend on to tell us if
        # this is really needed.
        _remove_and_clear_zip_directory_cache_data(normalized_path)


def _collect_zipimporter_cache_entries(normalized_path, cache):
    """
    Return zipimporter cache entry keys related to a given normalized path.

    Alternative path spellings (e.g. those using different character case or
    those using alternative path separators) related to the same path are
    included. Any sub-path entries are included as well, i.e. those
    corresponding to zip archives embedded in other zip archives.

    """
    result = []
    prefix_len = len(normalized_path)
    for p in cache:
        np = normalize_path(p)
        if (np.startswith(normalized_path) and
                np[prefix_len:prefix_len + 1] in (os.sep, '')):
            result.append(p)
    return result


def _update_zipimporter_cache(normalized_path, cache, updater=None):
    """
    Update zipimporter cache data for a given normalized path.

    Any sub-path entries are processed as well, i.e. those corresponding to zip
    archives embedded in other zip archives.

    Given updater is a callable taking a cache entry key and the original entry
    (after already removing the entry from the cache), and expected to update
    the entry and possibly return a new one to be inserted in its place.
    Returning None indicates that the entry should not be replaced with a new
    one. If no updater is given, the cache entries are simply removed without
    any additional processing, the same as if the updater simply returned None.

    """
    for p in _collect_zipimporter_cache_entries(normalized_path, cache):
        # N.B. pypy's custom zipimport._zip_directory_cache implementation does
        # not support the complete dict interface:
        # * Does not support item assignment, thus not allowing this function
        #    to be used only for removing existing cache entries.
        #  * Does not support the dict.pop() method, forcing us to use the
        #    get/del patterns instead. For more detailed information see the
        #    following links:
        #      https://github.com/pypa/setuptools/issues/202#issuecomment-202913420
        #      http://bit.ly/2h9itJX
        old_entry = cache[p]
        del cache[p]
        new_entry = updater and updater(p, old_entry)
        if new_entry is not None:
            cache[p] = new_entry


def _uncache(normalized_path, cache):
    _update_zipimporter_cache(normalized_path, cache)


def _remove_and_clear_zip_directory_cache_data(normalized_path):
    def clear_and_remove_cached_zip_archive_directory_data(path, old_entry):
        old_entry.clear()

    _update_zipimporter_cache(
        normalized_path, zipimport._zip_directory_cache,
        updater=clear_and_remove_cached_zip_archive_directory_data)


# PyPy Python implementation does not allow directly writing to the
# zipimport._zip_directory_cache and so prevents us from attempting to correct
# its content. The best we can do there is clear the problematic cache content
# and have PyPy repopulate it as needed. The downside is that if there are any
# stale zipimport.zipimporter instances laying around, attempting to use them
# will fail due to not having its zip archive directory information available
# instead of being automatically corrected to use the new correct zip archive
# directory information.
if '__pypy__' in sys.builtin_module_names:
    _replace_zip_directory_cache_data = \
        _remove_and_clear_zip_directory_cache_data
else:

    def _replace_zip_directory_cache_data(normalized_path):
        def replace_cached_zip_archive_directory_data(path, old_entry):
            # N.B. In theory, we could load the zip directory information just
            # once for all updated path spellings, and then copy it locally and
            # update its contained path strings to contain the correct
            # spelling, but that seems like a way too invasive move (this cache
            # structure is not officially documented anywhere and could in
            # theory change with new Python releases) for no significant
            # benefit.
            old_entry.clear()
            zipimport.zipimporter(path)
            old_entry.update(zipimport._zip_directory_cache[path])
            return old_entry

        _update_zipimporter_cache(
            normalized_path, zipimport._zip_directory_cache,
            updater=replace_cached_zip_archive_directory_data)


def is_python(text, filename='<string>'):
    "Is this string a valid Python script?"
    try:
        compile(text, filename, 'exec')
    except (SyntaxError, TypeError):
        return False
    else:
        return True


def is_sh(executable):
    """Determine if the specified executable is a .sh (contains a #! line)"""
    try:
        with io.open(executable, encoding='latin-1') as fp:
            magic = fp.read(2)
    except (OSError, IOError):
        return executable
    return magic == '#!'


def nt_quote_arg(arg):
    """Quote a command line argument according to Windows parsing rules"""
    return subprocess.list2cmdline([arg])


def is_python_script(script_text, filename):
    """Is this text, as a whole, a Python script? (as opposed to shell/bat/etc.
    """
    if filename.endswith('.py') or filename.endswith('.pyw'):
        return True  # extension says it's Python
    if is_python(script_text, filename):
        return True  # it's syntactically valid Python
    if script_text.startswith('#!'):
        # It begins with a '#!' line, so check if 'python' is in it somewhere
        return 'python' in script_text.splitlines()[0].lower()

    return False  # Not any Python I can recognize


try:
    from os import chmod as _chmod
except ImportError:
    # Jython compatibility
    def _chmod(*args):
        pass


def chmod(path, mode):
    log.debug("changing mode of %s to %o", path, mode)
    try:
        _chmod(path, mode)
    except os.error as e:
        log.debug("chmod failed: %s", e)


class CommandSpec(list):
    """
    A command spec for a #! header, specified as a list of arguments akin to
    those passed to Popen.
    """

    options = []
    split_args = dict()

    @classmethod
    def best(cls):
        """
        Choose the best CommandSpec class based on environmental conditions.
        """
        return cls

    @classmethod
    def _sys_executable(cls):
        _default = os.path.normpath(sys.executable)
        return os.environ.get('__PYVENV_LAUNCHER__', _default)

    @classmethod
    def from_param(cls, param):
        """
        Construct a CommandSpec from a parameter to build_scripts, which may
        be None.
        """
        if isinstance(param, cls):
            return param
        if isinstance(param, list):
            return cls(param)
        if param is None:
            return cls.from_environment()
        # otherwise, assume it's a string.
        return cls.from_string(param)

    @classmethod
    def from_environment(cls):
        return cls([cls._sys_executable()])

    @classmethod
    def from_string(cls, string):
        """
        Construct a command spec from a simple string representing a command
        line parseable by shlex.split.
        """
        items = shlex.split(string, **cls.split_args)
        return cls(items)

    def install_options(self, script_text):
        self.options = shlex.split(self._extract_options(script_text))
        cmdline = subprocess.list2cmdline(self)
        if not isascii(cmdline):
            self.options[:0] = ['-x']

    @staticmethod
    def _extract_options(orig_script):
        """
        Extract any options from the first line of the script.
        """
        first = (orig_script + '\n').splitlines()[0]
        match = _first_line_re().match(first)
        options = match.group(1) or '' if match else ''
        return options.strip()

    def as_header(self):
        return self._render(self + list(self.options))

    @staticmethod
    def _strip_quotes(item):
        _QUOTES = '"\''
        for q in _QUOTES:
            if item.startswith(q) and item.endswith(q):
                return item[1:-1]
        return item

    @staticmethod
    def _render(items):
        cmdline = subprocess.list2cmdline(
            CommandSpec._strip_quotes(item.strip()) for item in items)
        return '#!' + cmdline + '\n'


# For pbr compat; will be removed in a future version.
sys_executable = CommandSpec._sys_executable()


class WindowsCommandSpec(CommandSpec):
    split_args = dict(posix=False)


class ScriptWriter(object):
    """
    Encapsulates behavior around writing entry point scripts for console and
    gui apps.
    """

    template = textwrap.dedent(r"""
        # EASY-INSTALL-ENTRY-SCRIPT: %(spec)r,%(group)r,%(name)r
        __requires__ = %(spec)r
        import re
        import sys
        from pkg_resources import load_entry_point

        if __name__ == '__main__':
            sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
            sys.exit(
                load_entry_point(%(spec)r, %(group)r, %(name)r)()
            )
    """).lstrip()

    command_spec_class = CommandSpec

    @classmethod
    def get_script_args(cls, dist, executable=None, wininst=False):
        # for backward compatibility
        warnings.warn("Use get_args", DeprecationWarning)
        writer = (WindowsScriptWriter if wininst else ScriptWriter).best()
        header = cls.get_script_header("", executable, wininst)
        return writer.get_args(dist, header)

    @classmethod
    def get_script_header(cls, script_text, executable=None, wininst=False):
        # for backward compatibility
        warnings.warn("Use get_header", DeprecationWarning)
        if wininst:
            executable = "python.exe"
        cmd = cls.command_spec_class.best().from_param(executable)
        cmd.install_options(script_text)
        return cmd.as_header()

    @classmethod
    def get_args(cls, dist, header=None):
        """
        Yield write_script() argument tuples for a distribution's
        console_scripts and gui_scripts entry points.
        """
        if header is None:
            header = cls.get_header()
        spec = str(dist.as_requirement())
        for type_ in 'console', 'gui':
            group = type_ + '_scripts'
            for name, ep in dist.get_entry_map(group).items():
                cls._ensure_safe_name(name)
                script_text = cls.template % locals()
                args = cls._get_script_args(type_, name, header, script_text)
                for res in args:
                    yield res

    @staticmethod
    def _ensure_safe_name(name):
        """
        Prevent paths in *_scripts entry point names.
        """
        has_path_sep = re.search(r'[\\/]', name)
        if has_path_sep:
            raise ValueError("Path separators not allowed in script names")

    @classmethod
    def get_writer(cls, force_windows):
        # for backward compatibility
        warnings.warn("Use best", DeprecationWarning)
        return WindowsScriptWriter.best() if force_windows else cls.best()

    @classmethod
    def best(cls):
        """
        Select the best ScriptWriter for this environment.
        """
        if sys.platform == 'win32' or (os.name == 'java' and os._name == 'nt'):
            return WindowsScriptWriter.best()
        else:
            return cls

    @classmethod
    def _get_script_args(cls, type_, name, header, script_text):
        # Simply write the stub with no extension.
        yield (name, header + script_text)

    @classmethod
    def get_header(cls, script_text="", executable=None):
        """Create a #! line, getting options (if any) from script_text"""
        cmd = cls.command_spec_class.best().from_param(executable)
        cmd.install_options(script_text)
        return cmd.as_header()


class WindowsScriptWriter(ScriptWriter):
    command_spec_class = WindowsCommandSpec

    @classmethod
    def get_writer(cls):
        # for backward compatibility
        warnings.warn("Use best", DeprecationWarning)
        return cls.best()

    @classmethod
    def best(cls):
        """
        Select the best ScriptWriter suitable for Windows
        """
        writer_lookup = dict(
            executable=WindowsExecutableLauncherWriter,
            natural=cls,
        )
        # for compatibility, use the executable launcher by default
        launcher = os.environ.get('SETUPTOOLS_LAUNCHER', 'executable')
        return writer_lookup[launcher]

    @classmethod
    def _get_script_args(cls, type_, name, header, script_text):
        "For Windows, add a .py extension"
        ext = dict(console='.pya', gui='.pyw')[type_]
        if ext not in os.environ['PATHEXT'].lower().split(';'):
            msg = (
                "{ext} not listed in PATHEXT; scripts will not be "
                "recognized as executables."
            ).format(**locals())
            warnings.warn(msg, UserWarning)
        old = ['.pya', '.py', '-script.py', '.pyc', '.pyo', '.pyw', '.exe']
        old.remove(ext)
        header = cls._adjust_header(type_, header)
        blockers = [name + x for x in old]
        yield name + ext, header + script_text, 't', blockers

    @classmethod
    def _adjust_header(cls, type_, orig_header):
        """
        Make sure 'pythonw' is used for gui and and 'python' is used for
        console (regardless of what sys.executable is).
        """
        pattern = 'pythonw.exe'
        repl = 'python.exe'
        if type_ == 'gui':
            pattern, repl = repl, pattern
        pattern_ob = re.compile(re.escape(pattern), re.IGNORECASE)
        new_header = pattern_ob.sub(string=orig_header, repl=repl)
        return new_header if cls._use_header(new_header) else orig_header

    @staticmethod
    def _use_header(new_header):
        """
        Should _adjust_header use the replaced header?

        On non-windows systems, always use. On
        Windows systems, only use the replaced header if it resolves
        to an executable on the system.
        """
        clean_header = new_header[2:-1].strip('"')
        return sys.platform != 'win32' or find_executable(clean_header)


class WindowsExecutableLauncherWriter(WindowsScriptWriter):
    @classmethod
    def _get_script_args(cls, type_, name, header, script_text):
        """
        For Windows, add a .py extension and an .exe launcher
        """
        if type_ == 'gui':
            launcher_type = 'gui'
            ext = '-script.pyw'
            old = ['.pyw']
        else:
            launcher_type = 'cli'
            ext = '-script.py'
            old = ['.py', '.pyc', '.pyo']
        hdr = cls._adjust_header(type_, header)
        blockers = [name + x for x in old]
        yield (name + ext, hdr + script_text, 't', blockers)
        yield (
            name + '.exe', get_win_launcher(launcher_type),
            'b'  # write in binary mode
        )
        if not is_64bit():
            # install a manifest for the launcher to prevent Windows
            # from detecting it as an installer (which it will for
            #  launchers like easy_install.exe). Consider only
            #  adding a manifest for launchers detected as installers.
            #  See Distribute #143 for details.
            m_name = name + '.exe.manifest'
            yield (m_name, load_launcher_manifest(name), 't')


# for backward-compatibility
get_script_args = ScriptWriter.get_script_args
get_script_header = ScriptWriter.get_script_header


def get_win_launcher(type):
    """
    Load the Windows launcher (executable) suitable for launching a script.

    `type` should be either 'cli' or 'gui'

    Returns the executable as a byte string.
    """
    launcher_fn = '%s.exe' % type
    if is_64bit():
        launcher_fn = launcher_fn.replace(".", "-64.")
    else:
        launcher_fn = launcher_fn.replace(".", "-32.")
    return resource_string('setuptools', launcher_fn)


def load_launcher_manifest(name):
    manifest = pkg_resources.resource_string(__name__, 'launcher manifest.xml')
    if six.PY2:
        return manifest % vars()
    else:
        return manifest.decode('utf-8') % vars()


def rmtree(path, ignore_errors=False, onerror=auto_chmod):
    return shutil.rmtree(path, ignore_errors, onerror)


def current_umask():
    tmp = os.umask(0o022)
    os.umask(tmp)
    return tmp


def bootstrap():
    # This function is called when setuptools*.egg is run using /bin/sh
    import setuptools

    argv0 = os.path.dirname(setuptools.__path__[0])
    sys.argv[0] = argv0
    sys.argv.append(argv0)
    main()


def main(argv=None, **kw):
    from setuptools import setup
    from setuptools.dist import Distribution

    class DistributionWithoutHelpCommands(Distribution):
        common_usage = ""

        def _show_help(self, *args, **kw):
            with _patch_usage():
                Distribution._show_help(self, *args, **kw)

    if argv is None:
        argv = sys.argv[1:]

    with _patch_usage():
        setup(
            script_args=['-q', 'easy_install', '-v'] + argv,
            script_name=sys.argv[0] or 'easy_install',
            distclass=DistributionWithoutHelpCommands,
            **kw
        )


@contextlib.contextmanager
def _patch_usage():
    import distutils.core
    USAGE = textwrap.dedent("""
        usage: %(script)s [options] requirement_or_url ...
           or: %(script)s --help
        """).lstrip()

    def gen_usage(script_name):
        return USAGE % dict(
            script=os.path.basename(script_name),
        )

    saved = distutils.core.gen_usage
    distutils.core.gen_usage = gen_usage
    try:
        yield
    finally:
        distutils.core.gen_usage = saved
command/easy_install.pyc000064400000234776151733473650011427 0ustar00�
�fc@sedZddlmZddlmZddlmZmZddlmZmZm	Z	m
Z
ddlmZm
Z
ddlmZmZddlmZdd	lmZdd
lZdd
lZdd
lZdd
lZdd
lZdd
lZdd
lZdd
lZdd
lZdd
lZdd
lZdd
l Z dd
l!Z!dd
l"Z"dd
l#Z#dd
l$Z$dd
l%Z%ddl&m'Z'ddl(m)Z)m*Z*dd
l+m,Z,ddl-m.Z.ddl/m0Z0m1Z1ddl2m3Z3ddl4m5Z5ddl6m7Z7ddl8m9Z9m:Z:m;Z;ddl4m<Z<m=Z=ddl>m?Z?ddl@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOdd
lPZ@ejQdde@jR�ddddddgZSd�ZTd �ZUe'jVrd!�ZWd"�ZXnd#�ZWd$�ZXd%�ZYde,fd&��YZZd'�Z[d(�Z\d)�Z]d*�Z^d+�Z_deGfd,��YZ`d-e`fd.��YZaejbjcd/d0�d1kr�eaZ`nd2�Zdd3�Zed4�Zfd5�Zgehd6�Zid7�Zjd8�Zkd9ejlkrekZmn	d:�Zmd;d<�Znd=�Zod>�Zpd?�Zqydd@lmrZsWnetk
rzdA�ZsnXdB�ZrdCeufdD��YZvevjw�ZxdEevfdF��YZydGezfdH��YZ{dIe{fdJ��YZ|dKe|fdL��YZ}e{j~Z~e{jZdM�Z�dN�Z�e�eedO�Z�dP�Z�dQ�Z�ehdR�Z�e"j�dS��Z�d
S(Ts%
Easy Install
------------

A tool for doing automatic download/extract/build of distutils-based Python
packages.  For detailed documentation, see the accompanying EasyInstall.txt
file, or visit the `EasyInstall home page`__.

__ https://setuptools.readthedocs.io/en/latest/easy_install.html

i����(tglob(tget_platform(tconvert_patht
subst_vars(tDistutilsArgErrortDistutilsOptionErrortDistutilsErrortDistutilsPlatformError(tINSTALL_SCHEMEStSCHEME_KEYS(tlogtdir_util(t
first_line_re(tfind_executableN(tsix(tconfigparsertmap(tCommand(t	run_setup(tget_pathtget_config_vars(trmtree_safe(tsetopt(tunpack_archive(tPackageIndextparse_requirement_argt
URL_SCHEME(t	bdist_eggtegg_info(tWheel(tyield_linestnormalize_pathtresource_stringtensure_directorytget_distributiontfind_distributionstEnvironmenttRequirementtDistributiontPathMetadatatEggMetadatat
WorkingSettDistributionNotFoundtVersionConflicttDEVELOP_DISTtdefaulttcategorytsamefileteasy_installtPthDistributionstextract_wininst_cfgtmaintget_exe_prefixescCstjd�dkS(NtPi(tstructtcalcsize(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytis_64bitIscCs�tjj|�o!tjj|�}ttjd�o9|}|rUtjj||�Stjjtjj|��}tjjtjj|��}||kS(s�
    Determine if two paths reference the same file.

    Augments os.path.samefile to work on Windows and
    suppresses errors if the path doesn't exist.
    R/(tostpathtexiststhasattrR/tnormpathtnormcase(tp1tp2t
both_existtuse_samefiletnorm_p1tnorm_p2((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR/Ms$cCs|S(N((ts((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt	_to_ascii_scCs1ytj|d�tSWntk
r,tSXdS(Ntascii(Rt	text_typetTruetUnicodeErrortFalse(RE((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytisasciibs

cCs
|jd�S(NRG(tencode(RE((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRFjscCs.y|jd�tSWntk
r)tSXdS(NRG(RMRIRJRK(RE((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRLms


cCstj|�j�jdd�S(Ns
s; (ttextwraptdedenttstriptreplace(ttext((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt<lambda>utcBsreZdZdZeZd�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�gZdddd
dd-d0d6d9g	Ze	j
r�d=e	jZej
d>d�ef�ej
d>�nidd'6ZeZd?�Zd@�ZdA�ZedB��ZdC�ZdD�ZdE�ZdF�ZdG�ZdH�ZdI�ZdJ�ZdK�Zej dL�j!�Z"ej dM�j!�Z#ej dN�j!�Z$dO�Z%dP�Z&dQ�Z'dR�Z(dS�Z)dT�Z*e+j,dU��Z-e.dV�Z/e.dW�Z0dX�Z1edY�Z2dZ�Z3d[�Z4d\�Z5d�d]�Z6ed^��Z7d_d�d`�Z8da�Z9db�Z:dc�Z;dd�Z<de�Z=df�Z>ej dg�j!�Z?ej dh�Z@didj�ZAej dk�j!�ZBdl�ZCdm�ZDdn�ZEdo�ZFdp�ZGdq�ZHdr�ZIds�ZJej dt�j!�ZKdu�ZLdv�ZMdw�ZNeOdxeOdydzd{d|��ZPeOdyd}d{d~�ZQd�ZRRS(�s'Manage a download/build/install processs Find/get/install Python packagessprefix=sinstallation prefixszip-oktzsinstall package as a zipfiles
multi-versiontms%make apps have to require() a versiontupgradetUs1force upgrade (searches PyPI for latest versions)sinstall-dir=tdsinstall package to DIRsscript-dir=REsinstall scripts to DIRsexclude-scriptstxsDon't install scriptssalways-copytas'Copy all needed packages to install dirs
index-url=tis base URL of Python Package Indexsfind-links=tfs(additional URL(s) to search for packagessbuild-directory=tbs/download/extract/build in DIR; keep the resultss	optimize=tOslalso compile with optimization: -O1 for "python -O", -O2 for "python -OO", and -O0 to disable [default: -O0]srecord=s3filename in which to record list of installed filessalways-unziptZs*don't install as a zipfile, no matter whats
site-dirs=tSs)list of directories where .pth files workteditabletes+Install specified packages in editable formsno-depstNsdon't install dependenciessallow-hosts=tHs$pattern(s) that hostnames must matchslocal-snapshots-oktls(allow building eggs from local checkoutstversions"print version information and exits
no-find-linkss9Don't load find-links defined in packages being installeds!install in user site-package '%s'tusercCs�d|_d|_|_d|_|_|_d|_d|_d|_	d|_
d|_|_d|_
|_|_d|_|_|_d|_|_|_d|_d|_d|_d|_d|_d|_d|_d|_d|_tj rtj!|_"tj#|_$nd|_"d|_$d|_%d|_&d|_'|_(d|_)i|_*t+|_,d|_-|j.j/|_/|j.j0||j.j1d��dS(NiR0(2RhtNonetzip_oktlocal_snapshots_oktinstall_dirt
script_dirtexclude_scriptst	index_urlt
find_linkstbuild_directorytargstoptimizetrecordRWtalways_copyt
multi_versionRbtno_depstallow_hoststroottprefixt	no_reportRgtinstall_purelibtinstall_platlibtinstall_headerstinstall_libtinstall_scriptstinstall_datatinstall_basetinstall_platbasetsitetENABLE_USER_SITEt	USER_BASEtinstall_userbaset	USER_SITEtinstall_usersitet
no_find_linkst
package_indextpth_filetalways_copy_fromt	site_dirstinstalled_projectsRKtsitepy_installedt_dry_runtdistributiontverboset_set_command_optionstget_option_dict(tself((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytinitialize_options�sF																								cCs*d�|D�}tt|j|��dS(Ncss9|]/}tjj|�s-tjj|�r|VqdS(N(R9R:R;tislink(t.0tfilename((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pys	<genexpr>�s(tlistRt_delete_path(R�tblockerstextant_blockers((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytdelete_blockers�scCsetjd|�|jrdStjj|�o?tjj|�}|rNtntj}||�dS(NsDeleting %s(	R
tinfotdry_runR9R:tisdirR�trmtreetunlink(R�R:tis_treetremover((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s	%cCs=tjd }td�}d}|jt��GHt��dS(sT
        Render the Setuptools version and installation details, then exit.
        it
setuptoolss=setuptools {dist.version} from {dist.location} (Python {ver})N(tsysRgR"tformattlocalst
SystemExit(tvertdistttmpl((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt_render_version�s

c
Cs�|jo|j�tjj�d}tdd�\}}i|jj�d6|jj�d6|jj�d6|d6|dd!d	6|d|d
d6|d6|d6|d
6|d6t	tdd�d6|_
tjr�|j
|j
d<|j|j
d<n|j�|j�|j�|jdddd�|jdkrI|j|_n|jdkrdt|_n|jdd%�|jdd&�|jr�|jr�|j|_|j|_n|jdd'�tttj�}t�|_ |j!dk	r�g|j!jd�D]}t"jj#|j$��^q}xq|D]f}t"jj%|�sWt&j'd|�q,t|�|kr|t(|d��q,|j j)t|��q,Wn|j*s�|j+�n|j,p�d|_,|j |_-xE|jt|j�fD]+}||j-kr�|j-j.d|�q�q�W|j/dk	rSg|j/jd�D]}|j$�^q8}	n	dg}	|j0dkr�|j1|j,d|j-d |	�|_0nt2|j-tj�|_3|j4dk	r�t5|j4t6j7�r�|j4j�|_4q�n	g|_4|j8r|j0j9|j-tj�n|js5|j0j:|j4�n|jdd(�t5|j;t<�s�y>t<|j;�|_;d|j;ko�d
kns�t=�nWq�t=k
r�t(d"��q�Xn|j*r�|j>r�t?d#��n|j@s�t?d$��ng|_AdS()NiRztexec_prefixt	dist_nametdist_versiont
dist_fullnamet
py_versionitpy_version_shortitpy_version_nodott
sys_prefixtsys_exec_prefixtabiflagsRTtuserbasetusersiteRlRmRqR�RR�tinstallRtt,s"%s (in --site-dirs) does not exists$ (in --site-dirs) is not on sys.pathshttps://pypi.python.org/simplet*tsearch_paththostsRss--optimize must be 0, 1, or 2s9Must specify a build directory (-b) when using --editables:No urls, filenames, or requirements specified (see --help)(RlRl(RlRm(RtRt(RsRs(BRgR�R�tsplitRR�tget_nametget_versiontget_fullnametgetattrtconfig_varsR�R�R�R�t_fix_install_dir_for_user_sitetexpand_basedirstexpand_dirst_expandRmRiRlR�RKtset_undefined_optionsRhR|R�RRR:t
get_site_dirst
all_site_dirsR�R9t
expanduserRPR�R
twarnRtappendRbtcheck_site_dirRotshadow_pathtinsertRxR�tcreate_indexR$tlocal_indexRpt
isinstanceRtstring_typesRktscan_egg_linkstadd_find_linksRstintt
ValueErrorRqRRrtoutputs(
R�R�RzR�R=RER�RYt	path_itemR�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytfinalize_options�s�	


	

4
	

.	!			

	cCs�|jstjrdS|j�|jdkrFd}t|��n|j|_|_t	j
jdd�d}|j|�dS(s;
        Fix the install_dir if "--user" was used.
        Ns$User base directory is not specifiedtposixtunixt_user(
RhR�R�tcreate_home_pathR�RiRR�R�R9tnameRQt
select_scheme(R�tmsgtscheme_name((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR�ms
cCs�x�|D]y}t||�}|dk	rtjdksFtjdkr[tjj|�}nt||j�}t|||�qqWdS(NR�tnt(	R�RiR9R�R:R�RR�tsetattr(R�tattrstattrtval((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt
_expand_attrs|s
cCs|jdddg�dS(sNCalls `os.path.expanduser` on install_base, install_platbase and
        root.R�R�RyN(R�(R�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��scCs)ddddddg}|j|�dS(s+Calls `os.path.expanduser` on install dirs.R|R}RR~R�R�N(R�(R�tdirs((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s	cCs|j|jjkr(tj|j�nz�x%|jD]}|j||j�q5W|jr�|j}|j	r�t
|j	�}x/tt
|��D]}|||||<q�Wnddlm
}|j|j|j|fd|j�n|j�Wdtj|jj�XdS(Ni����(t	file_utils'writing list of installed files to '%s'(R�R�R
t
set_verbosityRrR0RwRtR�Rytlentranget	distutilsR�texecutet
write_filetwarn_deprecated_options(R�tspecR�troot_lentcounterR�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytrun�s$			cCsSytj�}Wn&tk
r8tjdtj�}nXtjj|j	d|�S(s�Return a pseudo-tempname base in the install directory.
        This code is intentionally naive; if a malicious party can write to
        the target directory you're already in deep doodoo.
        istest-easy-install-%s(
R9tgetpidt	ExceptiontrandomtrandintR�tmaxsizeR:tjoinRl(R�tpid((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytpseudo_tempname�s

cCsdS(N((R�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��scCs�t|j�}tjj|d�}||jk}|rS|jrS|j�}n�|j�d}tjj	|�}y:|r�tj
|�nt|d�j�tj
|�Wn!t
tfk
r�|j�nX|r�|jr�t|j���n|r)|jdkr2t||j�|_q2n	d|_|ttt��krVt|_n1|jr�tjj	|�r�t|_d|_n||_dS(s;Verify that self.install_dir is .pth-capable dir, if neededseasy-install.pths.write-testtwN(RRlR9R:R�R�Rvtcheck_pth_processingRR;R�topentclosetOSErrortIOErrortcant_write_to_targetRtno_default_version_msgR�RiR1Rt_pythonpathRIR�(R�tinstdirR�tis_site_dirttestfilettest_exists((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s4		sS
        can't create or remove files in install directory

        The following error occurred while trying to add or remove files in the
        installation directory:

            %s

        The installation directory you specified (via --install-dir, --prefix, or
        the distutils default setting) was:

            %s
        s�
        This directory does not currently exist.  Please create it and try again, or
        choose a different installation directory (using the -d or --install-dir
        option).
        s�
        Perhaps your account does not have write access to this directory?  If the
        installation directory is a system-owned directory, you may need to sign in
        as the administrator or "root" account.  If you do not have administrative
        access to this machine, you may wish to choose a different installation
        directory, preferably one that is listed in your PYTHONPATH environment
        variable.

        For information on other options, you may wish to consult the
        documentation at:

          https://setuptools.readthedocs.io/en/latest/easy_install.html

        Please make the appropriate changes for your system and try again.
        cCsj|jtj�d|jf}tjj|j�sI|d|j7}n|d|j7}t	|��dS(Nis
(
t_easy_install__cant_write_msgR�texc_infoRlR9R:R;t_easy_install__not_exists_idt_easy_install__access_msgR(R�R�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR	s
 c
Cs<|j}tjd|�|j�d}|d}tjj|�}td�d}yQ|rntj|�ntjj	|�}t
jj|dt
�t|d�}Wn!ttfk
r�|j�nSXz�|j|jt���|j�d}tj}tjdkrqtjj|�\}}	tjj|d	�}
|	j�d
ko\tjj|
�}|rq|
}qqnddlm}||d
ddgd�tjj|�r�tjd|�t
SWd|r�|j�ntjj|�r�tj|�ntjj|�rtj|�nX|js8tj d|�nt!S(s@Empirically verify whether .pth files are supported in inst. dirs Checking .pth file support in %ss.pths.oksz
            import os
            f = open({ok_file!r}, 'w')
            f.write('OK')
            f.close()
            s
texist_okRR�spythonw.exes
python.exei����(tspawns-Es-ctpassis-TEST PASSED: %s appears to support .pth filesNs+TEST FAILED: %s does NOT support .pth files("RlR
R�RR9R:R;t
_one_linerR�tdirnamet
pkg_resourcest
py31compattmakedirsRIRRRRtwriteR�R�RRiR�t
executableR�R�R�tlowertdistutils.spawnRRvR�RK(
R�RR�tok_filet	ok_existsR�RR]Rtbasenametalttuse_altR((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRsV	


	
	cCs�|jro|jd�roxS|jd�D]?}|jd|�rHq)n|j|||jd|��q)Wn|j|�dS(s=Write all the scripts for `dist`, unless scripts are excludedtscriptssscripts/N(Rntmetadata_isdirtmetadata_listdirtinstall_scripttget_metadatatinstall_wrapper_scripts(R�R�tscript_name((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytinstall_egg_scriptsMscCs|tjj|�rhxctj|�D]?\}}}x-|D]%}|jjtjj||��q8Wq"Wn|jj|�dS(N(R9R:R�twalkR�R�R�(R�R:tbaseR�tfilesR�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt
add_output[s

*cCs#|jrtd|f��ndS(NsjInvalid argument %r: you can't use filenames or URLs with --editable (except via the --find-links option).(RbR(R�R�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytnot_editablecs	cCsW|js
dStjjtjj|j|j��rStd|j|jf��ndS(Ns2%r already exists in %s; can't do a checkout there(RbR9R:R;R�RqtkeyR(R�R�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytcheck_editableks	'ccsTtjdtjd��}zt|�VWdtjj|�oNtt	|��XdS(NRzs
easy_install-(
ttempfiletmkdtempRtutstrR9R:R;R�R(R�ttmpdir((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt_tmpdiruscCs�|js|j�n|j��\}t|t�s�t|�r{|j|�|jj||�}|j	d|||t�Stj
j|�r�|j|�|j	d|||t�St|�}n|j|�|jj|||j|j|j|j�}|dkr8d|}|jr)|d7}nt|��nB|jtkra|j|||d�|S|j	||j||�SWdQXdS(Ns+Could not find suitable distribution for %rs2 (--always-copy skips system and development eggs)tUsing(Rbtinstall_site_pyR8R�R%RR0R�tdownloadtinstall_itemRiRIR9R:R;RR2tfetch_distributionRWRuR�Rt
precedenceR,tprocess_distributiontlocation(R�R�tdepsR7tdlR�R�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR0~s2	



	
	
cCs�|p|j}|p*tjj|�|k}|p@|jd�}|p||jdk	o|tjjt|��t|j�k}|r�|r�x4|j|j	D]}|j
|kr�Pq�q�Wt}ntj
dtjj|��|r!|j|||�}xP|D]}|j|||�qWn,|j|�g}|j||d|d�|dk	r}x!|D]}||kr`|Sq`WndS(Ns.eggs
Processing %siR9(RuR9R:RtendswithR�RiRR�tproject_nameR@RIR
R�R!tinstall_eggsR?tegg_distribution(R�R�R;R7RAtinstall_neededR�tdists((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR<�s.
	

cCsUt|}xDtD]<}d|}t||�dkrt||||�qqWdS(s=Sets the install directories by applying the install schemes.tinstall_N(RR	R�RiR�(R�R�tschemeR1tattrname((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s



cGs*|j|�|jj|�||j|jkrF|jj|�n|jj|�|j|�||j|j<tj	|j
|||��|jd�r�|jr�|jj
|jd��n|r�|jr�dS|dk	r|j|jkrtjd|�dS|dks#||krD|j�}tt|��}ntj	d|�y(tg�j|g|j|j�}WnItk
r�}tt|���n%tk
r�}t|j���nX|js�|jrx9|D].}|j|jkr�|j|j��q�q�Wntj	d|�dS(Nsdependency_links.txtsSkipping dependencies for %ssProcessing dependencies for %ss'Finished processing dependencies for %s(t
update_pthR�taddR�R1tremoveR+R�R
R�tinstallation_reportthas_metadataR�R�tget_metadata_linesRuRiR�tas_requirementR%R6R)tresolveR0R*RR+treportR�(R�trequirementR�RAR�tdistreqtdistrosRc((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR?�sB


	
cCsA|jdk	r|jS|jd�r*tS|jd�s=tStS(Nsnot-zip-safeszip-safe(RjRiRPRIRK(R�R�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytshould_unzip�scCstjj|j|j�}tjj|�rSd}tj||j|j|�|Stjj|�rn|}n�tjj	|�|kr�tj
|�ntj|�}t|�dkr�tjj||d�}tjj|�r�|}q�nt
|�tj||�|S(Ns<%r already exists in %s; build directory %s will not be keptii(R9R:R�RqR1R;R
R�R�RR�tlistdirR�R!tshutiltmove(R�R�t
dist_filenamet
setup_basetdstR�tcontents((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt
maybe_move�s"	
cCs>|jr
dSx*tj�j|�D]}|j|�q#WdS(N(RntScriptWritertbesttget_argstwrite_script(R�R�Rr((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR)s	cCspt|j��}t||�}|rS|j|�t�}tj|�|}n|j|t|�d�dS(s/Generate a legacy script wrapper and install itR^N(	R6RRtis_python_scriptt_load_templateR�Rat
get_headerRdRF(R�R�R*tscript_texttdev_pathR�t	is_scripttbody((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR'scCs=d}|r!|jdd�}ntd|�}|jd�S(s�
        There are a couple of template scripts in the package. This
        function loads one of them and prepares it for use.
        sscript.tmpls.tmpls (dev).tmplR�sutf-8(RQR tdecode(RiR�t	raw_bytes((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRf&s
ttc	Cs�|jg|D]}tjj|j|�^q
�tjd||j�tjj|j|�}|j|�|jrzdSt	�}t
|�tjj|�r�tj|�nt
|d|��}|j|�WdQXt|d|�dS(s1Write an executable file to the scripts directorysInstalling %s script to %sNRi�(R�R9R:R�RmR
R�R/R�t
current_umaskR!R;R�RRtchmod(	R�R*R_tmodeR�RZttargettmaskR]((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRd5s,
		
cCs�|j�jd�r(|j||�gS|j�jd�rP|j||�gS|j�jd�rx|j||�gS|}tjj|�r�|jd�r�t|||j	�n'tjj
|�r�tjj|�}n|j|�r|j
r|dk	r|j|||�}ntjj|d�}tjj|�s�ttjj|dd��}|s�tdtjj|���nt|�dkr�td	tjj|���n|d
}n|jr�tj|j||��gS|j||�SdS(Ns.eggs.exes.whls.pyssetup.pyR�s"Couldn't find a setup script in %sisMultiple setup scripts in %si(RRCtinstall_eggtinstall_exet
install_wheelR9R:tisfileRtunpack_progressR�tabspatht
startswithRqRiR`R�R;RRR�RbR
R�treport_editabletbuild_and_install(R�R�R\R7R]tsetup_scripttsetups((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyREIs<"
	cCs[tjj|�r3t|tjj|d��}nttj|��}tj	|d|�S(NsEGG-INFOtmetadata(
R9R:R�R'R�R(t	zipimporttzipimporterR&t
from_filename(R�tegg_pathR((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRFus
cCs%tjj|jtjj|��}tjj|�}|jsLt|�n|j|�}t	||�stjj
|�r�tjj|�r�tj
|d|j�n2tjj|�r�|jtj|fd|�nyt}tjj
|�r*|j|�rtjd}}q�tjd}}ng|j|�rY|j|�|jd}}n8t}|j|�r�tjd}}ntjd}}|j|||f|dtjj|�tjj|�f�t|d|�Wqtk
rt|dt��qXn|j|�|j|�S(NR�s	Removing tMovingtCopyingt
Extractings	 %s to %stfix_zipimporter_caches(R9R:R�RlR!RyR�R!RFR/R�R�Rtremove_treeR;R�R�RKRzRZR[tcopytreeRXtmkpathtunpack_and_compileRItcopy2Rtupdate_dist_cachesR�R/(R�R�R7tdestinationR�tnew_dist_is_zippedR]RV((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRt}sT		
%
	


cCst|�}|dkr+td|��ntdd|jdd�d|jdd�dt��}tjj||j	�d�}||_
|d}tjj|d	�}tjj|d
�}t|�t||�|_
|j||�tjj|�st|d�}	|	jd�xU|jd�D]D\}
}|
d
kr*|	jd|
jdd�j�|f�q*q*W|	j�ntjj|d�}|jgtj|�D]}
tjj||
d�^q��tj||d|jd|j�|j||�S(Ns(%s is not a valid distutils Windows .exeRDRR�Rgtplatforms.eggs.tmpsEGG-INFOsPKG-INFORsMetadata-Version: 1.0
ttarget_versions%s: %s
t_t-R$iR�R�(R2RiRR&tgetRR9R:R�tegg_nameR@R!R't	_providert
exe_to_eggR;RRtitemsRQttitleRR�RaRcRtmake_zipfileR�R�Rt(R�R\R7tcfgR�R�tegg_tmpt	_egg_infotpkg_infR]tktvRmRr((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRu�s<	


0
3cs�t|��g�g�i������fd�}t|�|�g}x��D]�}|j�jd�rV|jd�}|d}tj|d�d|d<tjj	�|�}�j
|�|j
|�tj||�qVqVW|j��tj
tjj	�d�tj�|��x�d
D]�}	t�|	r*tjj	�d|	d	�}
tjj|
�s�t|
d
�}|jdj	t�|	�d�|j�q�q*q*WdS(s;Extract a bdist_wininst to the directories an egg would usecsL|j�}x�D]\}}|j|�r||t|�}|jd�}tjj�|�}|j�}|jd�s�|jd�r�tj	|d�|d<d�tjj
|d�d<�j|�nI|jd�r|dkrd�tjj
|d�d<�j|�n|SqW|jd	�sHtj
d
|�ndS(Nt/s.pyds.dlli����iis.pysSCRIPTS/s.pthsWARNING: can't process %s(RRzR�R�R9R:R�RCRtstrip_moduletsplitextR�R
R�Ri(tsrcR^REtoldtnewtpartsRB(R�tnative_libstprefixest
to_compilet	top_level(sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytprocess�s$s.pydR�i����s.pysEGG-INFOR�R�s.txtRs
N(R�R�(R4RRRCR�RR�R9R:R�R�t
write_stubtbyte_compiletwrite_safety_flagtanalyze_eggR�R;RRR(R�R\R�R�tstubstresR�tresourcetpyfileR�ttxtR]((R�R�R�R�R�sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s6






!cCsAt|�}|j�st�tjj|j|j��}tjj|�}|j	sdt
|�ntjj|�r�tjj|�r�t
j|d|j	�n2tjj|�r�|jtj|fd|�nz?|j|j|fdtjj|�tjj|�f�Wdt|dt�X|j|�|j|�S(NR�s	Removing sInstalling %s to %sR�(Rt
is_compatibletAssertionErrorR9R:R�RlR�RyR�R!R�R�RR�R;R�R�tinstall_as_eggR!RR�RKR/RF(R�t
wheel_pathR7twheelR�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRvs.	
%
s(
        Because this distribution was installed --multi-version, before you can
        import modules from this package in an application, you will need to
        'import pkg_resources' and then use a 'require()' call similar to one of
        these examples, in order to select the desired version:

            pkg_resources.require("%(name)s")  # latest installed version
            pkg_resources.require("%(name)s==%(version)s")  # this exact version
            pkg_resources.require("%(name)s>=%(version)s")  # this version or higher
        s�
        Note also that the installation directory must be on sys.path at runtime for
        this to work.  (e.g. by being the application's script directory, by being on
        PYTHONPATH, or by being added to sys.path by your code.)
        t	Installedc	Cs�d}|jr\|jr\|d|j7}|jtttj�kr\|d|j7}q\n|j	}|j
}|j}d}|t�S(s9Helpful installation message for display to package userss
%(what)s %(eggloc)s%(extras)ss
RT(
RvR{t_easy_install__mv_warningRlRRR�R:t_easy_install__id_warningR@RDRgR�(	R�treqR�twhatR�tegglocR�Rgtextras((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyROCs			sR
        Extracted editable version of %(spec)s to %(dirname)s

        If it uses setuptools in its setup script, you can activate it in
        "development" mode by going to that directory and running::

            %(python)s setup.py develop

        See the setuptools documentation for the "develop" command for more info.
        cCs-tjj|�}tj}d|jt�S(Ns
(R9R:RR�Rt_easy_install__editable_msgR�(R�R�R}Rtpython((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR{\s	cCstjjdt�tjjdt�t|�}|jdkrid|jd}|jdd|�n"|jdkr�|jdd�n|jr�|jdd	�nt	j
d
|t|�ddj|��yt
||�Wn-tk
r}td|jdf��nXdS(
Nsdistutils.command.bdist_eggsdistutils.command.egg_infoiR�iiR�s-qs-ns
Running %s %st sSetup script exited with %s(R�tmodulest
setdefaultRRR�R�R�R�R
R�R�R�RR�RRr(R�R}R]RrR�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRas 	$c	Csddg}tjdddtjj|��}z�|jtjj|��|j|�|j|||�t|g�}g}x?|D]7}x.||D]"}|j|j	|j
|��q�Wq�W|r�|jr�tj
d|�n|SWdt|�tj|j�XdS(NRs
--dist-dirRzs
egg-dist-tmp-tdirs+No eggs found in %s (setup script problem?)(R3R4R9R:Rt_set_fetcher_optionsR�RR$RtR@R�R
R�R�R�R�(	R�R}R]Rrtdist_dirtall_eggsteggsR1R�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR|us$	

$	

c	Cs�|jjd�j�}d}i}xF|j�D]8\}}||krOq1n|d||jdd	�<q1Wtd|�}tjj|d
�}t	j
||�dS(
s
        When easy_install is about to run bdist_egg on a source dist, that
        source dist might have 'setup_requires' directives, requiring
        additional fetching. Ensure the fetcher options given to easy_install
        are available to that command as well.
        R0RpR�RoRsRxiR�R�s	setup.cfgN(RpR�RoRsR�Rx(R�R�tcopyR�RQtdictR9R:R�Rtedit_config(	R�R-tei_optstfetch_directivest
fetch_optionsR1R�tsettingstcfg_filename((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s	cCs�|jdkrdSx~|j|jD]l}|jsE|j|jkr$tjd|�|jj|�|j|jkr�|jj|j�q�q$q$W|js|j|jj	kr�tjd|�qtjd|�|jj
|�|j|jkr|jj|j�qn|js�|jj
�|jdkr�tjj|jd�}tjj|�rotj|�nt|d�}|j|jj|j�d�|j�q�ndS(Ns&Removing %s from easy-install.pth files4%s is already the active version in easy-install.pths"Adding %s to easy-install.pth fileR�ssetuptools.pthtwts
(R�RiR1RvR@R
R�RNR�tpathsRMR�R�tsaveR9R:R�RlR�R�RRt
make_relativeR(R�R�RYR�R]((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRL�s4	
	
 cCstjd||�|S(NsUnpacking %s to %s(R
tdebug(R�R�R^((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRx�scs�g�g����fd�}t|||��j���js�x<�D]1}tj|�tjdBd@}t||�qNWndS(Ncs�|jd�r/|jd�r/�j|�n.|jd�sM|jd�r]�j|�n�j||��jr}|p�dS(Ns.pys	EGG-INFO/s.dlls.so(RCRzR�RxR�Ri(R�R^(R�tto_chmodR�(sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytpf�simi�(RR�R�R9tstattST_MODERp(R�R�R�R�R]Rq((R�R�R�sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s
	
cCs�tjr
dSddlm}zetj|jd�||ddddd|j�|jr�||d|jddd|j�nWdtj|j�XdS(Ni����(R�iRsitforceR�(	R�tdont_write_bytecodetdistutils.utilR�R
R�R�R�Rs(R�R�R�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s		s�
        bad install directory or PYTHONPATH

        You are attempting to install a package to a directory that is not
        on PYTHONPATH and which Python does not read ".pth" files from.  The
        installation directory you specified (via --install-dir, --prefix, or
        the distutils default setting) was:

            %s

        and your PYTHONPATH environment variable currently contains:

            %r

        Here are some of your options for correcting the problem:

        * You can choose a different installation directory, i.e., one that is
          on PYTHONPATH or supports .pth files

        * You can add the installation directory to the PYTHONPATH environment
          variable.  (It must then also be on PYTHONPATH whenever you run
          Python and want to use the package(s) you are installing.)

        * You can set up the installation directory to support ".pth" files by
          using one of the approaches described here:

          https://setuptools.readthedocs.io/en/latest/easy_install.html#custom-installation-locations


        Please make the appropriate changes for your system and try again.cCs)|j}||jtjjdd�fS(Nt
PYTHONPATHRT(t_easy_install__no_default_msgRlR9tenvironR�(R�ttemplate((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR	s	cCs7|jr
dStjj|jd�}tdd�}|jd�}d}tjj|�r�tj	d|j�t
j|��}|j�}WdQX|j
d�s�td	|��q�n||kr*tjd
|�|jst|�t
j|ddd��}|j|�WdQXn|j|g�nt|_dS(
s8Make sure there's a site.py in the target dir, if neededNssite.pyR�s
site-patch.pysutf-8RTsChecking existing site.py in %ss
def __boot():s;%s is not a setuptools-generated site.py; please remove it.sCreating %sRtencoding(R�R9R:R�RlR RlR;R
R�tioRtreadRzRR�R�R!RR�RI(R�tsitepytsourcetcurrenttstrm((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR:s,		
cCs�|js
dSttjjd��}xftj|j�D]R\}}|j|�r8tjj	|�r8|j
d|�tj|d�q8q8WdS(sCreate directories under ~.Nt~sos.makedirs('%s', 0o700)i�(RhRR9R:R�Rt	iteritemsR�RzR�tdebug_printR(R�thomeR�R:((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR�8s	"R�Rls/$base/lib/python$py_version_short/site-packagesRms	$base/bins$base/Lib/site-packagess
$base/ScriptscGs |jd�j}|jr�|j�}|j|d<|jjtj|j�}xH|j	�D]7\}}t
||d�dkr\t|||�q\q\Wnddl
m}xo|D]g}t
||�}|dk	r�|||�}tjdkrtjj|�}nt|||�q�q�WdS(NR�R-i����(RR�(tget_finalized_commandR�RzR�RR�R9R�tDEFAULT_SCHEMER�R�RiR�R�RR:R�(R�R�R�RJR�R�R((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR�Ns 	

N(sprefix=Nsinstallation prefix(szip-okRUsinstall package as a zipfile(s
multi-versionRVs%make apps have to require() a version(RWRXs1force upgrade (searches PyPI for latest versions)(sinstall-dir=RYsinstall package to DIR(sscript-dir=REsinstall scripts to DIR(sexclude-scriptsRZsDon't install scripts(salways-copyR[s'Copy all needed packages to install dir(s
index-url=R\s base URL of Python Package Index(sfind-links=R]s(additional URL(s) to search for packages(sbuild-directory=R^s/download/extract/build in DIR; keep the results(s	optimize=R_slalso compile with optimization: -O1 for "python -O", -O2 for "python -OO", and -O0 to disable [default: -O0](srecord=Ns3filename in which to record list of installed files(salways-unzipR`s*don't install as a zipfile, no matter what(s
site-dirs=Ras)list of directories where .pth files work(RbRcs+Install specified packages in editable form(sno-depsRdsdon't install dependencies(sallow-hosts=Res$pattern(s) that hostnames must match(slocal-snapshots-okRfs(allow building eggs from local checkouts(RgNs"print version information and exit(s
no-find-linksNs9Don't load find-links defined in packages being installed((St__name__t
__module__t__doc__tdescriptionRItcommand_consumes_argumentsRituser_optionstboolean_optionsR�R�R�thelp_msgR�tnegative_optRR�R�R�R�tstaticmethodR�R�R�R�R�R�R�RR�R�RNROtlstripRRRRRR+R/R0R2t
contextlibtcontextmanagerR8RKR0R<R�R?RXR`R)R'RfRdRERFRtRuR�RvR�R�ROR�R{RR|R�RLRxR�R�R�R	R:R�R�RR�R�(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR0xs�		

	0				z									*			;				
	$$		'				
	,		6	-	5									%					 	
	cCs.tjjdd�jtj�}td|�S(NR�RT(R9R�R�R�tpathseptfilterRi(R�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR
es!cCs!g}|jt��tjg}tjtjkrG|jtj�nx2|D]*}|rNtjdkr�|jtjj	|dd��n|tj
dkr�|jtjj	|ddtjd d�tjj	|dd	�g�n%|j|tjj	|dd�g�tjd
krxd|krutjj
d�}|rrtjj	|d
dtjd d�}|j|�qrquqxqNqNWtd�td�f}x*|D]"}||kr�|j|�q�q�Wtjr�|jtj�ny|jtj��Wntk
rnXttt|��}|S(s&
    Return a list of 'site' dirs
    tos2emxtriscostLibs
site-packagesR�tlibR�issite-pythontdarwinsPython.frameworktHOMEtLibrarytPythontpurelibtplatlib(RR(textendR
R�RzR�R�R�R9R:R�tsepRgR�R�RR�R�R�tgetsitepackagestAttributeErrorR�RR(tsitedirsR�RzR�thome_spt	lib_pathstsite_lib((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR�jsV
"		
	
	
ccs^i}xQ|D]I}t|�}||kr1q
nd||<tjj|�sSq
ntj|�}||fVx�|D]�}|jd�s�qtn|dkr�qtnttjj||��}tt	|��}|j
�xw|D]o}|jd�s�t|j��}||krNd||<tjj|�s4q�n|tj|�fVqNq�q�WqtWq
WdS(sBYield sys.path directories that might contain "old-style" packagesis.pthseasy-install.pthssetuptools.pthtimportN(seasy-install.pthssetuptools.pth(
RR9R:R�RYRCRR�R�RRRztrstrip(tinputstseenRR.R�R]tlinestline((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytexpand_paths�s4





cCst|d�}z^tj|�}|dkr1dS|d|d|d}|dkr[dS|j|d�tjd|jd��\}}}|dkr�dS|j|d|�id	d
6d	d6}tj	|�}yT|j|�}	|	j
dd
�d}
|
jtj
��}
|jtj|
��Wntjk
rCdSX|jd�sd|jd�rhdS|SWd|j�XdS(snExtract configuration data from a bdist_wininst .exe

    Returns a configparser.RawConfigParser, or None
    trbi	iiis<iiiizV4i{V4RTRgR�siiRtSetupN(izV4i{V4(Rtzipfilet_EndRecDataRitseekR6tunpackR�RtRawConfigParserR�RlR�tgetfilesystemencodingtreadfpRtStringIOtErrorthas_sectionR(R\R]tendrect	prependedttagtcfglentbmlentinitR�tparttconfig((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR2�s4$ c
Cs�dddddg}tj|�}zqxj|j�D]\}|j}|jd�}t|�d	kr�|d
dkr�|djd
�r�|jddj|d
 �df�Pq�nt|�d
ks4|jd�r�q4n|jd�r�q4n|dj	�dkr4|j
|�}tjr+|j
�}nxbt|�D]Q}|j�jdd�}|jd�s8|jd|d|fdf�q8q8Wq4q4WWd|j�Xg|D]\}}	|j�|	f^q�}|j�|j�|S(s4Get exe->egg path translations for a given .exe filesPURELIB/RTsPLATLIB/pywin32_system32sPLATLIB/sSCRIPTS/sEGG-INFO/scripts/sDATA/lib/site-packagesR�iisPKG-INFOis	.egg-infois	EGG-INFO/s.pths
-nspkg.pthtPURELIBtPLATLIBs\Rs%s/%s/N(sPURELIB/RT(sPLATLIB/pywin32_system32RT(sPLATLIB/RT(sSCRIPTS/sEGG-INFO/scripts/(sDATA/lib/site-packagesRT(R-R.(RtZipFiletinfolistR�R�R�RCR�R�tupperR�RtPY3RlRRPRQRzR�RRtsorttreverse(
texe_filenameR�RUR�R�R�R_tpthRZty((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR4�s>		"#"	3+

cBs\eZdZeZdd�Zd�Zd�Zed��Z	d�Z
d�Zd�ZRS(	s)A .pth file with Distribution paths in itcCs�||_ttt|��|_ttjj|j��|_|j	�t
j|gdd�x6t
|j�D]%}tt|jt|t���qoWdS(N(R�R�RRRR9R:Rtbasedirt_loadR$t__init__RiRR�RMR#RI(R�R�RR:((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR:)s	
cCs�g|_t}tj|j�}tjj|j�r3t	|jd�}x�|D]�}|j
d�rpt}qOn|j�}|jj
|�|j�sO|j�j
d�r�qOnttjj|j|��}|jd<tjj|�s�||kr|jj�t|_qOnd||<qOW|j�n|jrO|rOt|_nx.|jr|jdj�r|jj�qRWdS(NtrtRt#i����i(R�RKR�tfromkeysRR9R:RwR�RRzRIRR�RPRR�R8R;tpoptdirtyR(R�t
saw_importRR]RR:((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR92s2	
"&
	
 cCs�|js
dStt|j|j��}|r�tjd|j�|j|�}dj	|�d}t
jj|j�r�t
j
|j�nt|jd��}|j|�WdQXn;t
jj|j�r�tjd|j�t
j
|j�nt|_dS(s$Write changed .pth file back to diskNs	Saving %ss
R�sDeleting empty %s(R?R�RR�R�R
R�R�t_wrap_linesR�R9R:R�R�RRR;RK(R�t	rel_pathsRtdataR]((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR�Qs	cCs|S(N((R((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRAgscCsr|j|jko6|j|jkp6|jtj�k}|r^|jj|j�t|_ntj	||�dS(s"Add `dist` to the distribution mapN(
R@R�RR9tgetcwdR�RIR?R$RM(R�R�tnew_path((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRMkscCsIx2|j|jkr4|jj|j�t|_qWtj||�dS(s'Remove `dist` from the distribution mapN(R@R�RNRIR?R$(R�R�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRNys
cCs�tjjt|��\}}t|j�}|g}tjdkrKdpQtj}xut|�|kr�||jkr�|jtj	�|j
�|j|�Stjj|�\}}|j|�qWW|SdS(NR�(R9R:R�RR�R8taltsepRR�tcurdirR4R�(R�R:tnpathtlasttbaselenR�R((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s	

((
R�R�R�RKR?R:R9R�R�RARMRNR�(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR1$s					tRewritePthDistributionscBs/eZed��Zed�Zed�ZRS(ccs*|jVx|D]}|VqW|jVdS(N(tpreludetpostlude(tclsRR((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRA�s
	s?
        import sys
        sys.__plen = len(sys.path)
        s�
        import sys
        new = sys.path[sys.__plen:]
        del sys.path[sys.__plen:]
        p = getattr(sys, '__egginsert', 0)
        sys.path[p:p] = new
        sys.__egginsert = p + len(new)
        (R�R�tclassmethodRARRLRM(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRK�s
	tSETUPTOOLS_SYS_PATH_TECHNIQUEtrawtrewritecCs,ttjt�rtStjtjj��S(s_
    Return a regular expression based on first_line_re suitable for matching
    strings.
    (R�RtpatternR6tretcompileRl(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt_first_line_re�scCs�|tjtjgkrAtjdkrAt|tj�||�Stj�\}}}t	j
||d|dd||ff�dS(NR�iis %s %s(R9R�RNR�RpR�tS_IWRITER�RRtreraise(tfunctargtexctettevR�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt
auto_chmod�s
'
cCs=t|�}t|tj�|r/t|�n
t|�dS(sa

    Fix any globally cached `dist_path` related data

    `dist_path` should be a path of a newly installed egg distribution (zipped
    or unzipped).

    sys.path_importer_cache contains finder objects that have been cached when
    importing data from the original distribution. Any such finders need to be
    cleared since the replacement distribution might be packaged differently,
    e.g. a zipped egg distribution might get replaced with an unzipped egg
    folder or vice versa. Having the old finders cached may then cause Python
    to attempt loading modules from the replacement distribution using an
    incorrect loader.

    zipimport.zipimporter objects are Python loaders charged with importing
    data packaged inside zip archives. If stale loaders referencing the
    original distribution, are left behind, they can fail to load modules from
    the replacement distribution. E.g. if an old zipimport.zipimporter instance
    is used to load data from a new zipped egg archive, it may cause the
    operation to attempt to locate the requested data in the wrong location -
    one indicated by the original distribution's zip archive directory
    information. Such an operation may then fail outright, e.g. report having
    read a 'bad local file header', or even worse, it may fail silently &
    return invalid data.

    zipimport._zip_directory_cache contains cached zip archive directory
    information for all existing zipimport.zipimporter instances and all such
    instances connected to the same archive share the same cached directory
    information.

    If asked, and the underlying Python implementation allows it, we can fix
    all existing zipimport.zipimporter instances instead of having to track
    them down and remove them one by one, by updating their shared cached zip
    archive directory information. This, of course, assumes that the
    replacement distribution is packaged as a zipped egg.

    If not asked to fix existing zipimport.zipimporter instances, we still do
    our best to clear any remaining zipimport.zipimporter related cached data
    that might somehow later get used when attempting to load data from the new
    distribution and thus cause such load operations to fail. Note that when
    tracking down such remaining stale data, we can not catch every conceivable
    usage from here, and we clear only those that we know of and have found to
    cause problems if left alive. Any remaining caches should be updated by
    whomever is in charge of maintaining them, i.e. they should be ready to
    handle us replacing their zip archives with new distributions at runtime.

    N(Rt_uncacheR�tpath_importer_cachet!_replace_zip_directory_cache_datat*_remove_and_clear_zip_directory_cache_data(t	dist_pathR�tnormalized_path((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s
<
cCsrg}t|�}xY|D]Q}t|�}|j|�r|||d!tjdfkr|j|�qqW|S(sp
    Return zipimporter cache entry keys related to a given normalized path.

    Alternative path spellings (e.g. those using different character case or
    those using alternative path separators) related to the same path are
    included. Any sub-path entries are included as well, i.e. those
    corresponding to zip archives embedded in other zip archives.

    iRT(R�RRzR9RR�(Rdtcachetresultt
prefix_lentptnp((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt"_collect_zipimporter_cache_entriess

 cCs]xVt||�D]E}||}||=|o9|||�}|dk	r|||<qqWdS(s�
    Update zipimporter cache data for a given normalized path.

    Any sub-path entries are processed as well, i.e. those corresponding to zip
    archives embedded in other zip archives.

    Given updater is a callable taking a cache entry key and the original entry
    (after already removing the entry from the cache), and expected to update
    the entry and possibly return a new one to be inserted in its place.
    Returning None indicates that the entry should not be replaced with a new
    one. If no updater is given, the cache entries are simply removed without
    any additional processing, the same as if the updater simply returned None.

    N(RjRi(RdRetupdaterRht	old_entryt	new_entry((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt_update_zipimporter_cache$s

cCst||�dS(N(Rn(RdRe((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR_DscCs#d�}t|tjd|�dS(NcSs|j�dS(N(tclear(R:Rl((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt2clear_and_remove_cached_zip_archive_directory_dataIsRk(RnR�t_zip_directory_cache(RdRp((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRbHs	t__pypy__cCs#d�}t|tjd|�dS(NcSs/|j�tj|�|jtj|�|S(N(RoR�R�tupdateRq(R:Rl((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt)replace_cached_zip_archive_directory_data_s

Rk(RnR�Rq(RdRt((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRa^s	
s<string>cCs7yt||d�Wnttfk
r.tSXtSdS(s%Is this string a valid Python script?texecN(RUtSyntaxErrort	TypeErrorRKRI(RRR�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt	is_pythonqs
cCsVy1tj|dd��}|jd�}WdQXWnttfk
rK|SX|dkS(sCDetermine if the specified executable is a .sh (contains a #! line)R�slatin-1iNs#!(R�RR�RR(Rtfptmagic((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytis_sh{scCstj|g�S(s@Quote a command line argument according to Windows parsing rules(t
subprocesstlist2cmdline(RZ((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytnt_quote_arg�scCsb|jd�s|jd�r"tSt||�r5tS|jd�r^d|j�dj�kStS(sMIs this text, as a whole, a Python script? (as opposed to shell/bat/etc.
    s.pys.pyws#!R�i(RCRIRxRzt
splitlinesRRK(RhR�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRe�s(RpcGsdS(N((Rr((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt_chmod�scCsQtjd||�yt||�Wn&tjk
rL}tjd|�nXdS(Nschanging mode of %s to %oschmod failed: %s(R
R�R�R9terror(R:RqRc((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRp�s
tCommandSpeccBs�eZdZgZe�Zed��Zed��Zed��Z	ed��Z
ed��Zd�Ze
d��Zd�Ze
d	��Ze
d
��ZRS(sm
    A command spec for a #! header, specified as a list of arguments akin to
    those passed to Popen.
    cCs|S(sV
        Choose the best CommandSpec class based on environmental conditions.
        ((RN((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRb�scCs(tjjtj�}tjjd|�S(Nt__PYVENV_LAUNCHER__(R9R:R=R�RR�R�(RNt_default((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt_sys_executable�scCsOt||�r|St|t�r,||�S|dkrB|j�S|j|�S(sg
        Construct a CommandSpec from a parameter to build_scripts, which may
        be None.
        N(R�R�Ritfrom_environmenttfrom_string(RNtparam((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt
from_param�s

cCs||j�g�S(N(R�(RN((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��scCstj||j�}||�S(s}
        Construct a command spec from a simple string representing a command
        line parseable by shlex.split.
        (tshlexR�t
split_args(RNtstringR�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��scCsMtj|j|��|_tj|�}t|�sIdg|jd*ndS(Ns-xi(R�R�t_extract_optionstoptionsR|R}RL(R�Rhtcmdline((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytinstall_options�scCsQ|dj�d}t�j|�}|rA|jd�pDdnd}|j�S(sH
        Extract any options from the first line of the script.
        s
iiRT(RRVtmatchtgroupRP(torig_scripttfirstR�R�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s!cCs|j|t|j��S(N(t_renderR�R�(R�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt	as_header�scCsDd}x7|D]/}|j|�r
|j|�r
|dd!Sq
W|S(Ns"'ii����(RzRC(titemt_QUOTEStq((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt
_strip_quotes�s

cCs%tjd�|D��}d|dS(Ncss$|]}tj|j��VqdS(N(R�R�RP(R�R�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pys	<genexpr>�ss#!s
(R|R}(R�R�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s(R�R�R�R�R�R�RORbR�R�R�R�R�R�R�R�R�R�(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s			
	tWindowsCommandSpeccBseZede�ZRS(R�(R�R�R�RKR�(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��sRacBs�eZdZejd�j�ZeZe	ded��Ze	ded��Z
e	dd��Zed��Ze	d��Ze	d��Ze	d��Ze	d	dd
��ZRS(s`
    Encapsulates behavior around writing entry point scripts for console and
    gui apps.
    s�
        # EASY-INSTALL-ENTRY-SCRIPT: %(spec)r,%(group)r,%(name)r
        __requires__ = %(spec)r
        import re
        import sys
        from pkg_resources import load_entry_point

        if __name__ == '__main__':
            sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
            sys.exit(
                load_entry_point(%(spec)r, %(group)r, %(name)r)()
            )
    cCsMtjdt�|rtntj�}|jd||�}|j||�S(NsUse get_argsRT(twarningsR�tDeprecationWarningtWindowsScriptWriterRaRbtget_script_headerRc(RNR�Rtwininsttwritertheader((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pytget_script_argsscCsNtjdt�|rd}n|jj�j|�}|j|�|j�S(NsUse get_headers
python.exe(R�R�R�tcommand_spec_classRbR�R�R�(RNRhRR�tcmd((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR�!s	
ccs�|dkr|j�}nt|j��}x�dD]�}|d}xn|j|�j�D]W\}}|j|�|jt�}|j	||||�}	x|	D]}
|
Vq�WqZWq4WdS(s�
        Yield write_script() argument tuples for a distribution's
        console_scripts and gui_scripts entry points.
        tconsoletguit_scriptsN(R�R�(
RiRgR6RRt
get_entry_mapR�t_ensure_safe_nameR�R�t_get_script_args(RNR�R�R�ttype_R�R�tepRhRrR�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRc+s

"

cCs+tjd|�}|r'td��ndS(s?
        Prevent paths in *_scripts entry point names.
        s[\\/]s+Path separators not allowed in script namesN(RTtsearchR�(R�thas_path_sep((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR�=scCs*tjdt�|r tj�S|j�S(NsUse best(R�R�R�R�Rb(RNt
force_windows((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt
get_writerFscCs?tjdks-tjdkr7tjdkr7tj�S|SdS(sD
        Select the best ScriptWriter for this environment.
        twin32tjavaR�N(R�R�R9R�t_nameR�Rb(RN((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRbLs-
ccs|||fVdS(N((RNR�R�R�Rh((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR�VsRTcCs/|jj�j|�}|j|�|j�S(s;Create a #! line, getting options (if any) from script_text(R�RbR�R�R�(RNRhRR�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRg[s
N(R�R�R�RNROR�R�R�R�RORiRKR�R�RcR�R�R�RbR�Rg(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRas 		
R�cBsYeZeZed��Zed��Zed��Zed��Ze	d��Z
RS(cCstjdt�|j�S(NsUse best(R�R�R�Rb(RN((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR�fscCs2tdtd|�}tjjdd�}||S(sC
        Select the best ScriptWriter suitable for Windows
        RtnaturaltSETUPTOOLS_LAUNCHER(R�tWindowsExecutableLauncherWriterR9R�R�(RNt
writer_lookuptlauncher((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRbls
	c
cs�tdddd�|}|tjdj�jd�kr`djt��}tj|t	�nddd	d
dddg}|j
|�|j||�}g|D]}||^q�}	||||d
|	fVdS(s For Windows, add a .py extensionR�s.pyaR�s.pywtPATHEXTt;sK{ext} not listed in PATHEXT; scripts will not be recognized as executables.s.pys
-script.pys.pycs.pyos.exeRnN(R�R9R�RR�R�R�R�R�tUserWarningRNt_adjust_header(
RNR�R�R�RhtextR�R�RZR�((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR�ys"
cCsud}d}|dkr(||}}ntjtj|�tj�}|jd|d|�}|j|�rq|S|S(s�
        Make sure 'pythonw' is used for gui and and 'python' is used for
        console (regardless of what sys.executable is).
        spythonw.exes
python.exeR�R�trepl(RTRUtescapet
IGNORECASEtsubt_use_header(RNR�torig_headerRSR�t
pattern_obt
new_header((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��scCs/|dd!jd�}tjdkp.t|�S(s�
        Should _adjust_header use the replaced header?

        On non-windows systems, always use. On
        Windows systems, only use the replaced header if it resolves
        to an executable on the system.
        ii����t"R�(RPR�R�R
(R�tclean_header((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s	(R�R�R�R�ROR�RbR�R�R�R�(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR�cs
R�cBseZed��ZRS(ccs�|dkr$d}d}dg}nd}d}dddg}|j||�}g|D]}	||	^qX}
||||d	|
fV|d
t|�dfVt�s�|d}|t|�d	fVnd
S(sG
        For Windows, add a .py extension and an .exe launcher
        R�s-script.pyws.pywtclis
-script.pys.pys.pycs.pyoRns.exeR^s
.exe.manifestN(R�tget_win_launcherR8tload_launcher_manifest(RNR�R�R�Rht
launcher_typeR�R�thdrRZR�tm_name((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s	
(R�R�ROR�(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��scCsGd|}t�r(|jdd�}n|jdd�}td|�S(s�
    Load the Windows launcher (executable) suitable for launching a script.

    `type` should be either 'cli' or 'gui'

    Returns the executable as a byte string.
    s%s.exet.s-64.s-32.R�(R8RQR (ttypetlauncher_fn((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s

	cCs>tjtd�}tjr&|t�S|jd�t�SdS(Nslauncher manifest.xmlsutf-8(RR R�RtPY2tvarsRl(R�tmanifest((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s	cCstj|||�S(N(RZR�(R:t
ignore_errorstonerror((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��scCs tjd�}tj|�|S(Ni(R9tumask(ttmp((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyRo�s
cCsMddl}tjj|jd�}|tjd<tjj|�t�dS(Ni����i(	R�R9R:Rt__path__R�targvR�R3(R�targv0((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt	bootstrap�s

cs�ddlm}ddlm�d�f�fd��Y}|dkrXtjd}nt��;|ddd	d
g|dtjdp�d	d
||�WdQXdS(Ni����(tsetup(R&tDistributionWithoutHelpCommandscseZdZ�fd�ZRS(RTcs't���j|||�WdQXdS(N(t_patch_usaget
_show_help(R�Rrtkw(R&(sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��s
(R�R�tcommon_usageR�((R&(sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR��sitscript_argss-qR0s-vR*it	distclass(R�R�tsetuptools.distR&RiR�R�R�(R�R�R�R�((R&sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR3�s
c#seddl}tjd�j���fd�}|jj}||j_z	dVWd||j_XdS(Ni����se
        usage: %(script)s [options] requirement_or_url ...
           or: %(script)s --help
        cs�tdtjj|��S(Ntscript(R�R9R:R!(R*(tUSAGE(sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt	gen_usage	s	(tdistutils.coreRNROR�tcoreR�(R�R�tsaved((R�sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyR�	s	(�R�RR�RRRtdistutils.errorsRRRRtdistutils.command.installRR	R�R
Rtdistutils.command.build_scriptsRRR
R�R9R�RZR3RRTR�R�RNR�R�R6R�R|R�R�tsetuptools.externRtsetuptools.extern.six.movesRRR�Rtsetuptools.sandboxRtsetuptools.py31compatRRtsetuptools.py27compatRtsetuptools.commandRtsetuptools.archive_utilRtsetuptools.package_indexRRRRRtsetuptools.wheelRRRRR R!R"R#R$R%R&R'R(R)R*R+R,tpkg_resources.py31compattfilterwarningst
PEP440Warningt__all__R8R/R�RFRLRR0R
R�RR2R4R1RKR�R�RVR^R�RjRiRnR_Rbtbuiltin_module_namesRaRxR{R~ReRpR�tImportErrorR�R�R�tsys_executableR�tobjectRaR�R�R�R�R�R�RKR�RoR�R3R�R�(((sC/usr/lib/python2.7/site-packages/setuptools/command/easy_install.pyt<module>s�"d							�����		A	)	)	'l				R	 				
	
		

	T`A 						
command/upload.py000064400000002224151733473650010036 0ustar00import getpass
from distutils.command import upload as orig


class upload(orig.upload):
    """
    Override default upload behavior to obtain password
    in a variety of different ways.
    """

    def finalize_options(self):
        orig.upload.finalize_options(self)
        self.username = (
            self.username or
            getpass.getuser()
        )
        # Attempt to obtain password. Short circuit evaluation at the first
        # sign of success.
        self.password = (
            self.password or
            self._load_password_from_keyring() or
            self._prompt_for_password()
        )

    def _load_password_from_keyring(self):
        """
        Attempt to load password from keyring. Suppress Exceptions.
        """
        try:
            keyring = __import__('keyring')
            return keyring.get_password(self.repository, self.username)
        except Exception:
            pass

    def _prompt_for_password(self):
        """
        Prompt for a password on the tty. Suppress Exceptions.
        """
        try:
            return getpass.getpass()
        except (Exception, KeyboardInterrupt):
            pass
command/bdist_rpm.py000064400000002744151733473650010544 0ustar00import distutils.command.bdist_rpm as orig


class bdist_rpm(orig.bdist_rpm):
    """
    Override the default bdist_rpm behavior to do the following:

    1. Run egg_info to ensure the name and version are properly calculated.
    2. Always run 'install' using --single-version-externally-managed to
       disable eggs in RPM distributions.
    3. Replace dash with underscore in the version numbers for better RPM
       compatibility.
    """

    def run(self):
        # ensure distro name is up-to-date
        self.run_command('egg_info')

        orig.bdist_rpm.run(self)

    def _make_spec_file(self):
        version = self.distribution.get_version()
        rpmversion = version.replace('-', '_')
        spec = orig.bdist_rpm._make_spec_file(self)
        line23 = '%define version ' + version
        line24 = '%define version ' + rpmversion
        spec = [
            line.replace(
                "Source0: %{name}-%{version}.tar",
                "Source0: %{name}-%{unmangled_version}.tar"
            ).replace(
                "setup.py install ",
                "setup.py install --single-version-externally-managed "
            ).replace(
                "%setup",
                "%setup -n %{name}-%{unmangled_version}"
            ).replace(line23, line24)
            for line in spec
        ]
        insert_loc = spec.index(line24) + 1
        unmangled_version = "%define unmangled_version " + version
        spec.insert(insert_loc, unmangled_version)
        return spec
command/bdist_wininst.pyc000064400000002247151733473660011603 0ustar00�
�fc@s/ddljjZdejfd��YZdS(i����Nt
bdist_wininstcBseZdd�Zd�ZRS(icCs1|jj||�}|dkr-d|_n|S(sj
        Supplement reinitialize_command to work around
        http://bugs.python.org/issue20819
        tinstalltinstall_lib(RRN(tdistributiontreinitialize_commandtNoneR(tselftcommandtreinit_subcommandstcmd((sD/usr/lib/python2.7/site-packages/setuptools/command/bdist_wininst.pyRs
	cCs.t|_ztjj|�Wdt|_XdS(N(tTruet_is_runningtorigRtruntFalse(R((sD/usr/lib/python2.7/site-packages/setuptools/command/bdist_wininst.pyR
s	(t__name__t
__module__RR
(((sD/usr/lib/python2.7/site-packages/setuptools/command/bdist_wininst.pyRs(tdistutils.command.bdist_wininstRRR(((sD/usr/lib/python2.7/site-packages/setuptools/command/bdist_wininst.pyt<module>scommand/setopt.pyc000064400000013642151733473660010242 0ustar00�
�fc@s�ddlmZddlmZddlmZddlZddlZddlmZddl	m
Z
ddd	d
gZdd�Ze
d
�Zd	e
fd��YZd
efd��YZdS(i����(tconvert_path(tlog(tDistutilsOptionErrorN(tconfigparser(tCommandtconfig_filetedit_configtoption_basetsetopttlocalcCs�|dkrdS|dkr>tjjtjjtj�d�S|dkrtjdkr_dpbd}tjjtd	|��St	d
|��dS(s�Get the filename of the distutils, local, global, or per-user config

    `kind` must be one of "local", "global", or "user"
    R	s	setup.cfgtglobals
distutils.cfgtusertposixt.ts~/%spydistutils.cfgs7config_file() type must be 'local', 'global', or 'user'N(
tostpathtjointdirnamet	distutilst__file__tnamet
expanduserRt
ValueError(tkindtdot((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pyRs	c	Cs�tjd|�tj�}|j|g�x+|j�D]\}}|d	krttjd||�|j|�q9|j	|�s�tjd||�|j
|�nx�|j�D]�\}}|d	kr&tjd|||�|j||�|j|�sRtjd||�|j|�qRq�tjd||||�|j
|||�q�Wq9Wtjd|�|s�t|d��}|j|�Wd	QXnd	S(
sYEdit a configuration file to include `settings`

    `settings` is a dictionary of dictionaries or ``None`` values, keyed by
    command/section name.  A ``None`` value means to delete the entire section,
    while a dictionary lists settings to be changed or deleted in that section.
    A setting of ``None`` means to delete that setting.
    sReading configuration from %ssDeleting section [%s] from %ssAdding new section [%s] to %ssDeleting %s.%s from %ss#Deleting empty [%s] section from %ssSetting %s.%s to %r in %ss
Writing %stwN(RtdebugRtRawConfigParsertreadtitemstNonetinfotremove_sectionthas_sectiontadd_sectiont
remove_optiontoptionstsettopentwrite(	tfilenametsettingstdry_runtoptstsectionR%toptiontvaluetf((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pyR!s8
	
cBs;eZdZdd
dgZddgZd
�Zd�ZRS(s<Abstract base class for commands that mess with config filess
global-configtgs0save options to the site-wide distutils.cfg filesuser-configtus7save options to the current user's pydistutils.cfg files	filename=R0s-configuration file to use (default=setup.cfg)cCsd|_d|_d|_dS(N(Rt
global_configtuser_configR)(tself((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pytinitialize_options\s		cCs�g}|jr%|jtd��n|jrD|jtd��n|jdk	rf|j|j�n|s�|jtd��nt|�dkr�td|��n|\|_dS(NR
RR	is/Must specify only one configuration file option(R3tappendRR4R)RtlenR(R5t	filenames((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pytfinalize_optionsas		(s
global-configR1s0save options to the site-wide distutils.cfg file(suser-configR2s7save options to the current user's pydistutils.cfg file(s	filename=R0s-configuration file to use (default=setup.cfg)(t__name__t
__module__t__doc__tuser_optionstboolean_optionsR6R:(((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pyRLs		cBsXeZdZdZddddgejZejdgZd�Zd�Zd�Z	RS(s#Save command-line options to a files1set an option in setup.cfg or another config filescommand=tcscommand to set an option forsoption=tos
option to sets
set-value=tssvalue of the optiontremovetrsremove (unset) the valuecCs5tj|�d|_d|_d|_d|_dS(N(RR6RtcommandR.t	set_valueRC(R5((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pyR6�s

			cCsftj|�|jdks+|jdkr:td��n|jdkrb|jrbtd��ndS(Ns%Must specify --command *and* --options$Must specify --set-value or --remove(RR:RERR.RRFRC(R5((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pyR:�s

cCs=t|jii|j|jjdd�6|j6|j�dS(Nt-t_(RR)RFR.treplaceRER+(R5((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pytrun�s	#(scommand=R@scommand to set an option for(soption=RAs
option to set(s
set-value=RBsvalue of the option(RCRDsremove (unset) the value(
R;R<R=tdescriptionRR>R?R6R:RJ(((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pyRss
		(tdistutils.utilRRRtdistutils.errorsRRtsetuptools.extern.six.movesRt
setuptoolsRt__all__RtFalseRRR(((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pyt<module>s+'command/install_lib.py000064400000007400151733473660011050 0ustar00import os
import imp
from itertools import product, starmap
import distutils.command.install_lib as orig


class install_lib(orig.install_lib):
    """Don't add compiled flags to filenames of non-Python files"""

    def run(self):
        self.build()
        outfiles = self.install()
        if outfiles is not None:
            # always compile, in case we have any extension stubs to deal with
            self.byte_compile(outfiles)

    def get_exclusions(self):
        """
        Return a collections.Sized collections.Container of paths to be
        excluded for single_version_externally_managed installations.
        """
        all_packages = (
            pkg
            for ns_pkg in self._get_SVEM_NSPs()
            for pkg in self._all_packages(ns_pkg)
        )

        excl_specs = product(all_packages, self._gen_exclusion_paths())
        return set(starmap(self._exclude_pkg_path, excl_specs))

    def _exclude_pkg_path(self, pkg, exclusion_path):
        """
        Given a package name and exclusion path within that package,
        compute the full exclusion path.
        """
        parts = pkg.split('.') + [exclusion_path]
        return os.path.join(self.install_dir, *parts)

    @staticmethod
    def _all_packages(pkg_name):
        """
        >>> list(install_lib._all_packages('foo.bar.baz'))
        ['foo.bar.baz', 'foo.bar', 'foo']
        """
        while pkg_name:
            yield pkg_name
            pkg_name, sep, child = pkg_name.rpartition('.')

    def _get_SVEM_NSPs(self):
        """
        Get namespace packages (list) but only for
        single_version_externally_managed installations and empty otherwise.
        """
        # TODO: is it necessary to short-circuit here? i.e. what's the cost
        # if get_finalized_command is called even when namespace_packages is
        # False?
        if not self.distribution.namespace_packages:
            return []

        install_cmd = self.get_finalized_command('install')
        svem = install_cmd.single_version_externally_managed

        return self.distribution.namespace_packages if svem else []

    @staticmethod
    def _gen_exclusion_paths():
        """
        Generate file paths to be excluded for namespace packages (bytecode
        cache files).
        """
        # always exclude the package module itself
        yield '__init__.py'

        yield '__init__.pyc'
        yield '__init__.pyo'

        if not hasattr(imp, 'get_tag'):
            return

        base = os.path.join('__pycache__', '__init__.' + imp.get_tag())
        yield base + '.pyc'
        yield base + '.pyo'
        yield base + '.opt-1.pyc'
        yield base + '.opt-2.pyc'

    def copy_tree(
            self, infile, outfile,
            preserve_mode=1, preserve_times=1, preserve_symlinks=0, level=1
    ):
        assert preserve_mode and preserve_times and not preserve_symlinks
        exclude = self.get_exclusions()

        if not exclude:
            return orig.install_lib.copy_tree(self, infile, outfile)

        # Exclude namespace package __init__.py* files from the output

        from setuptools.archive_util import unpack_directory
        from distutils import log

        outfiles = []

        def pf(src, dst):
            if dst in exclude:
                log.warn("Skipping installation of %s (namespace package)",
                         dst)
                return False

            log.info("copying %s -> %s", src, os.path.dirname(dst))
            outfiles.append(dst)
            return dst

        unpack_directory(infile, outfile, pf)
        return outfiles

    def get_outputs(self):
        outputs = orig.install_lib.get_outputs(self)
        exclude = self.get_exclusions()
        if exclude:
            return [f for f in outputs if f not in exclude]
        return outputs
command/develop.pyo000064400000017334151733473660010400 0ustar00�
�fc@s�ddlmZddlmZddlmZmZddlZddlZddl	Z	ddl
mZddlm
Z
mZmZddlmZddlmZddlZd	ejefd
��YZdefd��YZdS(
i����(tconvert_path(tlog(tDistutilsErrortDistutilsOptionErrorN(tsix(tDistributiontPathMetadatatnormalize_path(teasy_install(t
namespacestdevelopcBs�eZdZdZejddgZejdgZeZ	d�Z
d�Zd	�Ze
d
��Zd�Zd�Zd
�Zd�ZRS(sSet up package for developments%install package in 'development mode't	uninstalltusUninstall this source packages	egg-path=s-Set the path to be used in the .egg-link filecCsA|jr)t|_|j�|j�n
|j�|j�dS(N(RtTruet
multi_versiontuninstall_linktuninstall_namespacestinstall_for_developmenttwarn_deprecated_options(tself((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pytruns		


cCs5d|_d|_tj|�d|_d|_dS(Nt.(tNoneRtegg_pathRtinitialize_optionst
setup_pathtalways_copy_from(R((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyR's
		
	cCs�|jd�}|jrCd}|j|jf}t||��n|jg|_tj|�|j�|j	�|j
jtjd��|jd}t
jj|j|�|_|j|_|jdkr�t
jj|j�|_nt|j�}tt
jj|j|j��}||kr9td|��nt|t|t
jj|j��d|j�|_|j|j|j|j�|_dS(Ntegg_infos-Please rename %r to %r before using 'develop's*.eggs	.egg-linksA--egg-path must be a relative path from the install directory to tproject_name(tget_finalized_commandtbroken_egg_infoRRtegg_nametargsRtfinalize_optionstexpand_basedirstexpand_dirst
package_indextscantglobtostpathtjointinstall_dirtegg_linktegg_baseRRtabspathRRRRtdistt_resolve_setup_pathR(RteittemplateR tegg_link_fnttargetR((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyR!.s<	




cCs�|jtjd�jd�}|tjkrGd|jd�d}nttjj|||��}|ttj�kr�t	d|ttj���n|S(s�
        Generate a path from egg_base back to '.' where the
        setup script resides and ensure that path points to the
        setup path from $install_dir/$egg_path.
        t/s../isGCan't get a consistent path to setup script from installation directory(
treplaceR'tseptrstriptcurdirtcountRR(R)R(R,R*Rt
path_to_setuptresolved((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyR/XscCs�tjr�t|jdt�r�|jddd�|jd�|jd�}t|j	�}|jdd|�|jd�|jddd�|jd�|jd�}||_
||j_t
||j�|j_n-|jd�|jddd�|jd�|j�tjr7|jtj�dt_n|j�tjd	|j|j�|js�t|jd
��"}|j|j
d|j�WdQXn|jd|j|j�dS(Ntuse_2to3tbuild_pytinplaceiRR,t	build_extisCreating %s (link to %s)tws
( RtPY3tgetattrtdistributiontFalsetreinitialize_commandtrun_commandRRt	build_libRR.tlocationRRt	_providertinstall_site_pyt
setuptoolstbootstrap_install_fromRRtinstall_namespacesRtinfoR+R,tdry_runtopentwriteRtprocess_distributiontno_deps(Rtbpy_cmdt
build_pathtei_cmdtf((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyRks4


	


	
	$cCs�tjj|j�r�tjd|j|j�t|j�}g|D]}|j�^qD}|j	�||j
g|j
|jgfkr�tjd|�dS|j
s�tj|j�q�n|j
s�|j|j�n|jjr�tjd�ndS(NsRemoving %s (link to %s)s$Link points to %s: uninstall aborteds5Note: you must uninstall or replace scripts manually!(R'R(texistsR+RRNR,RPR7tcloseRRtwarnROtunlinkt
update_pthR.RCtscripts(Rt
egg_link_filetlinetcontents((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyR�s
		cCs�||jk	rtj||�S|j|�x~|jjp>gD]j}tjjt	|��}tjj
|�}tj|��}|j
�}WdQX|j||||�q?WdS(N(R.Rtinstall_egg_scriptstinstall_wrapper_scriptsRCR]R'R(R-RtbasenametioRPtreadtinstall_script(RR.tscript_nametscript_pathtstrmtscript_text((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyRa�s
cCst|�}tj||�S(N(tVersionlessRequirementRRb(RR.((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyRb�s(RRsUninstall this source packageN(s	egg-path=Ns-Set the path to be used in the .egg-link file(t__name__t
__module__t__doc__tdescriptionRtuser_optionsRtboolean_optionsRDtcommand_consumes_argumentsRRR!tstaticmethodR/RRRaRb(((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyR
s
				*	/		RkcBs)eZdZd�Zd�Zd�ZRS(sz
    Adapt a pkg_resources.Distribution to simply return the project
    name as the 'requirement' so that scripts will work across
    multiple versions.

    >>> dist = Distribution(project_name='foo', version='1.0')
    >>> str(dist.as_requirement())
    'foo==1.0'
    >>> adapted_dist = VersionlessRequirement(dist)
    >>> str(adapted_dist.as_requirement())
    'foo'
    cCs
||_dS(N(t_VersionlessRequirement__dist(RR.((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyt__init__�scCst|j|�S(N(RBRt(Rtname((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyt__getattr__�scCs|jS(N(R(R((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pytas_requirement�s(RlRmRnRuRwRx(((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyRk�s		(tdistutils.utilRt	distutilsRtdistutils.errorsRRR'R&Rdtsetuptools.externRt
pkg_resourcesRRRtsetuptools.command.easy_installRRKR	tDevelopInstallerR
tobjectRk(((s>/usr/lib/python2.7/site-packages/setuptools/command/develop.pyt<module>s�command/bdist_rpm.pyc000064400000003572151733473660010710 0ustar00�
�fc@s/ddljjZdejfd��YZdS(i����Nt	bdist_rpmcBs eZdZd�Zd�ZRS(sf
    Override the default bdist_rpm behavior to do the following:

    1. Run egg_info to ensure the name and version are properly calculated.
    2. Always run 'install' using --single-version-externally-managed to
       disable eggs in RPM distributions.
    3. Replace dash with underscore in the version numbers for better RPM
       compatibility.
    cCs!|jd�tjj|�dS(Ntegg_info(trun_commandtorigRtrun(tself((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_rpm.pyRs
c	Cs�|jj�}|jdd�}tjj|�}d|}d|}g|D]<}|jdd�jdd�jdd	�j||�^qN}|j|�d
}d|}|j||�|S(Nt-t_s%define version sSource0: %{name}-%{version}.tars)Source0: %{name}-%{unmangled_version}.tarssetup.py install s5setup.py install --single-version-externally-managed s%setups&%setup -n %{name}-%{unmangled_version}is%define unmangled_version (tdistributiontget_versiontreplaceRRt_make_spec_filetindextinsert(	Rtversiont
rpmversiontspectline23tline24tlinet
insert_loctunmangled_version((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_rpm.pyRs


F
(t__name__t
__module__t__doc__RR(((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_rpm.pyRs		(tdistutils.command.bdist_rpmtcommandRR(((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_rpm.pyt<module>scommand/__init__.py000064400000001122151733473660010306 0ustar00__all__ = [
    'alias', 'bdist_egg', 'bdist_rpm', 'build_ext', 'build_py', 'develop',
    'easy_install', 'egg_info', 'install', 'install_lib', 'rotate', 'saveopts',
    'sdist', 'setopt', 'test', 'install_egg_info', 'install_scripts',
    'register', 'bdist_wininst', 'upload_docs', 'upload', 'build_clib',
    'dist_info',
]

from distutils.command.bdist import bdist
import sys

from setuptools.command import install_scripts

if 'egg' not in bdist.format_commands:
    bdist.format_command['egg'] = ('bdist_egg', "Python .egg file")
    bdist.format_commands.append('egg')

del bdist, sys
command/dist_info.pyo000064400000003407151733473660010714 0ustar00�
�fc@sLdZddlZddlmZddlmZdefd��YZdS(sD
Create a dist_info directory
As defined in the wheel specification
i����N(tCommand(tlogt	dist_infocBs2eZdZdgZd�Zd�Zd�ZRS(screate a .dist-info directorys	egg-base=tesLdirectory containing .egg-info directories (default: top of the source tree)cCs
d|_dS(N(tNonetegg_base(tself((s@/usr/lib/python2.7/site-packages/setuptools/command/dist_info.pytinitialize_optionsscCsdS(N((R((s@/usr/lib/python2.7/site-packages/setuptools/command/dist_info.pytfinalize_optionsscCs�|jd�}|j|_|j�|j�|jtd� d}tjdjt	j
j|���|jd�}|j|j|�dS(Ntegg_infos	.egg-infos
.dist-infos
creating '{}'tbdist_wheel(
tget_finalized_commandRRtrunR	tlenRtinfotformattostpathtabspathtegg2dist(RR	t
dist_info_dirR
((s@/usr/lib/python2.7/site-packages/setuptools/command/dist_info.pyRs

"(s	egg-base=RsLdirectory containing .egg-info directories (default: top of the source tree)(t__name__t
__module__tdescriptiontuser_optionsRRR(((s@/usr/lib/python2.7/site-packages/setuptools/command/dist_info.pyRs
			(t__doc__Rtdistutils.coreRt	distutilsRR(((s@/usr/lib/python2.7/site-packages/setuptools/command/dist_info.pyt<module>scommand/rotate.pyc000064400000005734151733473660010225 0ustar00�
�fc@s�ddlmZddlmZddlmZddlZddlZddlm	Z	ddl
mZdefd��YZdS(	i����(tconvert_path(tlog(tDistutilsOptionErrorN(tsix(tCommandtrotatecBsDeZdZdZdddgZgZd�Zd�Zd
�ZRS(sDelete older distributionss2delete older distributions, keeping N newest filessmatch=tmspatterns to match (required)s	dist-dir=tds%directory where the distributions areskeep=tks(number of matching distributions to keepcCsd|_d|_d|_dS(N(tNonetmatchtdist_dirtkeep(tself((s=/usr/lib/python2.7/site-packages/setuptools/command/rotate.pytinitialize_optionss		cCs�|jdkrtd��n|jdkr<td��nyt|j�|_Wntk
rqtd��nXt|jtj�r�g|jj	d�D]}t
|j��^q�|_n|jdd�dS(NsQMust specify one or more (comma-separated) match patterns (e.g. '.zip' or '.egg')s$Must specify number of files to keeps--keep must be an integert,tbdistR(RR(
R
R	RRtintt
ValueErrort
isinstanceRtstring_typestsplitRtstriptset_undefined_options(R
tp((s=/usr/lib/python2.7/site-packages/setuptools/command/rotate.pytfinalize_optionss
7cCs1|jd�ddlm}x
|jD]}|jj�d|}|tjj|j|��}g|D]}tjj	|�|f^qi}|j
�|j�tj
dt|�|�||j}x_|D]W\}}tj
d|�|js�tjj|�rtj|�q%tj|�q�q�Wq'WdS(Ntegg_infoi����(tglobt*s%d file(s) matching %ssDeleting %s(trun_commandRR
tdistributiontget_nametostpathtjoinRtgetmtimetsorttreverseRtinfotlenRtdry_runtisdirtshutiltrmtreetunlink(R
Rtpatterntfilestftt((s=/usr/lib/python2.7/site-packages/setuptools/command/rotate.pytrun/s 
+


	(smatch=Rspatterns to match (required)(s	dist-dir=Rs%directory where the distributions are(skeep=Rs(number of matching distributions to keep(	t__name__t
__module__t__doc__tdescriptiontuser_optionstboolean_optionsRRR1(((s=/usr/lib/python2.7/site-packages/setuptools/command/rotate.pyRs			(
tdistutils.utilRt	distutilsRtdistutils.errorsRR R*tsetuptools.externRt
setuptoolsRR(((s=/usr/lib/python2.7/site-packages/setuptools/command/rotate.pyt<module>scommand/build_py.pyo000064400000024653151733473670010554 0ustar00�
�fc@sddlmZddlmZddljjZddlZddlZddl	Z	ddl
Z
ddlZddl
Z
ddlmZddlmZmZmZyddlmZWn$ek
r�dd
d��YZnXd	ejefd
��YZdd�Zd�ZdS(i����(tglob(tconvert_pathN(tsix(tmaptfiltertfilterfalse(t	Mixin2to3RcBseZed�ZRS(cCsdS(s
do nothingN((tselftfilestdoctests((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pytrun_2to3t(t__name__t
__module__tTrueR
(((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyRstbuild_pycBs�eZdZd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d	�Zd
�Zd�Z
d�Zd
�Zd�Zed��ZRS(sXEnhanced 'build_py' command that includes data files with packages

    The data files are specified via a 'package_data' argument to 'setup()'.
    See 'setuptools.dist.Distribution' for more details.

    Also, this version of the 'build_py' command allows you to specify both
    'py_modules' and 'packages' in the same setup operation.
    cCsftjj|�|jj|_|jjp.i|_d|jkrP|jd=ng|_g|_dS(Nt
data_files(	torigRtfinalize_optionstdistributiontpackage_datatexclude_package_datat__dict__t_build_py__updated_filest_build_py__doctests_2to3(R((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR!s	
	cCs�|jr|jrdS|jr.|j�n|jrN|j�|j�n|j|jt�|j|jt�|j|j	t�|j
tjj
|dd��dS(s?Build modules, packages, and copy data files to build directoryNtinclude_bytecodei(t
py_modulestpackagest
build_modulestbuild_packagestbuild_package_dataR
RtFalseRRtbyte_compileRRtget_outputs(R((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pytrun+s	
	

cCs5|dkr"|j�|_|jStjj||�S(slazily compute data filesR(t_get_data_filesRRRt__getattr__(Rtattr((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR$?scCsqtjr-t|tj�r-|jd�}ntjj||||�\}}|rg|jj	|�n||fS(Nt.(
RtPY2t
isinstancetstring_typestsplitRRtbuild_moduleRtappend(Rtmoduletmodule_filetpackagetoutfiletcopied((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR+FscCs)|j�tt|j|jp"d��S(s?Generate list of '(package,src_dir,build_dir,filenames)' tuples((tanalyze_manifesttlistRt_get_pkg_data_filesR(R((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR#Ps
cCsx|j|�}tjj|jg|jd��}g|j||�D]}tjj||�^qG}||||fS(NR&(tget_package_dirtostpathtjoint	build_libR*tfind_data_filestrelpath(RR/tsrc_dirt	build_dirtfilet	filenames((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR4Us
%1cCs�|j|j||�}tt|�}tjj|�}ttj	j
|�}tj|jj|g�|�}|j
|||�S(s6Return filenames for package's data files in 'src_dir'(t_get_platform_patternsRRRt	itertoolstchaint
from_iterableRR6R7tisfiletmanifest_filestgettexclude_data_files(RR/R<tpatternstglobs_expandedt
globs_matchest
glob_filesR((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR:cs		c
Cs�x�|jD]�\}}}}x�|D]�}tjj||�}|jtjj|��tjj||�}|j||�\}}	tjj|�}|	r#||jj	kr#|j
j|�q#q#Wq
WdS(s$Copy data files into build directoryN(RR6R7R8tmkpathtdirnamet	copy_filetabspathRtconvert_2to3_doctestsRR,(
RR/R<R=R?tfilenamettargettsrcfiletoutfR1((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyRts
cCs\i|_}|jjsdSi}x0|jp2dD]}||t|j|��<q3W|jd�|jd�}x�|jj	D]�}t
jjt|��\}}d}|}	xU|r||kr||kr|}t
jj|�\}}
t
jj|
|�}q�W||kr|jd�r4||	kr4qn|j||g�j|�qqWdS(Ntegg_infos.py((RERtinclude_package_dataRtassert_relativeR5trun_commandtget_finalized_commandtfilelistRR6R7R*tNoneR8tendswitht
setdefaultR,(Rtmftsrc_dirsR/tei_cmdR7tdtftprevtoldftdf((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR2�s(

!cCsdS(N((R((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pytget_data_files�scCs�y|j|SWntk
r"nXtjj|||�}||j|<|s\|jjr`|Sx;|jjD])}||ks�|j|d�rmPqmqmW|Stj	|d��}|j
�}WdQXd|kr�tjj
d|f��n|S(s8Check namespace packages' __init__ for declare_namespaceR&trbNtdeclare_namespaces�Namespace package problem: %s is a namespace package, but its
__init__.py does not call declare_namespace()! Please fix it.
(See the setuptools manual under "Namespace Packages" for details.)
"(tpackages_checkedtKeyErrorRRt
check_packageRtnamespace_packagest
startswithtiotopentreadt	distutilsterrorstDistutilsError(RR/tpackage_dirtinit_pytpkgRbtcontents((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyRk�s&

	cCsi|_tjj|�dS(N(RiRRtinitialize_options(R((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyRx�s	cCsDtjj||�}|jjdk	r@tjj|jj|�S|S(N(	RRR5Rtsrc_rootR[R6R7R8(RR/tres((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR5�scs~t���|j|j||�}�fd�|D�}tjj|�}t|���fd��D�}tt|��S(s6Filter filenames for package's data files in 'src_dir'c3s!|]}tj�|�VqdS(N(tfnmatchR(t.0tpattern(R(s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pys	<genexpr>�sc3s!|]}|�kr|VqdS(N((R|tfn(tbad(s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pys	<genexpr>�s(R3R@RRARBRCtsett_unique_everseen(RR/R<RRHtmatch_groupstmatchestkeepers((RRs?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyRG�s	

cs>tj|jdg�|j|g��}�fd�|D�S(s�
        yield platform-specific path patterns (suitable for glob
        or fn_match) from a glob-based spec (such as
        self.package_data or self.exclude_package_data)
        matching package in src_dir.
        Rc3s*|] }tjj�t|��VqdS(N(R6R7R8R(R|R}(R<(s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pys	<genexpr>�s(RARBRF(tspecR/R<traw_patterns((R<s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR@�s
(RR
t__doc__RR"R$R+R#R4R:RR2RfRkRxR5RGtstaticmethodR@(((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyRs 	
			
				
						ccs�t�}|j}|dkrMxgt|j|�D]}||�|Vq1Wn;x8|D]0}||�}||krT||�|VqTqTWdS(sHList unique elements, preserving order. Remember all elements ever seen.N(R�taddR[Rt__contains__(titerabletkeytseentseen_addtelementtk((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR��s		


cCsOtjj|�s|Sddlm}tjd�j�|}||��dS(Ni����(tDistutilsSetupErrors�
        Error: setup script specifies an absolute path:

            %s

        setup() arguments must *always* be /-separated paths relative to the
        setup.py directory, *never* absolute paths.
        (R6R7tisabstdistutils.errorsR�ttextwraptdedenttlstrip(R7R�tmsg((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyRWs((Rtdistutils.utilRtdistutils.command.build_pytcommandRRR6R{R�RnR�RqRAtsetuptools.externRtsetuptools.extern.six.movesRRRtsetuptools.lib2to3_exRtImportErrorR[R�RW(((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyt<module>s"
�command/upload_docs.pyc000064400000017242151733473670011221 0ustar00�
�fc@s�dZddlmZddlmZddlmZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlmZddlmZmZddlmZd	d
lmZd�Zdefd
��YZdS(spupload_docs

Implements a Distutils 'upload_docs' subcommand (upload documentation to
PyPI's pythonhosted.org).
i����(tstandard_b64encode(tlog(tDistutilsOptionErrorN(tsix(thttp_clientturllib(titer_entry_pointsi(tuploadcCs%tjrdnd}|jd|�S(Ntsurrogateescapetstrictsutf-8(RtPY3tencode(tsterrors((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyt_encodestupload_docscBs�eZdZdZdddejfddgZejZd	�Zd
efgZ	d�Z
d�Zd
�Zd�Z
ed��Zed��Zd�ZRS(shttps://pypi.python.org/pypi/sUpload documentation to PyPIsrepository=trsurl of repository [default: %s]s
show-responses&display full response text from serversupload-dir=sdirectory to uploadcCs1|jdkr-xtdd�D]}tSWndS(Nsdistutils.commandstbuild_sphinx(t
upload_dirtNoneRtTrue(tselftep((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyt
has_sphinx/sRcCs#tj|�d|_d|_dS(N(Rtinitialize_optionsRRt
target_dir(R((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyR6s
	cCs�tj|�|jdkrs|j�rF|jd�}|j|_q�|jd�}tj	j
|jd�|_n|jd�|j|_d|j
kr�tjd�n|jd|j�dS(NRtbuildtdocsRspypi.python.orgs3Upload_docs command is deprecated. Use RTD instead.sUsing upload directory %s(Rtfinalize_optionsRRRtget_finalized_commandtbuilder_target_dirRtostpathtjoint
build_basetensure_dirnamet
repositoryRtwarntannounce(RRR((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyR;s

cCs�tj|d�}z�|j|j�x�tj|j�D]�\}}}||jkry|ryd}t||j��nxj|D]b}tjj||�}|t	|j�j
tjj�}	tjj|	|�}
|j||
�q�Wq8WWd|j
�XdS(Ntws'no files found in upload directory '%s'(tzipfiletZipFiletmkpathRRtwalkRR R!tlentlstriptseptwritetclose(Rtfilenametzip_filetroottdirstfilesttmpltnametfulltrelativetdest((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pytcreate_zipfileKs"
"cCs�x!|j�D]}|j|�q
Wtj�}|jjj�}tjj	|d|�}z|j
|�|j|�Wdtj
|�XdS(Ns%s.zip(tget_sub_commandstrun_commandttempfiletmkdtemptdistributiontmetadatatget_nameRR R!R;tupload_filetshutiltrmtree(Rtcmd_namettmp_dirR7R2((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pytrun[s
ccs�|\}}d|}t|t�s1|g}nx�|D]x}t|t�rl|d|d7}|d}nt|�}|Vt|�VdV|V|r8|ddkr8dVq8q8WdS(	Ns*
Content-Disposition: form-data; name="%s"s; filename="%s"iis

i����s
s
(t
isinstancetlistttupleR(titemtsep_boundarytkeytvaluesttitletvalue((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyt_build_partis


cCs�d}d|}|d}|df}tj|jd|�}t||j��}tjj|�}tj||�}	d|jd�}
dj	|	�|
fS(	s=
        Build up the MIME payload for the POST data
        s3--------------GHSKFJDLGDS7543FJKLFHRE75642756743254s
--s--s
RMs multipart/form-data; boundary=%stasciit(
t	functoolstpartialRRtmaptitemst	itertoolstchaint
from_iterabletdecodeR!(tclstdatatboundaryRMtend_boundaryt	end_itemstbuildertpart_groupstpartst
body_itemstcontent_type((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyt_build_multipart}s

		cCst|d��}|j�}WdQX|jj}idd6|j�d6tjj|�|fd6}t|j	d|j
�}t|�}tj
r�|jd�}nd|}|j|�\}}	d	|j}
|j|
tj�tjj|j�\}}}
}}}|r|r|s%t�|d
krCtj|�}n.|dkratj|�}ntd|��d
}yw|j�|jd|
�|	}|jd|�|jdtt|���|jd|�|j �|j!|�Wn0t"j#k
r }|jt|�tj$�dSX|j%�}|j&dkrhd|j&|j'f}
|j|
tj�n�|j&dkr�|j(d�}|dkr�d|j�}nd|}
|j|
tj�n)d|j&|j'f}
|j|
tj$�|j*rdd|j�ddfGHndS(Ntrbt
doc_uploads:actionR7tcontentt:RSsBasic sSubmitting documentation to %sthttpthttpssunsupported schema RTtPOSTsContent-typesContent-lengtht
Authorizationi�sServer response (%s): %si-tLocationshttps://pythonhosted.org/%s/sUpload successful. Visit %ssUpload failed (%s): %st-iK(+topentreadR@RARBRR tbasenameRtusernametpasswordRRR
R\RgR$R&RtINFORtparseturlparsetAssertionErrorRtHTTPConnectiontHTTPSConnectiontconnectt
putrequestt	putheadertstrR,t
endheaderstsendtsocketterrortERRORtgetresponsetstatustreasont	getheaderRt
show_response(RR1tfRjtmetaR^tcredentialstauthtbodytcttmsgtschematnetlocturltparamstqueryt	fragmentstconnRfteRtlocation((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyRC�sb
	

'


	N(s
show-responseNs&display full response text from server(supload-dir=Nsdirectory to upload(t__name__t
__module__tDEFAULT_REPOSITORYtdescriptionRRtuser_optionstboolean_optionsRtsub_commandsRRR;RHtstaticmethodRRtclassmethodRgRC(((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyRs"
							(t__doc__tbase64Rt	distutilsRtdistutils.errorsRRR�R(R>RDRYRUtsetuptools.externRtsetuptools.extern.six.movesRRt
pkg_resourcesRRRR(((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyt<module>s 	command/install_lib.pyc000064400000011406151733473670011215 0ustar00�
�fc@s]ddlZddlZddlmZmZddljjZdejfd��YZdS(i����N(tproducttstarmaptinstall_libcBsneZdZd�Zd�Zd�Zed��Zd�Zed��Z	ddddd	�Z
d
�ZRS(s9Don't add compiled flags to filenames of non-Python filescCs6|j�|j�}|dk	r2|j|�ndS(N(tbuildtinstalltNonetbyte_compile(tselftoutfiles((sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pytrun
s
csG�fd��j�D�}t|�j��}tt�j|��S(s�
        Return a collections.Sized collections.Container of paths to be
        excluded for single_version_externally_managed installations.
        c3s+|]!}�j|�D]}|VqqdS(N(t
_all_packages(t.0tns_pkgtpkg(R(sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pys	<genexpr>s(t_get_SVEM_NSPsRt_gen_exclusion_pathstsetRt_exclude_pkg_path(Rtall_packagest
excl_specs((RsB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pytget_exclusionsscCs,|jd�|g}tjj|j|�S(sw
        Given a package name and exclusion path within that package,
        compute the full exclusion path.
        t.(tsplittostpathtjointinstall_dir(RR
texclusion_pathtparts((sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pyRsccs.x'|r)|V|jd�\}}}qWdS(sn
        >>> list(install_lib._all_packages('foo.bar.baz'))
        ['foo.bar.baz', 'foo.bar', 'foo']
        RN(t
rpartition(tpkg_nametseptchild((sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pyR
's	cCs<|jjsgS|jd�}|j}|r8|jjSgS(s�
        Get namespace packages (list) but only for
        single_version_externally_managed installations and empty otherwise.
        R(tdistributiontnamespace_packagestget_finalized_commandt!single_version_externally_managed(Rtinstall_cmdtsvem((sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pyR1s
	ccsidVdVdVttd�s"dStjjddtj��}|dV|d	V|d
V|dVdS(sk
        Generate file paths to be excluded for namespace packages (bytecode
        cache files).
        s__init__.pys__init__.pycs__init__.pyotget_tagNt__pycache__s	__init__.s.pycs.pyos
.opt-1.pycs
.opt-2.pyc(thasattrtimpRRRR'(tbase((sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pyRAs			iic	s�|r|r|st�|j���sAtjj|||�Sddlm}ddlm�g����fd�}||||��S(Ni����(tunpack_directory(tlogcsP|�kr �jd|�tS�jd|tjj|���j|�|S(Ns/Skipping installation of %s (namespace package)scopying %s -> %s(twarntFalsetinfoRRtdirnametappend(tsrctdst(texcludeR-R(sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pytpfgs	
(	tAssertionErrorRtorigRt	copy_treetsetuptools.archive_utilR,t	distutilsR-(	Rtinfiletoutfilet
preserve_modetpreserve_timestpreserve_symlinkstlevelR,R6((R5R-RsB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pyR9Vs
cCsKtjj|�}|j�}|rGg|D]}||kr+|^q+S|S(N(R8Rtget_outputsR(RtoutputsR5tf((sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pyRBts
#(t__name__t
__module__t__doc__R	RRtstaticmethodR
RRR9RB(((sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pyRs			
	(	RR*t	itertoolsRRtdistutils.command.install_libtcommandRR8(((sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pyt<module>scommand/build_ext.pyo000064400000030357151733473670010722 0ustar00�
�fc@s%ddlZddlZddlZddlZddlmZddlmZddl	m
Z
ddlmZm
Z
ddlmZddlmZddlmZdd	lmZyddlmZed
�Wnek
r�eZnXe
d�ddlmZd
�ZeZeZdZ ej!dkr;e"ZnIej#dkr�y#ddl$Z$e%e$d�ZZWq�ek
r�q�Xnd�Z&d�Z'defd��YZes�ej#dkr�ddddddddddd�
Z)n-dZ ddddddddddd�
Z)d�Z*dS(i����N(t	build_ext(t	copy_file(tnew_compiler(tcustomize_compilertget_config_var(tDistutilsError(tlog(tLibrary(tsixsCython.Compiler.MaintLDSHARED(t_config_varscCsstjdkretj�}z,dtd<dtd<dtd<t|�Wdtj�tj|�Xn
t|�dS(Ntdarwins0gcc -Wl,-x -dynamiclib -undefined dynamic_lookupR	s -dynamiclibtCCSHAREDs.dylibtSO(tsystplatformt_CONFIG_VARStcopyRtcleartupdate(tcompilerttmp((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyt_customize_compiler_for_shlibs



tsharedRtnttRTLD_NOWcCstr
|SdS(Nt(t	have_rtld(ts((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyt<lambda>>RcCsNxGd�tj�D�D]/\}}}d|kr6|S|dkr|SqWdS(s;Return the file extension for an abi3-compliant Extension()css(|]}|dtjkr|VqdS(iN(timptC_EXTENSION(t.0R((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pys	<genexpr>Css.abi3s.pydN(Rtget_suffixes(tsuffixt_((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pytget_abi3_suffixAs
&RcBs�eZd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d	�Zd
�Zd�Z
ed�ZRS(
cCs@|jd}|_tj|�||_|r<|j�ndS(s;Build extensions in build directory, then copy if --inplaceiN(tinplacet
_build_exttruntcopy_extensions_to_source(tselftold_inplace((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR'Ks

	c
Cs�|jd�}x�|jD]�}|j|j�}|j|�}|jd�}dj|d �}|j|�}tj	j|tj	j
|��}tj	j|j|�}	t|	|d|j
d|j�|jr|j|p�tj|t�qqWdS(Ntbuild_pyt.i����tverbosetdry_run(tget_finalized_commandt
extensionstget_ext_fullnametnametget_ext_filenametsplittjointget_package_dirtostpathtbasenamet	build_libRR-R.t_needs_stubt
write_stubtcurdirtTrue(
R)R+texttfullnametfilenametmodpathtpackagetpackage_dirt
dest_filenametsrc_filename((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR(Ss
	cCstj||�}||jkr�|j|}tjoLt|d�oLt�}|r�td�}|t|� }|t�}nt	|t
�r�tjj
|�\}}|jj|t�Str�|jr�tjj|�\}}tjj|d|�Sn|S(Ntpy_limited_apit
EXT_SUFFIXsdl-(R&R3text_mapRtPY3tgetattrR$t_get_config_var_837tlent
isinstanceRR7R8tsplitexttshlib_compilertlibrary_filenametlibtypet	use_stubst_links_to_dynamicR4R5(R)R@RAR?tuse_abi3tso_exttfntd((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR3is"
		cCs,tj|�d|_g|_i|_dS(N(R&tinitialize_optionstNoneRPtshlibsRI(R)((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyRY~s
		cCs�tj|�|jpg|_|j|j�g|jD]}t|t�r9|^q9|_|jrs|j�nx&|jD]}|j|j	�|_
q}Wx#|jD]}|j
}||j|<||j|jd�d<|jr�|j
|�p�t}|otot|t�}||_||_|j|�}|_tjjtjj|j|��}|r�||jkr�|jj|�n|r�tr�tj|jkr�|jjtj�q�q�WdS(NR,i����(R&tfinalize_optionsR0tcheck_extensions_listRNRR[tsetup_shlib_compilerR1R2t
_full_nameRIR4tlinks_to_dynamictFalseRSRTR;R3t
_file_nameR7R8tdirnameR5R:tlibrary_dirstappendR=truntime_library_dirs(R)R?R@tltdtnsRAtlibdir((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR\�s.
	
	
		$cCsdtd|jd|jd|j�}|_t|�|jdk	rW|j|j�n|j	dk	r�x*|j	D]\}}|j
||�qpWn|jdk	r�x!|jD]}|j|�q�Wn|j
dk	r�|j|j
�n|jdk	r
|j|j�n|jdk	r,|j|j�n|jdk	rN|j|j�ntj|�|_dS(NRR.tforce(RRR.RjRPRtinclude_dirsRZtset_include_dirstdefinetdefine_macrotundeftundefine_macrot	librariest
set_librariesRdtset_library_dirstrpathtset_runtime_library_dirstlink_objectstset_link_objectstlink_shared_objectt__get__(R)RR2tvaluetmacro((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR^�s(%
cCs&t|t�r|jStj||�S(N(RNRtexport_symbolsR&tget_export_symbols(R)R?((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR}�scCs�|j�|j}z`t|t�r4|j|_ntj||�|jrr|jd�j	}|j
||�nWd||_XdS(NR+(t_convert_pyx_sources_to_langRRNRRPR&tbuild_extensionR;R/R:R<(R)R?t	_compilertcmd((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR�s
		csntjg|jD]}|j^q��dj|jjd�d dg��t��fd�|jD��S(s?Return true if 'ext' links to a dynamic lib in the same packageR,i����Rc3s|]}�|�kVqdS(N((R tlibname(tlibnamestpkg(s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pys	<genexpr>�s(tdicttfromkeysR[R_R5R4tanyRq(R)R?tlib((R�R�s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR`�s(&cCstj|�|j�S(N(R&tget_outputst_build_ext__get_stubs_outputs(R)((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR��scsE�fd��jD�}tj|�j��}td�|D��S(Nc3s<|]2}|jrtjj�j|jjd��VqdS(R,N(R;R7R8R5R:R_R4(R R?(R)(s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pys	<genexpr>�scss|]\}}||VqdS(N((R tbasetfnext((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pys	<genexpr>�s(R0t	itertoolstproductt!_build_ext__get_output_extensionstlist(R)tns_ext_basestpairs((R)s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyt__get_stubs_outputs�s
ccs(dVdV|jd�jr$dVndS(Ns.pys.pycR+s.pyo(R/toptimize(R)((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyt__get_output_extensions�scCs�tjd|j|�tjj||jjd��d}|rftjj|�rft|d��n|j	st
|d�}|jdjddd	td
�dtjj
|j�dd
dtd�dddtd�ddtd�dddg��|j�n|r�ddlm}||gdddtd|j	�|jd �j}|dkr�||gd|dtd|j	�ntjj|�r�|j	r�tj|�q�ndS(!Ns writing stub loader for %s to %sR,s.pys already exists! Please delete.tws
sdef __bootstrap__():s-   global __bootstrap__, __file__, __loader__s%   import sys, os, pkg_resources, imps, dls:   __file__ = pkg_resources.resource_filename(__name__,%r)s   del __bootstrap__s    if '__loader__' in globals():s       del __loader__s#   old_flags = sys.getdlopenflags()s   old_dir = os.getcwd()s   try:s(     os.chdir(os.path.dirname(__file__))s$     sys.setdlopenflags(dl.RTLD_NOW)s(     imp.load_dynamic(__name__,__file__)s   finally:s"     sys.setdlopenflags(old_flags)s     os.chdir(old_dir)s__bootstrap__()Ri����(tbyte_compileR�iRjR.tinstall_lib(RtinfoR_R7R8R5R4texistsRR.topentwritetif_dlR9Rbtclosetdistutils.utilR�R>R/R�tunlink(R)t
output_dirR?tcompilet	stub_filetfR�R�((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR<�sP	
			

(t__name__t
__module__R'R(R3RYR\R^R}RR`R�R�R�RaR<(((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyRJs								
					ic

Cs8|j|j|||||||||	|
||�
dS(N(tlinktSHARED_LIBRARY(
R)tobjectstoutput_libnameR�RqRdRfR|tdebugt
extra_preargstextra_postargst
build_tempttarget_lang((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyRxs
tstaticc
Csrtjj|�\}}
tjj|
�\}}|jd�jd�rU|d}n|j|||||�dS(NtxR�i(R7R8R4RORQt
startswithtcreate_static_lib(R)R�R�R�RqRdRfR|R�R�R�R�R�RAR9R?((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyRx,s
cCs"tjdkrd}nt|�S(s�
    In https://github.com/pypa/setuptools/pull/837, we discovered
    Python 3.3.0 exposes the extension suffix under the name 'SO'.
    iiR
(iii(Rtversion_infoR(R2((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyRLDs	(+R7RR�Rtdistutils.command.build_extRt
_du_build_exttdistutils.file_utilRtdistutils.ccompilerRtdistutils.sysconfigRRtdistutils.errorsRt	distutilsRtsetuptools.extensionRtsetuptools.externRtCython.Distutils.build_extR&t
__import__tImportErrorR
RRRaRRSRRRR>R2tdlthasattrR�R$RZRxRL(((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyt<module>sX


		
			�			command/build_ext.pyc000064400000030433151733473670010701 0ustar00�
�fc@s%ddlZddlZddlZddlZddlmZddlmZddl	m
Z
ddlmZm
Z
ddlmZddlmZddlmZdd	lmZyddlmZed
�Wnek
r�eZnXe
d�ddlmZd
�ZeZeZdZ ej!dkr;e"ZnIej#dkr�y#ddl$Z$e%e$d�ZZWq�ek
r�q�Xnd�Z&d�Z'defd��YZes�ej#dkr�ddddddddddd�
Z)n-dZ ddddddddddd�
Z)d�Z*dS(i����N(t	build_ext(t	copy_file(tnew_compiler(tcustomize_compilertget_config_var(tDistutilsError(tlog(tLibrary(tsixsCython.Compiler.MaintLDSHARED(t_config_varscCsstjdkretj�}z,dtd<dtd<dtd<t|�Wdtj�tj|�Xn
t|�dS(Ntdarwins0gcc -Wl,-x -dynamiclib -undefined dynamic_lookupR	s -dynamiclibtCCSHAREDs.dylibtSO(tsystplatformt_CONFIG_VARStcopyRtcleartupdate(tcompilerttmp((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyt_customize_compiler_for_shlibs



tsharedRtnttRTLD_NOWcCstr
|SdS(Nt(t	have_rtld(ts((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyt<lambda>>RcCsNxGd�tj�D�D]/\}}}d|kr6|S|dkr|SqWdS(s;Return the file extension for an abi3-compliant Extension()css(|]}|dtjkr|VqdS(iN(timptC_EXTENSION(t.0R((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pys	<genexpr>Css.abi3s.pydN(Rtget_suffixes(tsuffixt_((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pytget_abi3_suffixAs
&RcBs�eZd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d	�Zd
�Zd�Z
ed�ZRS(
cCs@|jd}|_tj|�||_|r<|j�ndS(s;Build extensions in build directory, then copy if --inplaceiN(tinplacet
_build_exttruntcopy_extensions_to_source(tselftold_inplace((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR'Ks

	c
Cs�|jd�}x�|jD]�}|j|j�}|j|�}|jd�}dj|d �}|j|�}tj	j|tj	j
|��}tj	j|j|�}	t|	|d|j
d|j�|jr|j|p�tj|t�qqWdS(Ntbuild_pyt.i����tverbosetdry_run(tget_finalized_commandt
extensionstget_ext_fullnametnametget_ext_filenametsplittjointget_package_dirtostpathtbasenamet	build_libRR-R.t_needs_stubt
write_stubtcurdirtTrue(
R)R+texttfullnametfilenametmodpathtpackagetpackage_dirt
dest_filenametsrc_filename((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR(Ss
	cCstj||�}||jkr�|j|}tjoLt|d�oLt�}|r�td�}|t|� }|t�}nt	|t
�r�tjj
|�\}}|jj|t�Str�|jr�tjj|�\}}tjj|d|�Sn|S(Ntpy_limited_apit
EXT_SUFFIXsdl-(R&R3text_mapRtPY3tgetattrR$t_get_config_var_837tlent
isinstanceRR7R8tsplitexttshlib_compilertlibrary_filenametlibtypet	use_stubst_links_to_dynamicR4R5(R)R@RAR?tuse_abi3tso_exttfntd((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR3is"
		cCs,tj|�d|_g|_i|_dS(N(R&tinitialize_optionstNoneRPtshlibsRI(R)((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyRY~s
		cCs�tj|�|jpg|_|j|j�g|jD]}t|t�r9|^q9|_|jrs|j�nx&|jD]}|j|j	�|_
q}Wx#|jD]}|j
}||j|<||j|jd�d<|jr�|j
|�p�t}|otot|t�}||_||_|j|�}|_tjjtjj|j|��}|r�||jkr�|jj|�n|r�tr�tj|jkr�|jjtj�q�q�WdS(NR,i����(R&tfinalize_optionsR0tcheck_extensions_listRNRR[tsetup_shlib_compilerR1R2t
_full_nameRIR4tlinks_to_dynamictFalseRSRTR;R3t
_file_nameR7R8tdirnameR5R:tlibrary_dirstappendR=truntime_library_dirs(R)R?R@tltdtnsRAtlibdir((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR\�s.
	
	
		$cCsdtd|jd|jd|j�}|_t|�|jdk	rW|j|j�n|j	dk	r�x*|j	D]\}}|j
||�qpWn|jdk	r�x!|jD]}|j|�q�Wn|j
dk	r�|j|j
�n|jdk	r
|j|j�n|jdk	r,|j|j�n|jdk	rN|j|j�ntj|�|_dS(NRR.tforce(RRR.RjRPRtinclude_dirsRZtset_include_dirstdefinetdefine_macrotundeftundefine_macrot	librariest
set_librariesRdtset_library_dirstrpathtset_runtime_library_dirstlink_objectstset_link_objectstlink_shared_objectt__get__(R)RR2tvaluetmacro((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR^�s(%
cCs&t|t�r|jStj||�S(N(RNRtexport_symbolsR&tget_export_symbols(R)R?((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR}�scCs�|j�|j}z`t|t�r4|j|_ntj||�|jrr|jd�j	}|j
||�nWd||_XdS(NR+(t_convert_pyx_sources_to_langRRNRRPR&tbuild_extensionR;R/R:R<(R)R?t	_compilertcmd((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR�s
		csntjg|jD]}|j^q��dj|jjd�d dg��t��fd�|jD��S(s?Return true if 'ext' links to a dynamic lib in the same packageR,i����Rc3s|]}�|�kVqdS(N((R tlibname(tlibnamestpkg(s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pys	<genexpr>�s(tdicttfromkeysR[R_R5R4tanyRq(R)R?tlib((R�R�s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR`�s(&cCstj|�|j�S(N(R&tget_outputst_build_ext__get_stubs_outputs(R)((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR��scsE�fd��jD�}tj|�j��}td�|D��S(Nc3s<|]2}|jrtjj�j|jjd��VqdS(R,N(R;R7R8R5R:R_R4(R R?(R)(s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pys	<genexpr>�scss|]\}}||VqdS(N((R tbasetfnext((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pys	<genexpr>�s(R0t	itertoolstproductt!_build_ext__get_output_extensionstlist(R)tns_ext_basestpairs((R)s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyt__get_stubs_outputs�s
ccs(dVdV|jd�jr$dVndS(Ns.pys.pycR+s.pyo(R/toptimize(R)((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyt__get_output_extensions�scCs�tjd|j|�tjj||jjd��d}|rftjj|�rft|d��n|j	st
|d�}|jdjddd	td
�dtjj
|j�dd
dtd�dddtd�ddtd�dddg��|j�n|r�ddlm}||gdddtd|j	�|jd �j}|dkr�||gd|dtd|j	�ntjj|�r�|j	r�tj|�q�ndS(!Ns writing stub loader for %s to %sR,s.pys already exists! Please delete.tws
sdef __bootstrap__():s-   global __bootstrap__, __file__, __loader__s%   import sys, os, pkg_resources, imps, dls:   __file__ = pkg_resources.resource_filename(__name__,%r)s   del __bootstrap__s    if '__loader__' in globals():s       del __loader__s#   old_flags = sys.getdlopenflags()s   old_dir = os.getcwd()s   try:s(     os.chdir(os.path.dirname(__file__))s$     sys.setdlopenflags(dl.RTLD_NOW)s(     imp.load_dynamic(__name__,__file__)s   finally:s"     sys.setdlopenflags(old_flags)s     os.chdir(old_dir)s__bootstrap__()Ri����(tbyte_compileR�iRjR.tinstall_lib(RtinfoR_R7R8R5R4texistsRR.topentwritetif_dlR9Rbtclosetdistutils.utilR�R>R/R�tunlink(R)t
output_dirR?tcompilet	stub_filetfR�R�((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyR<�sP	
			

(t__name__t
__module__R'R(R3RYR\R^R}RR`R�R�R�RaR<(((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyRJs								
					ic

Cs8|j|j|||||||||	|
||�
dS(N(tlinktSHARED_LIBRARY(
R)tobjectstoutput_libnameR�RqRdRfR|tdebugt
extra_preargstextra_postargst
build_tempttarget_lang((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyRxs
tstaticc
Cs�|dkst�tjj|�\}}
tjj|
�\}}|jd�jd�rg|d}n|j|||||�dS(NtxR�i(	RZtAssertionErrorR7R8R4RORQt
startswithtcreate_static_lib(R)R�R�R�RqRdRfR|R�R�R�R�R�RAR9R?((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyRx,s
cCs"tjdkrd}nt|�S(s�
    In https://github.com/pypa/setuptools/pull/837, we discovered
    Python 3.3.0 exposes the extension suffix under the name 'SO'.
    iiR
(iii(Rtversion_infoR(R2((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyRLDs	(+R7RR�Rtdistutils.command.build_extRt
_du_build_exttdistutils.file_utilRtdistutils.ccompilerRtdistutils.sysconfigRRtdistutils.errorsRt	distutilsRtsetuptools.extensionRtsetuptools.externRtCython.Distutils.build_extR&t
__import__tImportErrorR
RRRaRRSRRRR>R2tdlthasattrR�R$RZRxRL(((s@/usr/lib/python2.7/site-packages/setuptools/command/build_ext.pyt<module>sX


		
			�			command/bdist_egg.pyo000064400000043724151733473670010674 0ustar00�
�fc@s�dZddlmZddlmZmZddlmZddlm	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlmZddlmZmZmZdd	lmZdd
lmZddlmZy#ddlmZmZd
�ZWn0ek
r9ddlm Z mZd�ZnXd�Z!d�Z"d�Z#defd��YZ$e%j&dj'��Z(d�Z)d�Z*d�Z+ide,6de-6Z.d�Z/d�Z0d�Z1ddd d!gZ2d"d"e,d#d$�Z3dS(%s6setuptools.command.bdist_egg

Build .egg distributionsi����(tDistutilsSetupError(tremove_treetmkpath(tlog(tCodeTypeN(tsix(tget_build_platformtDistributiontensure_directory(t
EntryPoint(tLibrary(tCommand(tget_pathtget_python_versioncCs
td�S(Ntpurelib(R(((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyt_get_purelibs(tget_python_libR
cCs
tt�S(N(RtFalse(((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRscCsEd|kr%tjj|�d}n|jd�rA|d }n|S(Nt.itmodulei����(tostpathtsplitexttendswith(tfilename((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pytstrip_module#s

ccsIxBtj|�D]1\}}}|j�|j�|||fVqWdS(sbDo os.walk in a reproducible way,
    independent of indeterministic filesystem readdir order
    N(Rtwalktsort(tdirtbasetdirstfiles((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pytsorted_walk+s

cCsBtjd�j�}t|d��}|j||�WdQXdS(NsR
        def __bootstrap__():
            global __bootstrap__, __loader__, __file__
            import sys, pkg_resources, imp
            __file__ = pkg_resources.resource_filename(__name__, %r)
            __loader__ = None; del __bootstrap__, __loader__
            imp.load_dynamic(__name__,__file__)
        __bootstrap__()
        tw(ttextwraptdedenttlstriptopentwrite(tresourcetpyfilet_stub_templatetf((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyt
write_stub5st	bdist_eggcBs�eZdZdddde�fdd	d
ddfd d!gZd	ddgZd�Zd�Zd�Z	d�Z
d�Zd�Zd�Z
d�Zd�Zd�Zd�ZRS("screate an "egg" distributions
bdist-dir=tbs1temporary directory for creating the distributions
plat-name=tps;platform name to embed in generated filenames (default: %s)sexclude-source-filess+remove all .py files from the generated eggs	keep-temptks/keep the pseudo-installation tree around after s!creating the distribution archives	dist-dir=tds-directory to put final built distributions ins
skip-builds2skip rebuilding everything (for testing/debugging)cCsCd|_d|_d|_d|_d|_d|_d|_dS(Ni(tNonet	bdist_dirt	plat_namet	keep_temptdist_dirt
skip_buildt
egg_outputtexclude_source_files(tself((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pytinitialize_optionsZs						cCs�|jd�}|_|j|_|jdkr^|jd�j}tjj|d�|_n|j	dkr|t
�|_	n|jdd�|jdkr�t
dd|j|jt�|jj�o�|j	�j�}tjj|j|d�|_ndS(Ntegg_infotbdistteggR5s.egg(R5R5(tget_finalized_commandtei_cmdR;R2R1t
bdist_baseRRtjoinR3Rtset_undefined_optionsR7Rtegg_nametegg_versionR
tdistributionthas_ext_modulesR5(R9R?R@tbasename((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pytfinalize_optionscs!cCs_|j|jd�_tjjtjjt���}|jj	g}|j_	x�|D]�}t
|t�rt|�dkrtjj
|d�rtjj|d�}tjj|�}||ks�|j|tj�r|t|�d|df}qqn|jj	j|�qVWz0tjd|j�|jddddd�Wd||j_	XdS(	Ntinstalliiisinstalling package data to %stinstall_datatforcetroot(R2R>tinstall_libRRtnormcasetrealpathRREt
data_filest
isinstancettupletlentisabst
startswithtseptappendRtinfotcall_commandR1(R9t
site_packagestoldtitemROt
normalized((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pytdo_install_data{s !
!'cCs
|jgS(N(R7(R9((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pytget_outputs�scKsmx!tD]}|j||j�qW|jd|j�|jd|j�|j||�}|j|�|S(s8Invoke reinitialized command `cmdname` with keyword argsR6tdry_run(tINSTALL_DIRECTORY_ATTRSt
setdefaultR2R6R`treinitialize_commandtrun_command(R9tcmdnametkwtdirnametcmd((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRY�s

c	Cs�|jd�tjd|j�|jd�}|j}d|_|jj�rj|j	rj|jd�n|j
ddd�}||_|j�\}}g|_g}x�t
|�D]�\}}tjj|�\}	}
tjj|jt|	�d�}|jj|�tjd	|�|jsAttjj|�|�n|j|�|jtjd
�||<q�W|r�|j|�n|jjr�|j�n|j}tjj|d�}
|j|
�|jjrtjj|
d�}tjd
|�|j
dd|dd�n|j|
�tjj|
d�}|r�tjd|�|js�t|�t |d�}|j!dj|��|j!d�|j"�q�n>tjj#|�r�tjd|�|js�tj$|�q�nt%tjj|d�|j&��tjj'tjj|j(d��r3tj)d�n|j*rI|j+�nt,|j-|d|j.d|jd|j/��|j0s�t1|jd|j�nt2|jdg�jdt3�|j-f�dS(NR;sinstalling library code to %sRIt
build_clibRMtwarn_diris.pyscreating stub loader for %st/sEGG-INFOtscriptssinstalling scripts to %stinstall_scriptstinstall_dirtno_episnative_libs.txts
writing %stwts
sremoving %ssdepends.txtsxWARNING: 'depends.txt' will not be used by setuptools 0.6!
Use the install_requires/extras_require setup() args instead.tverboseR`tmodet
dist_filesR,(4RdRRXR2R>RLR1REthas_c_librariesR6RYtget_ext_outputststubst	enumerateRRRRARRWR`R+RGtreplaceRVtbyte_compileRPR^RRltcopy_metadata_toRR%R&tclosetisfiletunlinktwrite_safety_flagtzip_safetexistsR;twarnR8tzap_pyfilestmake_zipfileR7Rqt
gen_headerR4RtgetattrR
(R9tinstcmdtold_rootRhtall_outputstext_outputst
to_compileR.text_nameRtextR(tarchive_rootR;t
script_dirtnative_libst	libs_file((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pytrun�sz
				
	

	


	

	$
	
	c
Cs-tjd�xt|j�D]\}}}x�|D]�}tjj||�}|jd�r}tjd|�tj	|�n|jd�r3|}d}t
j||�}tjj|tj|j
d�d�}	tjd||	f�ytj|	�Wntk
r
nXtj||	�q3q3WqWdS(	Ns+Removing .py files from temporary directorys.pysDeleting %st__pycache__s#(?P<name>.+)\.(?P<magic>[^.]+)\.pyctnames.pycsRenaming file from [%s] to [%s](RRXtwalk_eggR2RRRARtdebugR}tretmatchtpardirtgrouptremovetOSErrortrename(
R9RRRR�Rtpath_oldtpatterntmtpath_new((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyR��s*

	
cCsEt|jdd�}|dk	r%|Stjd�t|j|j�S(NRs4zip_safe flag not set; analyzing archive contents...(R�RER1RR�tanalyze_eggR2Rv(R9tsafe((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRs

c
Cs!tj|jjpd�}|jdi�jd�}|dkrFdS|jsY|jrotd|f��nt	j
d }|j}dj|j�}|jd}t
jj|j�}d	t�}|jstt
jj|j�d
|j�t|jd�}	|	j|�|	j�ndS(Ntssetuptools.installationteggsecutableR!sGeggsecutable entry point (%r) cannot have 'extras' or refer to a moduleiRisH#!/bin/sh
if [ `basename $0` = "%(basename)s" ]
then exec python%(pyver)s -c "import sys, os; sys.path.insert(0, os.path.abspath('$0')); from %(pkg)s import %(base)s; sys.exit(%(full)s())" "$@"
else
  echo $0 is not the correct name for this egg file.
  echo Please rename it back to %(basename)s and try again.
  exec false
fi
R`ta(R	t	parse_mapREtentry_pointstgetR1tattrstextrasRtsystversiontmodule_nameRARRRGR7tlocalsR`RRgR%R&R{(
R9tepmteptpyvertpkgtfullRRGtheaderR*((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyR�s*
	

	"

cCs�tjj|j�}tjj|d�}xb|jjjD]Q}|j|�r:tjj||t	|��}t
|�|j||�q:q:WdS(s*Copy metadata (egg info) to the target_dirR�N(RRtnormpathR;RAR?tfilelistRRURSRt	copy_file(R9t
target_dirt
norm_egg_infotprefixRttarget((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRz:s
cCs�g}g}id|j6}x�t|j�D]�\}}}xH|D]@}tjj|�dj�tkrB|j|||�qBqBWx3|D]+}|||d|tjj||�<q�Wq,W|j	j
�r}|jd�}x�|jD]�}	t
|	t�rq�n|j|	j�}
|j|
�}tjj|�jd�s�tjjtjj|j|��rv|j|�qvq�q�Wn||fS(sAGet a list of relative paths to C extensions in the output distroR�iRkt	build_extsdl-(R2R RRRtlowertNATIVE_EXTENSIONSRWRARERFR>t
extensionsRQR
tget_ext_fullnameR�tget_ext_filenameRGRUR�(R9R�R�tpathsRRRRt	build_cmdR�tfullname((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRuFs(
"
-$(s
bdist-dir=R-s1temporary directory for creating the distributionN(sexclude-source-filesNs+remove all .py files from the generated egg(s	dist-dir=R0s-directory to put final built distributions in(s
skip-buildNs2skip rebuilding everything (for testing/debugging)(t__name__t
__module__tdescriptionRR1tuser_optionstboolean_optionsR:RHR^R_RYR�R�RR�RzRu(((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyR,Cs4	
							
	Q			'	s.dll .so .dylib .pydccset|�}t|�\}}}d|kr=|jd�n|||fVx|D]}|VqRWdS(s@Walk an unpacked egg's contents, skipping the metadata directorysEGG-INFON(R tnextR�(tegg_dirtwalkerRRRtbdf((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyR�fs
c	Cs�xBtj�D]4\}}tjjtjj|d|��r
|Sq
Wt�sRtSt}x�t	|�D]�\}}}xn|D]f}|j
d�s{|j
d�r�q{q{|j
d�s�|j
d�r{t||||�o�|}q{q{WqeW|S(NsEGG-INFOs.pys.pyws.pycs.pyo(tsafety_flagstitemsRRR�RAtcan_scanRtTrueR�Rtscan_module(	R�RvtflagtfnR�RRRR�((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyR�qs$	
&cCs�x�tj�D]�\}}tjj||�}tjj|�rq|dks^t|�|kr�tj|�q�q
|dk	r
t|�|kr
t	|d�}|j
d�|j�q
q
WdS(NRps
(R�R�RRRAR�R1tboolR}R%R&R{(R�R�R�R�R*((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyR~�s
szip-safesnot-zip-safec
Cs�tjj||�}|d |kr)tS|t|�djtjd�}||r[dp^dtjj|�d}tj	dkr�d}ntj	dkr�d	}nd
}t
|d�}|j|�tj
|�}	|j�t}
tjt|	��}x<dd
gD].}||kr	tjd||�t}
q	q	Wd|kr�xZdddddddddddgD].}||krotjd||�t}
qoqoWn|
S(s;Check whether module possibly uses unsafe-for-zipfile stuffi����iRR�iiiiiitrbt__file__t__path__s%s: module references %stinspectt	getsourcet
getabsfilet
getsourcefiletgetfilegetsourcelinest
findsourcetgetcommentstgetframeinfotgetinnerframestgetouterframeststackttraces"%s: module MAY be using inspect.%s(ii(ii(RRRAR�RSRxRVRR�tversion_infoR%treadtmarshaltloadR{tdicttfromkeystiter_symbolsRR�R(
R�RR�RvRR�RtskipR*tcodeR�tsymbolstbad((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyR��s:#*		


	ccsyx|jD]}|Vq
WxY|jD]N}t|tj�rC|Vq#t|t�r#xt|�D]}|Vq_Wq#q#WdS(sBYield names and strings used by `code` and its nested code objectsN(tco_namest	co_constsRQRtstring_typesRR�(R�R�tconst((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyR��s	cCsDtjjd�r&tjdkr&tStjd�tjd�dS(Ntjavatclis1Unable to analyze compiled code on this platform.sfPlease ask the author to include a 'zip_safe' setting (either True or False) in the package's setup.py(R�tplatformRUR�RR�(((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyR��s"
RMRnRJtinstall_baseiR!c
s�ddl}ttjj|�d��tjd|����fd�}|r\|jn|j}�s�|j	||d|�}	x-t
��D]\}
}}||	|
|�q�W|	j�n0x-t
��D]\}
}}|d|
|�q�W|S(sqCreate a zip file from all the files under 'base_dir'.  The output
    zip file will be named 'base_dir' + ".zip".  Uses either the "zipfile"
    Python module (if available) or the InfoZIP "zip" utility (if installed
    and found on the default search path).  If neither tool is available,
    raises DistutilsExecError.  Returns the name of the output zip file.
    i����NR`s#creating '%s' and adding '%s' to itcs�x�|D]y}tjjtjj||��}tjj|�r|t��d}�sm|j||�ntjd|�qqWdS(Nisadding '%s'(	RRR�RAR|RSR&RR�(tzRgtnamesR�RR.(tbase_dirR`(s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pytvisit�s
!tcompression(
tzipfileRRRRgRRXtZIP_DEFLATEDt
ZIP_STOREDtZipFileR R{R1(
tzip_filenameR�RqR`tcompressRrR�R�R�R�RgRR((R�R`s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyR��s	
(4t__doc__tdistutils.errorsRtdistutils.dir_utilRRt	distutilsRttypesRR�RR�R"R�tsetuptools.externRt
pkg_resourcesRRRR	tsetuptools.extensionR
t
setuptoolsRt	sysconfigRR
RtImportErrortdistutils.sysconfigRRR R+R,R�R�tsplitR�R�R�R~R�RR�R�R�R�RaR�(((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyt<module>sL


		
	�!			

	$		
	command/install.py000064400000011113151733473670010217 0ustar00from distutils.errors import DistutilsArgError
import inspect
import glob
import warnings
import platform
import distutils.command.install as orig

import setuptools

# Prior to numpy 1.9, NumPy relies on the '_install' name, so provide it for
# now. See https://github.com/pypa/setuptools/issues/199/
_install = orig.install


class install(orig.install):
    """Use easy_install to install the package, w/dependencies"""

    user_options = orig.install.user_options + [
        ('old-and-unmanageable', None, "Try not to use this!"),
        ('single-version-externally-managed', None,
         "used by system package builders to create 'flat' eggs"),
    ]
    boolean_options = orig.install.boolean_options + [
        'old-and-unmanageable', 'single-version-externally-managed',
    ]
    new_commands = [
        ('install_egg_info', lambda self: True),
        ('install_scripts', lambda self: True),
    ]
    _nc = dict(new_commands)

    def initialize_options(self):
        orig.install.initialize_options(self)
        self.old_and_unmanageable = None
        self.single_version_externally_managed = None

    def finalize_options(self):
        orig.install.finalize_options(self)
        if self.root:
            self.single_version_externally_managed = True
        elif self.single_version_externally_managed:
            if not self.root and not self.record:
                raise DistutilsArgError(
                    "You must specify --record or --root when building system"
                    " packages"
                )

    def handle_extra_path(self):
        if self.root or self.single_version_externally_managed:
            # explicit backward-compatibility mode, allow extra_path to work
            return orig.install.handle_extra_path(self)

        # Ignore extra_path when installing an egg (or being run by another
        # command without --root or --single-version-externally-managed
        self.path_file = None
        self.extra_dirs = ''

    def run(self):
        # Explicit request for old-style install?  Just do it
        if self.old_and_unmanageable or self.single_version_externally_managed:
            return orig.install.run(self)

        if not self._called_from_setup(inspect.currentframe()):
            # Run in backward-compatibility mode to support bdist_* commands.
            orig.install.run(self)
        else:
            self.do_egg_install()

    @staticmethod
    def _called_from_setup(run_frame):
        """
        Attempt to detect whether run() was called from setup() or by another
        command.  If called by setup(), the parent caller will be the
        'run_command' method in 'distutils.dist', and *its* caller will be
        the 'run_commands' method.  If called any other way, the
        immediate caller *might* be 'run_command', but it won't have been
        called by 'run_commands'. Return True in that case or if a call stack
        is unavailable. Return False otherwise.
        """
        if run_frame is None:
            msg = "Call stack not available. bdist_* commands may fail."
            warnings.warn(msg)
            if platform.python_implementation() == 'IronPython':
                msg = "For best results, pass -X:Frames to enable call stack."
                warnings.warn(msg)
            return True
        res = inspect.getouterframes(run_frame)[2]
        caller, = res[:1]
        info = inspect.getframeinfo(caller)
        caller_module = caller.f_globals.get('__name__', '')
        return (
            caller_module == 'distutils.dist'
            and info.function == 'run_commands'
        )

    def do_egg_install(self):

        easy_install = self.distribution.get_command_class('easy_install')

        cmd = easy_install(
            self.distribution, args="x", root=self.root, record=self.record,
        )
        cmd.ensure_finalized()  # finalize before bdist_egg munges install cmd
        cmd.always_copy_from = '.'  # make sure local-dir eggs get installed

        # pick up setup-dir .egg files only: no .egg-info
        cmd.package_index.scan(glob.glob('*.egg'))

        self.run_command('bdist_egg')
        args = [self.distribution.get_command_obj('bdist_egg').egg_output]

        if setuptools.bootstrap_install_from:
            # Bootstrap self-installation of setuptools
            args.insert(0, setuptools.bootstrap_install_from)

        cmd.args = args
        cmd.run()
        setuptools.bootstrap_install_from = None


# XXX Python 3.1 doesn't see _nc if this is inside the class
install.sub_commands = (
    [cmd for cmd in orig.install.sub_commands if cmd[0] not in install._nc] +
    install.new_commands
)
command/build_py.pyc000064400000024653151733473670010540 0ustar00�
�fc@sddlmZddlmZddljjZddlZddlZddl	Z	ddl
Z
ddlZddl
Z
ddlmZddlmZmZmZyddlmZWn$ek
r�dd
d��YZnXd	ejefd
��YZdd�Zd�ZdS(i����(tglob(tconvert_pathN(tsix(tmaptfiltertfilterfalse(t	Mixin2to3RcBseZed�ZRS(cCsdS(s
do nothingN((tselftfilestdoctests((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pytrun_2to3t(t__name__t
__module__tTrueR
(((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyRstbuild_pycBs�eZdZd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d	�Zd
�Zd�Z
d�Zd
�Zd�Zed��ZRS(sXEnhanced 'build_py' command that includes data files with packages

    The data files are specified via a 'package_data' argument to 'setup()'.
    See 'setuptools.dist.Distribution' for more details.

    Also, this version of the 'build_py' command allows you to specify both
    'py_modules' and 'packages' in the same setup operation.
    cCsftjj|�|jj|_|jjp.i|_d|jkrP|jd=ng|_g|_dS(Nt
data_files(	torigRtfinalize_optionstdistributiontpackage_datatexclude_package_datat__dict__t_build_py__updated_filest_build_py__doctests_2to3(R((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR!s	
	cCs�|jr|jrdS|jr.|j�n|jrN|j�|j�n|j|jt�|j|jt�|j|j	t�|j
tjj
|dd��dS(s?Build modules, packages, and copy data files to build directoryNtinclude_bytecodei(t
py_modulestpackagest
build_modulestbuild_packagestbuild_package_dataR
RtFalseRRtbyte_compileRRtget_outputs(R((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pytrun+s	
	

cCs5|dkr"|j�|_|jStjj||�S(slazily compute data filesR(t_get_data_filesRRRt__getattr__(Rtattr((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR$?scCsqtjr-t|tj�r-|jd�}ntjj||||�\}}|rg|jj	|�n||fS(Nt.(
RtPY2t
isinstancetstring_typestsplitRRtbuild_moduleRtappend(Rtmoduletmodule_filetpackagetoutfiletcopied((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR+FscCs)|j�tt|j|jp"d��S(s?Generate list of '(package,src_dir,build_dir,filenames)' tuples((tanalyze_manifesttlistRt_get_pkg_data_filesR(R((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR#Ps
cCsx|j|�}tjj|jg|jd��}g|j||�D]}tjj||�^qG}||||fS(NR&(tget_package_dirtostpathtjoint	build_libR*tfind_data_filestrelpath(RR/tsrc_dirt	build_dirtfilet	filenames((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR4Us
%1cCs�|j|j||�}tt|�}tjj|�}ttj	j
|�}tj|jj|g�|�}|j
|||�S(s6Return filenames for package's data files in 'src_dir'(t_get_platform_patternsRRRt	itertoolstchaint
from_iterableRR6R7tisfiletmanifest_filestgettexclude_data_files(RR/R<tpatternstglobs_expandedt
globs_matchest
glob_filesR((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR:cs		c
Cs�x�|jD]�\}}}}x�|D]�}tjj||�}|jtjj|��tjj||�}|j||�\}}	tjj|�}|	r#||jj	kr#|j
j|�q#q#Wq
WdS(s$Copy data files into build directoryN(RR6R7R8tmkpathtdirnamet	copy_filetabspathRtconvert_2to3_doctestsRR,(
RR/R<R=R?tfilenamettargettsrcfiletoutfR1((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyRts
cCs\i|_}|jjsdSi}x0|jp2dD]}||t|j|��<q3W|jd�|jd�}x�|jj	D]�}t
jjt|��\}}d}|}	xU|r||kr||kr|}t
jj|�\}}
t
jj|
|�}q�W||kr|jd�r4||	kr4qn|j||g�j|�qqWdS(Ntegg_infos.py((RERtinclude_package_dataRtassert_relativeR5trun_commandtget_finalized_commandtfilelistRR6R7R*tNoneR8tendswitht
setdefaultR,(Rtmftsrc_dirsR/tei_cmdR7tdtftprevtoldftdf((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR2�s(

!cCsdS(N((R((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pytget_data_files�scCs�y|j|SWntk
r"nXtjj|||�}||j|<|s\|jjr`|Sx;|jjD])}||ks�|j|d�rmPqmqmW|Stj	|d��}|j
�}WdQXd|kr�tjj
d|f��n|S(s8Check namespace packages' __init__ for declare_namespaceR&trbNtdeclare_namespaces�Namespace package problem: %s is a namespace package, but its
__init__.py does not call declare_namespace()! Please fix it.
(See the setuptools manual under "Namespace Packages" for details.)
"(tpackages_checkedtKeyErrorRRt
check_packageRtnamespace_packagest
startswithtiotopentreadt	distutilsterrorstDistutilsError(RR/tpackage_dirtinit_pytpkgRbtcontents((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyRk�s&

	cCsi|_tjj|�dS(N(RiRRtinitialize_options(R((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyRx�s	cCsDtjj||�}|jjdk	r@tjj|jj|�S|S(N(	RRR5Rtsrc_rootR[R6R7R8(RR/tres((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR5�scs~t���|j|j||�}�fd�|D�}tjj|�}t|���fd��D�}tt|��S(s6Filter filenames for package's data files in 'src_dir'c3s!|]}tj�|�VqdS(N(tfnmatchR(t.0tpattern(R(s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pys	<genexpr>�sc3s!|]}|�kr|VqdS(N((R|tfn(tbad(s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pys	<genexpr>�s(R3R@RRARBRCtsett_unique_everseen(RR/R<RRHtmatch_groupstmatchestkeepers((RRs?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyRG�s	

cs>tj|jdg�|j|g��}�fd�|D�S(s�
        yield platform-specific path patterns (suitable for glob
        or fn_match) from a glob-based spec (such as
        self.package_data or self.exclude_package_data)
        matching package in src_dir.
        Rc3s*|] }tjj�t|��VqdS(N(R6R7R8R(R|R}(R<(s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pys	<genexpr>�s(RARBRF(tspecR/R<traw_patterns((R<s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR@�s
(RR
t__doc__RR"R$R+R#R4R:RR2RfRkRxR5RGtstaticmethodR@(((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyRs 	
			
				
						ccs�t�}|j}|dkrMxgt|j|�D]}||�|Vq1Wn;x8|D]0}||�}||krT||�|VqTqTWdS(sHList unique elements, preserving order. Remember all elements ever seen.N(R�taddR[Rt__contains__(titerabletkeytseentseen_addtelementtk((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyR��s		


cCsOtjj|�s|Sddlm}tjd�j�|}||��dS(Ni����(tDistutilsSetupErrors�
        Error: setup script specifies an absolute path:

            %s

        setup() arguments must *always* be /-separated paths relative to the
        setup.py directory, *never* absolute paths.
        (R6R7tisabstdistutils.errorsR�ttextwraptdedenttlstrip(R7R�tmsg((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyRWs((Rtdistutils.utilRtdistutils.command.build_pytcommandRRR6R{R�RnR�RqRAtsetuptools.externRtsetuptools.extern.six.movesRRRtsetuptools.lib2to3_exRtImportErrorR[R�RW(((s?/usr/lib/python2.7/site-packages/setuptools/command/build_py.pyt<module>s"
�command/bdist_egg.py000064400000043411151733473700010500 0ustar00"""setuptools.command.bdist_egg

Build .egg distributions"""

from distutils.errors import DistutilsSetupError
from distutils.dir_util import remove_tree, mkpath
from distutils import log
from types import CodeType
import sys
import os
import re
import textwrap
import marshal

from setuptools.extern import six

from pkg_resources import get_build_platform, Distribution, ensure_directory
from pkg_resources import EntryPoint
from setuptools.extension import Library
from setuptools import Command

try:
    # Python 2.7 or >=3.2
    from sysconfig import get_path, get_python_version

    def _get_purelib():
        return get_path("purelib")
except ImportError:
    from distutils.sysconfig import get_python_lib, get_python_version

    def _get_purelib():
        return get_python_lib(False)


def strip_module(filename):
    if '.' in filename:
        filename = os.path.splitext(filename)[0]
    if filename.endswith('module'):
        filename = filename[:-6]
    return filename


def sorted_walk(dir):
    """Do os.walk in a reproducible way,
    independent of indeterministic filesystem readdir order
    """
    for base, dirs, files in os.walk(dir):
        dirs.sort()
        files.sort()
        yield base, dirs, files


def write_stub(resource, pyfile):
    _stub_template = textwrap.dedent("""
        def __bootstrap__():
            global __bootstrap__, __loader__, __file__
            import sys, pkg_resources, imp
            __file__ = pkg_resources.resource_filename(__name__, %r)
            __loader__ = None; del __bootstrap__, __loader__
            imp.load_dynamic(__name__,__file__)
        __bootstrap__()
        """).lstrip()
    with open(pyfile, 'w') as f:
        f.write(_stub_template % resource)


class bdist_egg(Command):
    description = "create an \"egg\" distribution"

    user_options = [
        ('bdist-dir=', 'b',
         "temporary directory for creating the distribution"),
        ('plat-name=', 'p', "platform name to embed in generated filenames "
                            "(default: %s)" % get_build_platform()),
        ('exclude-source-files', None,
         "remove all .py files from the generated egg"),
        ('keep-temp', 'k',
         "keep the pseudo-installation tree around after " +
         "creating the distribution archive"),
        ('dist-dir=', 'd',
         "directory to put final built distributions in"),
        ('skip-build', None,
         "skip rebuilding everything (for testing/debugging)"),
    ]

    boolean_options = [
        'keep-temp', 'skip-build', 'exclude-source-files'
    ]

    def initialize_options(self):
        self.bdist_dir = None
        self.plat_name = None
        self.keep_temp = 0
        self.dist_dir = None
        self.skip_build = 0
        self.egg_output = None
        self.exclude_source_files = None

    def finalize_options(self):
        ei_cmd = self.ei_cmd = self.get_finalized_command("egg_info")
        self.egg_info = ei_cmd.egg_info

        if self.bdist_dir is None:
            bdist_base = self.get_finalized_command('bdist').bdist_base
            self.bdist_dir = os.path.join(bdist_base, 'egg')

        if self.plat_name is None:
            self.plat_name = get_build_platform()

        self.set_undefined_options('bdist', ('dist_dir', 'dist_dir'))

        if self.egg_output is None:

            # Compute filename of the output egg
            basename = Distribution(
                None, None, ei_cmd.egg_name, ei_cmd.egg_version,
                get_python_version(),
                self.distribution.has_ext_modules() and self.plat_name
            ).egg_name()

            self.egg_output = os.path.join(self.dist_dir, basename + '.egg')

    def do_install_data(self):
        # Hack for packages that install data to install's --install-lib
        self.get_finalized_command('install').install_lib = self.bdist_dir

        site_packages = os.path.normcase(os.path.realpath(_get_purelib()))
        old, self.distribution.data_files = self.distribution.data_files, []

        for item in old:
            if isinstance(item, tuple) and len(item) == 2:
                if os.path.isabs(item[0]):
                    realpath = os.path.realpath(item[0])
                    normalized = os.path.normcase(realpath)
                    if normalized == site_packages or normalized.startswith(
                        site_packages + os.sep
                    ):
                        item = realpath[len(site_packages) + 1:], item[1]
                        # XXX else: raise ???
            self.distribution.data_files.append(item)

        try:
            log.info("installing package data to %s", self.bdist_dir)
            self.call_command('install_data', force=0, root=None)
        finally:
            self.distribution.data_files = old

    def get_outputs(self):
        return [self.egg_output]

    def call_command(self, cmdname, **kw):
        """Invoke reinitialized command `cmdname` with keyword args"""
        for dirname in INSTALL_DIRECTORY_ATTRS:
            kw.setdefault(dirname, self.bdist_dir)
        kw.setdefault('skip_build', self.skip_build)
        kw.setdefault('dry_run', self.dry_run)
        cmd = self.reinitialize_command(cmdname, **kw)
        self.run_command(cmdname)
        return cmd

    def run(self):
        # Generate metadata first
        self.run_command("egg_info")
        # We run install_lib before install_data, because some data hacks
        # pull their data path from the install_lib command.
        log.info("installing library code to %s", self.bdist_dir)
        instcmd = self.get_finalized_command('install')
        old_root = instcmd.root
        instcmd.root = None
        if self.distribution.has_c_libraries() and not self.skip_build:
            self.run_command('build_clib')
        cmd = self.call_command('install_lib', warn_dir=0)
        instcmd.root = old_root

        all_outputs, ext_outputs = self.get_ext_outputs()
        self.stubs = []
        to_compile = []
        for (p, ext_name) in enumerate(ext_outputs):
            filename, ext = os.path.splitext(ext_name)
            pyfile = os.path.join(self.bdist_dir, strip_module(filename) +
                                  '.py')
            self.stubs.append(pyfile)
            log.info("creating stub loader for %s", ext_name)
            if not self.dry_run:
                write_stub(os.path.basename(ext_name), pyfile)
            to_compile.append(pyfile)
            ext_outputs[p] = ext_name.replace(os.sep, '/')

        if to_compile:
            cmd.byte_compile(to_compile)
        if self.distribution.data_files:
            self.do_install_data()

        # Make the EGG-INFO directory
        archive_root = self.bdist_dir
        egg_info = os.path.join(archive_root, 'EGG-INFO')
        self.mkpath(egg_info)
        if self.distribution.scripts:
            script_dir = os.path.join(egg_info, 'scripts')
            log.info("installing scripts to %s", script_dir)
            self.call_command('install_scripts', install_dir=script_dir,
                              no_ep=1)

        self.copy_metadata_to(egg_info)
        native_libs = os.path.join(egg_info, "native_libs.txt")
        if all_outputs:
            log.info("writing %s", native_libs)
            if not self.dry_run:
                ensure_directory(native_libs)
                libs_file = open(native_libs, 'wt')
                libs_file.write('\n'.join(all_outputs))
                libs_file.write('\n')
                libs_file.close()
        elif os.path.isfile(native_libs):
            log.info("removing %s", native_libs)
            if not self.dry_run:
                os.unlink(native_libs)

        write_safety_flag(
            os.path.join(archive_root, 'EGG-INFO'), self.zip_safe()
        )

        if os.path.exists(os.path.join(self.egg_info, 'depends.txt')):
            log.warn(
                "WARNING: 'depends.txt' will not be used by setuptools 0.6!\n"
                "Use the install_requires/extras_require setup() args instead."
            )

        if self.exclude_source_files:
            self.zap_pyfiles()

        # Make the archive
        make_zipfile(self.egg_output, archive_root, verbose=self.verbose,
                     dry_run=self.dry_run, mode=self.gen_header())
        if not self.keep_temp:
            remove_tree(self.bdist_dir, dry_run=self.dry_run)

        # Add to 'Distribution.dist_files' so that the "upload" command works
        getattr(self.distribution, 'dist_files', []).append(
            ('bdist_egg', get_python_version(), self.egg_output))

    def zap_pyfiles(self):
        log.info("Removing .py files from temporary directory")
        for base, dirs, files in walk_egg(self.bdist_dir):
            for name in files:
                path = os.path.join(base, name)

                if name.endswith('.py'):
                    log.debug("Deleting %s", path)
                    os.unlink(path)

                if base.endswith('__pycache__'):
                    path_old = path

                    pattern = r'(?P<name>.+)\.(?P<magic>[^.]+)\.pyc'
                    m = re.match(pattern, name)
                    path_new = os.path.join(
                        base, os.pardir, m.group('name') + '.pyc')
                    log.info(
                        "Renaming file from [%s] to [%s]"
                        % (path_old, path_new))
                    try:
                        os.remove(path_new)
                    except OSError:
                        pass
                    os.rename(path_old, path_new)

    def zip_safe(self):
        safe = getattr(self.distribution, 'zip_safe', None)
        if safe is not None:
            return safe
        log.warn("zip_safe flag not set; analyzing archive contents...")
        return analyze_egg(self.bdist_dir, self.stubs)

    def gen_header(self):
        epm = EntryPoint.parse_map(self.distribution.entry_points or '')
        ep = epm.get('setuptools.installation', {}).get('eggsecutable')
        if ep is None:
            return 'w'  # not an eggsecutable, do it the usual way.

        if not ep.attrs or ep.extras:
            raise DistutilsSetupError(
                "eggsecutable entry point (%r) cannot have 'extras' "
                "or refer to a module" % (ep,)
            )

        pyver = sys.version[:3]
        pkg = ep.module_name
        full = '.'.join(ep.attrs)
        base = ep.attrs[0]
        basename = os.path.basename(self.egg_output)

        header = (
            "#!/bin/sh\n"
            'if [ `basename $0` = "%(basename)s" ]\n'
            'then exec python%(pyver)s -c "'
            "import sys, os; sys.path.insert(0, os.path.abspath('$0')); "
            "from %(pkg)s import %(base)s; sys.exit(%(full)s())"
            '" "$@"\n'
            'else\n'
            '  echo $0 is not the correct name for this egg file.\n'
            '  echo Please rename it back to %(basename)s and try again.\n'
            '  exec false\n'
            'fi\n'
        ) % locals()

        if not self.dry_run:
            mkpath(os.path.dirname(self.egg_output), dry_run=self.dry_run)
            f = open(self.egg_output, 'w')
            f.write(header)
            f.close()
        return 'a'

    def copy_metadata_to(self, target_dir):
        "Copy metadata (egg info) to the target_dir"
        # normalize the path (so that a forward-slash in egg_info will
        # match using startswith below)
        norm_egg_info = os.path.normpath(self.egg_info)
        prefix = os.path.join(norm_egg_info, '')
        for path in self.ei_cmd.filelist.files:
            if path.startswith(prefix):
                target = os.path.join(target_dir, path[len(prefix):])
                ensure_directory(target)
                self.copy_file(path, target)

    def get_ext_outputs(self):
        """Get a list of relative paths to C extensions in the output distro"""

        all_outputs = []
        ext_outputs = []

        paths = {self.bdist_dir: ''}
        for base, dirs, files in sorted_walk(self.bdist_dir):
            for filename in files:
                if os.path.splitext(filename)[1].lower() in NATIVE_EXTENSIONS:
                    all_outputs.append(paths[base] + filename)
            for filename in dirs:
                paths[os.path.join(base, filename)] = (paths[base] +
                                                       filename + '/')

        if self.distribution.has_ext_modules():
            build_cmd = self.get_finalized_command('build_ext')
            for ext in build_cmd.extensions:
                if isinstance(ext, Library):
                    continue
                fullname = build_cmd.get_ext_fullname(ext.name)
                filename = build_cmd.get_ext_filename(fullname)
                if not os.path.basename(filename).startswith('dl-'):
                    if os.path.exists(os.path.join(self.bdist_dir, filename)):
                        ext_outputs.append(filename)

        return all_outputs, ext_outputs


NATIVE_EXTENSIONS = dict.fromkeys('.dll .so .dylib .pyd'.split())


def walk_egg(egg_dir):
    """Walk an unpacked egg's contents, skipping the metadata directory"""
    walker = sorted_walk(egg_dir)
    base, dirs, files = next(walker)
    if 'EGG-INFO' in dirs:
        dirs.remove('EGG-INFO')
    yield base, dirs, files
    for bdf in walker:
        yield bdf


def analyze_egg(egg_dir, stubs):
    # check for existing flag in EGG-INFO
    for flag, fn in safety_flags.items():
        if os.path.exists(os.path.join(egg_dir, 'EGG-INFO', fn)):
            return flag
    if not can_scan():
        return False
    safe = True
    for base, dirs, files in walk_egg(egg_dir):
        for name in files:
            if name.endswith('.py') or name.endswith('.pyw'):
                continue
            elif name.endswith('.pyc') or name.endswith('.pyo'):
                # always scan, even if we already know we're not safe
                safe = scan_module(egg_dir, base, name, stubs) and safe
    return safe


def write_safety_flag(egg_dir, safe):
    # Write or remove zip safety flag file(s)
    for flag, fn in safety_flags.items():
        fn = os.path.join(egg_dir, fn)
        if os.path.exists(fn):
            if safe is None or bool(safe) != flag:
                os.unlink(fn)
        elif safe is not None and bool(safe) == flag:
            f = open(fn, 'wt')
            f.write('\n')
            f.close()


safety_flags = {
    True: 'zip-safe',
    False: 'not-zip-safe',
}


def scan_module(egg_dir, base, name, stubs):
    """Check whether module possibly uses unsafe-for-zipfile stuff"""

    filename = os.path.join(base, name)
    if filename[:-1] in stubs:
        return True  # Extension module
    pkg = base[len(egg_dir) + 1:].replace(os.sep, '.')
    module = pkg + (pkg and '.' or '') + os.path.splitext(name)[0]
    if sys.version_info < (3, 3):
        skip = 8  # skip magic & date
    elif sys.version_info < (3, 7):
        skip = 12  # skip magic & date & file size
    else:
        skip = 16  # skip magic & reserved? & date & file size
    f = open(filename, 'rb')
    f.read(skip)
    code = marshal.load(f)
    f.close()
    safe = True
    symbols = dict.fromkeys(iter_symbols(code))
    for bad in ['__file__', '__path__']:
        if bad in symbols:
            log.warn("%s: module references %s", module, bad)
            safe = False
    if 'inspect' in symbols:
        for bad in [
            'getsource', 'getabsfile', 'getsourcefile', 'getfile'
            'getsourcelines', 'findsource', 'getcomments', 'getframeinfo',
            'getinnerframes', 'getouterframes', 'stack', 'trace'
        ]:
            if bad in symbols:
                log.warn("%s: module MAY be using inspect.%s", module, bad)
                safe = False
    return safe


def iter_symbols(code):
    """Yield names and strings used by `code` and its nested code objects"""
    for name in code.co_names:
        yield name
    for const in code.co_consts:
        if isinstance(const, six.string_types):
            yield const
        elif isinstance(const, CodeType):
            for name in iter_symbols(const):
                yield name


def can_scan():
    if not sys.platform.startswith('java') and sys.platform != 'cli':
        # CPython, PyPy, etc.
        return True
    log.warn("Unable to analyze compiled code on this platform.")
    log.warn("Please ask the author to include a 'zip_safe'"
             " setting (either True or False) in the package's setup.py")


# Attribute names of options for commands that might need to be convinced to
# install to the egg build directory

INSTALL_DIRECTORY_ATTRS = [
    'install_lib', 'install_dir', 'install_data', 'install_base'
]


def make_zipfile(zip_filename, base_dir, verbose=0, dry_run=0, compress=True,
                 mode='w'):
    """Create a zip file from all the files under 'base_dir'.  The output
    zip file will be named 'base_dir' + ".zip".  Uses either the "zipfile"
    Python module (if available) or the InfoZIP "zip" utility (if installed
    and found on the default search path).  If neither tool is available,
    raises DistutilsExecError.  Returns the name of the output zip file.
    """
    import zipfile

    mkpath(os.path.dirname(zip_filename), dry_run=dry_run)
    log.info("creating '%s' and adding '%s' to it", zip_filename, base_dir)

    def visit(z, dirname, names):
        for name in names:
            path = os.path.normpath(os.path.join(dirname, name))
            if os.path.isfile(path):
                p = path[len(base_dir) + 1:]
                if not dry_run:
                    z.write(path, p)
                log.debug("adding '%s'", p)

    compression = zipfile.ZIP_DEFLATED if compress else zipfile.ZIP_STORED
    if not dry_run:
        z = zipfile.ZipFile(zip_filename, mode, compression=compression)
        for dirname, dirs, files in sorted_walk(base_dir):
            visit(z, dirname, files)
        z.close()
    else:
        for dirname, dirs, files in sorted_walk(base_dir):
            visit(None, dirname, files)
    return zip_filename
command/bdist_egg.pyc000064400000043724151733473700010652 0ustar00�
�fc@s�dZddlmZddlmZmZddlmZddlm	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlmZddlmZmZmZdd	lmZdd
lmZddlmZy#ddlmZmZd
�ZWn0ek
r9ddlm Z mZd�ZnXd�Z!d�Z"d�Z#defd��YZ$e%j&dj'��Z(d�Z)d�Z*d�Z+ide,6de-6Z.d�Z/d�Z0d�Z1ddd d!gZ2d"d"e,d#d$�Z3dS(%s6setuptools.command.bdist_egg

Build .egg distributionsi����(tDistutilsSetupError(tremove_treetmkpath(tlog(tCodeTypeN(tsix(tget_build_platformtDistributiontensure_directory(t
EntryPoint(tLibrary(tCommand(tget_pathtget_python_versioncCs
td�S(Ntpurelib(R(((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyt_get_purelibs(tget_python_libR
cCs
tt�S(N(RtFalse(((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRscCsEd|kr%tjj|�d}n|jd�rA|d }n|S(Nt.itmodulei����(tostpathtsplitexttendswith(tfilename((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pytstrip_module#s

ccsIxBtj|�D]1\}}}|j�|j�|||fVqWdS(sbDo os.walk in a reproducible way,
    independent of indeterministic filesystem readdir order
    N(Rtwalktsort(tdirtbasetdirstfiles((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pytsorted_walk+s

cCsBtjd�j�}t|d��}|j||�WdQXdS(NsR
        def __bootstrap__():
            global __bootstrap__, __loader__, __file__
            import sys, pkg_resources, imp
            __file__ = pkg_resources.resource_filename(__name__, %r)
            __loader__ = None; del __bootstrap__, __loader__
            imp.load_dynamic(__name__,__file__)
        __bootstrap__()
        tw(ttextwraptdedenttlstriptopentwrite(tresourcetpyfilet_stub_templatetf((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyt
write_stub5st	bdist_eggcBs�eZdZdddde�fdd	d
ddfd d!gZd	ddgZd�Zd�Zd�Z	d�Z
d�Zd�Zd�Z
d�Zd�Zd�Zd�ZRS("screate an "egg" distributions
bdist-dir=tbs1temporary directory for creating the distributions
plat-name=tps;platform name to embed in generated filenames (default: %s)sexclude-source-filess+remove all .py files from the generated eggs	keep-temptks/keep the pseudo-installation tree around after s!creating the distribution archives	dist-dir=tds-directory to put final built distributions ins
skip-builds2skip rebuilding everything (for testing/debugging)cCsCd|_d|_d|_d|_d|_d|_d|_dS(Ni(tNonet	bdist_dirt	plat_namet	keep_temptdist_dirt
skip_buildt
egg_outputtexclude_source_files(tself((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pytinitialize_optionsZs						cCs�|jd�}|_|j|_|jdkr^|jd�j}tjj|d�|_n|j	dkr|t
�|_	n|jdd�|jdkr�t
dd|j|jt�|jj�o�|j	�j�}tjj|j|d�|_ndS(Ntegg_infotbdistteggR5s.egg(R5R5(tget_finalized_commandtei_cmdR;R2R1t
bdist_baseRRtjoinR3Rtset_undefined_optionsR7Rtegg_nametegg_versionR
tdistributionthas_ext_modulesR5(R9R?R@tbasename((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pytfinalize_optionscs!cCs_|j|jd�_tjjtjjt���}|jj	g}|j_	x�|D]�}t
|t�rt|�dkrtjj
|d�rtjj|d�}tjj|�}||ks�|j|tj�r|t|�d|df}qqn|jj	j|�qVWz0tjd|j�|jddddd�Wd||j_	XdS(	Ntinstalliiisinstalling package data to %stinstall_datatforcetroot(R2R>tinstall_libRRtnormcasetrealpathRREt
data_filest
isinstancettupletlentisabst
startswithtseptappendRtinfotcall_commandR1(R9t
site_packagestoldtitemROt
normalized((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pytdo_install_data{s !
!'cCs
|jgS(N(R7(R9((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pytget_outputs�scKsmx!tD]}|j||j�qW|jd|j�|jd|j�|j||�}|j|�|S(s8Invoke reinitialized command `cmdname` with keyword argsR6tdry_run(tINSTALL_DIRECTORY_ATTRSt
setdefaultR2R6R`treinitialize_commandtrun_command(R9tcmdnametkwtdirnametcmd((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRY�s

c	Cs�|jd�tjd|j�|jd�}|j}d|_|jj�rj|j	rj|jd�n|j
ddd�}||_|j�\}}g|_g}x�t
|�D]�\}}tjj|�\}	}
tjj|jt|	�d�}|jj|�tjd	|�|jsAttjj|�|�n|j|�|jtjd
�||<q�W|r�|j|�n|jjr�|j�n|j}tjj|d�}
|j|
�|jjrtjj|
d�}tjd
|�|j
dd|dd�n|j|
�tjj|
d�}|r�tjd|�|js�t|�t |d�}|j!dj|��|j!d�|j"�q�n>tjj#|�r�tjd|�|js�tj$|�q�nt%tjj|d�|j&��tjj'tjj|j(d��r3tj)d�n|j*rI|j+�nt,|j-|d|j.d|jd|j/��|j0s�t1|jd|j�nt2|jdg�jdt3�|j-f�dS(NR;sinstalling library code to %sRIt
build_clibRMtwarn_diris.pyscreating stub loader for %st/sEGG-INFOtscriptssinstalling scripts to %stinstall_scriptstinstall_dirtno_episnative_libs.txts
writing %stwts
sremoving %ssdepends.txtsxWARNING: 'depends.txt' will not be used by setuptools 0.6!
Use the install_requires/extras_require setup() args instead.tverboseR`tmodet
dist_filesR,(4RdRRXR2R>RLR1REthas_c_librariesR6RYtget_ext_outputststubst	enumerateRRRRARRWR`R+RGtreplaceRVtbyte_compileRPR^RRltcopy_metadata_toRR%R&tclosetisfiletunlinktwrite_safety_flagtzip_safetexistsR;twarnR8tzap_pyfilestmake_zipfileR7Rqt
gen_headerR4RtgetattrR
(R9tinstcmdtold_rootRhtall_outputstext_outputst
to_compileR.text_nameRtextR(tarchive_rootR;t
script_dirtnative_libst	libs_file((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pytrun�sz
				
	

	


	

	$
	
	c
Cs-tjd�xt|j�D]\}}}x�|D]�}tjj||�}|jd�r}tjd|�tj	|�n|jd�r3|}d}t
j||�}tjj|tj|j
d�d�}	tjd||	f�ytj|	�Wntk
r
nXtj||	�q3q3WqWdS(	Ns+Removing .py files from temporary directorys.pysDeleting %st__pycache__s#(?P<name>.+)\.(?P<magic>[^.]+)\.pyctnames.pycsRenaming file from [%s] to [%s](RRXtwalk_eggR2RRRARtdebugR}tretmatchtpardirtgrouptremovetOSErrortrename(
R9RRRR�Rtpath_oldtpatterntmtpath_new((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyR��s*

	
cCsEt|jdd�}|dk	r%|Stjd�t|j|j�S(NRs4zip_safe flag not set; analyzing archive contents...(R�RER1RR�tanalyze_eggR2Rv(R9tsafe((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRs

c
Cs!tj|jjpd�}|jdi�jd�}|dkrFdS|jsY|jrotd|f��nt	j
d }|j}dj|j�}|jd}t
jj|j�}d	t�}|jstt
jj|j�d
|j�t|jd�}	|	j|�|	j�ndS(Ntssetuptools.installationteggsecutableR!sGeggsecutable entry point (%r) cannot have 'extras' or refer to a moduleiRisH#!/bin/sh
if [ `basename $0` = "%(basename)s" ]
then exec python%(pyver)s -c "import sys, os; sys.path.insert(0, os.path.abspath('$0')); from %(pkg)s import %(base)s; sys.exit(%(full)s())" "$@"
else
  echo $0 is not the correct name for this egg file.
  echo Please rename it back to %(basename)s and try again.
  exec false
fi
R`ta(R	t	parse_mapREtentry_pointstgetR1tattrstextrasRtsystversiontmodule_nameRARRRGR7tlocalsR`RRgR%R&R{(
R9tepmteptpyvertpkgtfullRRGtheaderR*((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyR�s*
	

	"

cCs�tjj|j�}tjj|d�}xb|jjjD]Q}|j|�r:tjj||t	|��}t
|�|j||�q:q:WdS(s*Copy metadata (egg info) to the target_dirR�N(RRtnormpathR;RAR?tfilelistRRURSRt	copy_file(R9t
target_dirt
norm_egg_infotprefixRttarget((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRz:s
cCs�g}g}id|j6}x�t|j�D]�\}}}xH|D]@}tjj|�dj�tkrB|j|||�qBqBWx3|D]+}|||d|tjj||�<q�Wq,W|j	j
�r}|jd�}x�|jD]�}	t
|	t�rq�n|j|	j�}
|j|
�}tjj|�jd�s�tjjtjj|j|��rv|j|�qvq�q�Wn||fS(sAGet a list of relative paths to C extensions in the output distroR�iRkt	build_extsdl-(R2R RRRtlowertNATIVE_EXTENSIONSRWRARERFR>t
extensionsRQR
tget_ext_fullnameR�tget_ext_filenameRGRUR�(R9R�R�tpathsRRRRt	build_cmdR�tfullname((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyRuFs(
"
-$(s
bdist-dir=R-s1temporary directory for creating the distributionN(sexclude-source-filesNs+remove all .py files from the generated egg(s	dist-dir=R0s-directory to put final built distributions in(s
skip-buildNs2skip rebuilding everything (for testing/debugging)(t__name__t
__module__tdescriptionRR1tuser_optionstboolean_optionsR:RHR^R_RYR�R�RR�RzRu(((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyR,Cs4	
							
	Q			'	s.dll .so .dylib .pydccset|�}t|�\}}}d|kr=|jd�n|||fVx|D]}|VqRWdS(s@Walk an unpacked egg's contents, skipping the metadata directorysEGG-INFON(R tnextR�(tegg_dirtwalkerRRRtbdf((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyR�fs
c	Cs�xBtj�D]4\}}tjjtjj|d|��r
|Sq
Wt�sRtSt}x�t	|�D]�\}}}xn|D]f}|j
d�s{|j
d�r�q{q{|j
d�s�|j
d�r{t||||�o�|}q{q{WqeW|S(NsEGG-INFOs.pys.pyws.pycs.pyo(tsafety_flagstitemsRRR�RAtcan_scanRtTrueR�Rtscan_module(	R�RvtflagtfnR�RRRR�((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyR�qs$	
&cCs�x�tj�D]�\}}tjj||�}tjj|�rq|dks^t|�|kr�tj|�q�q
|dk	r
t|�|kr
t	|d�}|j
d�|j�q
q
WdS(NRps
(R�R�RRRAR�R1tboolR}R%R&R{(R�R�R�R�R*((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyR~�s
szip-safesnot-zip-safec
Cs�tjj||�}|d |kr)tS|t|�djtjd�}||r[dp^dtjj|�d}tj	dkr�d}ntj	dkr�d	}nd
}t
|d�}|j|�tj
|�}	|j�t}
tjt|	��}x<dd
gD].}||kr	tjd||�t}
q	q	Wd|kr�xZdddddddddddgD].}||krotjd||�t}
qoqoWn|
S(s;Check whether module possibly uses unsafe-for-zipfile stuffi����iRR�iiiiiitrbt__file__t__path__s%s: module references %stinspectt	getsourcet
getabsfilet
getsourcefiletgetfilegetsourcelinest
findsourcetgetcommentstgetframeinfotgetinnerframestgetouterframeststackttraces"%s: module MAY be using inspect.%s(ii(ii(RRRAR�RSRxRVRR�tversion_infoR%treadtmarshaltloadR{tdicttfromkeystiter_symbolsRR�R(
R�RR�RvRR�RtskipR*tcodeR�tsymbolstbad((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyR��s:#*		


	ccsyx|jD]}|Vq
WxY|jD]N}t|tj�rC|Vq#t|t�r#xt|�D]}|Vq_Wq#q#WdS(sBYield names and strings used by `code` and its nested code objectsN(tco_namest	co_constsRQRtstring_typesRR�(R�R�tconst((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyR��s	cCsDtjjd�r&tjdkr&tStjd�tjd�dS(Ntjavatclis1Unable to analyze compiled code on this platform.sfPlease ask the author to include a 'zip_safe' setting (either True or False) in the package's setup.py(R�tplatformRUR�RR�(((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyR��s"
RMRnRJtinstall_baseiR!c
s�ddl}ttjj|�d��tjd|����fd�}|r\|jn|j}�s�|j	||d|�}	x-t
��D]\}
}}||	|
|�q�W|	j�n0x-t
��D]\}
}}|d|
|�q�W|S(sqCreate a zip file from all the files under 'base_dir'.  The output
    zip file will be named 'base_dir' + ".zip".  Uses either the "zipfile"
    Python module (if available) or the InfoZIP "zip" utility (if installed
    and found on the default search path).  If neither tool is available,
    raises DistutilsExecError.  Returns the name of the output zip file.
    i����NR`s#creating '%s' and adding '%s' to itcs�x�|D]y}tjjtjj||��}tjj|�r|t��d}�sm|j||�ntjd|�qqWdS(Nisadding '%s'(	RRR�RAR|RSR&RR�(tzRgtnamesR�RR.(tbase_dirR`(s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pytvisit�s
!tcompression(
tzipfileRRRRgRRXtZIP_DEFLATEDt
ZIP_STOREDtZipFileR R{R1(
tzip_filenameR�RqR`tcompressRrR�R�R�R�RgRR((R�R`s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyR��s	
(4t__doc__tdistutils.errorsRtdistutils.dir_utilRRt	distutilsRttypesRR�RR�R"R�tsetuptools.externRt
pkg_resourcesRRRR	tsetuptools.extensionR
t
setuptoolsRt	sysconfigRR
RtImportErrortdistutils.sysconfigRRR R+R,R�R�tsplitR�R�R�R~R�RR�R�R�R�RaR�(((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_egg.pyt<module>sL


		
	�!			

	$		
	command/develop.py000064400000017556151733473700010222 0ustar00from distutils.util import convert_path
from distutils import log
from distutils.errors import DistutilsError, DistutilsOptionError
import os
import glob
import io

from setuptools.extern import six

from pkg_resources import Distribution, PathMetadata, normalize_path
from setuptools.command.easy_install import easy_install
from setuptools import namespaces
import setuptools


class develop(namespaces.DevelopInstaller, easy_install):
    """Set up package for development"""

    description = "install package in 'development mode'"

    user_options = easy_install.user_options + [
        ("uninstall", "u", "Uninstall this source package"),
        ("egg-path=", None, "Set the path to be used in the .egg-link file"),
    ]

    boolean_options = easy_install.boolean_options + ['uninstall']

    command_consumes_arguments = False  # override base

    def run(self):
        if self.uninstall:
            self.multi_version = True
            self.uninstall_link()
            self.uninstall_namespaces()
        else:
            self.install_for_development()
        self.warn_deprecated_options()

    def initialize_options(self):
        self.uninstall = None
        self.egg_path = None
        easy_install.initialize_options(self)
        self.setup_path = None
        self.always_copy_from = '.'  # always copy eggs installed in curdir

    def finalize_options(self):
        ei = self.get_finalized_command("egg_info")
        if ei.broken_egg_info:
            template = "Please rename %r to %r before using 'develop'"
            args = ei.egg_info, ei.broken_egg_info
            raise DistutilsError(template % args)
        self.args = [ei.egg_name]

        easy_install.finalize_options(self)
        self.expand_basedirs()
        self.expand_dirs()
        # pick up setup-dir .egg files only: no .egg-info
        self.package_index.scan(glob.glob('*.egg'))

        egg_link_fn = ei.egg_name + '.egg-link'
        self.egg_link = os.path.join(self.install_dir, egg_link_fn)
        self.egg_base = ei.egg_base
        if self.egg_path is None:
            self.egg_path = os.path.abspath(ei.egg_base)

        target = normalize_path(self.egg_base)
        egg_path = normalize_path(os.path.join(self.install_dir,
                                               self.egg_path))
        if egg_path != target:
            raise DistutilsOptionError(
                "--egg-path must be a relative path from the install"
                " directory to " + target
            )

        # Make a distribution for the package's source
        self.dist = Distribution(
            target,
            PathMetadata(target, os.path.abspath(ei.egg_info)),
            project_name=ei.egg_name
        )

        self.setup_path = self._resolve_setup_path(
            self.egg_base,
            self.install_dir,
            self.egg_path,
        )

    @staticmethod
    def _resolve_setup_path(egg_base, install_dir, egg_path):
        """
        Generate a path from egg_base back to '.' where the
        setup script resides and ensure that path points to the
        setup path from $install_dir/$egg_path.
        """
        path_to_setup = egg_base.replace(os.sep, '/').rstrip('/')
        if path_to_setup != os.curdir:
            path_to_setup = '../' * (path_to_setup.count('/') + 1)
        resolved = normalize_path(
            os.path.join(install_dir, egg_path, path_to_setup)
        )
        if resolved != normalize_path(os.curdir):
            raise DistutilsOptionError(
                "Can't get a consistent path to setup script from"
                " installation directory", resolved, normalize_path(os.curdir))
        return path_to_setup

    def install_for_development(self):
        if six.PY3 and getattr(self.distribution, 'use_2to3', False):
            # If we run 2to3 we can not do this inplace:

            # Ensure metadata is up-to-date
            self.reinitialize_command('build_py', inplace=0)
            self.run_command('build_py')
            bpy_cmd = self.get_finalized_command("build_py")
            build_path = normalize_path(bpy_cmd.build_lib)

            # Build extensions
            self.reinitialize_command('egg_info', egg_base=build_path)
            self.run_command('egg_info')

            self.reinitialize_command('build_ext', inplace=0)
            self.run_command('build_ext')

            # Fixup egg-link and easy-install.pth
            ei_cmd = self.get_finalized_command("egg_info")
            self.egg_path = build_path
            self.dist.location = build_path
            # XXX
            self.dist._provider = PathMetadata(build_path, ei_cmd.egg_info)
        else:
            # Without 2to3 inplace works fine:
            self.run_command('egg_info')

            # Build extensions in-place
            self.reinitialize_command('build_ext', inplace=1)
            self.run_command('build_ext')

        self.install_site_py()  # ensure that target dir is site-safe
        if setuptools.bootstrap_install_from:
            self.easy_install(setuptools.bootstrap_install_from)
            setuptools.bootstrap_install_from = None

        self.install_namespaces()

        # create an .egg-link in the installation dir, pointing to our egg
        log.info("Creating %s (link to %s)", self.egg_link, self.egg_base)
        if not self.dry_run:
            with open(self.egg_link, "w") as f:
                f.write(self.egg_path + "\n" + self.setup_path)
        # postprocess the installed distro, fixing up .pth, installing scripts,
        # and handling requirements
        self.process_distribution(None, self.dist, not self.no_deps)

    def uninstall_link(self):
        if os.path.exists(self.egg_link):
            log.info("Removing %s (link to %s)", self.egg_link, self.egg_base)
            egg_link_file = open(self.egg_link)
            contents = [line.rstrip() for line in egg_link_file]
            egg_link_file.close()
            if contents not in ([self.egg_path],
                                [self.egg_path, self.setup_path]):
                log.warn("Link points to %s: uninstall aborted", contents)
                return
            if not self.dry_run:
                os.unlink(self.egg_link)
        if not self.dry_run:
            self.update_pth(self.dist)  # remove any .pth link to us
        if self.distribution.scripts:
            # XXX should also check for entry point scripts!
            log.warn("Note: you must uninstall or replace scripts manually!")

    def install_egg_scripts(self, dist):
        if dist is not self.dist:
            # Installing a dependency, so fall back to normal behavior
            return easy_install.install_egg_scripts(self, dist)

        # create wrapper scripts in the script dir, pointing to dist.scripts

        # new-style...
        self.install_wrapper_scripts(dist)

        # ...and old-style
        for script_name in self.distribution.scripts or []:
            script_path = os.path.abspath(convert_path(script_name))
            script_name = os.path.basename(script_path)
            with io.open(script_path) as strm:
                script_text = strm.read()
            self.install_script(dist, script_name, script_text, script_path)

    def install_wrapper_scripts(self, dist):
        dist = VersionlessRequirement(dist)
        return easy_install.install_wrapper_scripts(self, dist)


class VersionlessRequirement(object):
    """
    Adapt a pkg_resources.Distribution to simply return the project
    name as the 'requirement' so that scripts will work across
    multiple versions.

    >>> dist = Distribution(project_name='foo', version='1.0')
    >>> str(dist.as_requirement())
    'foo==1.0'
    >>> adapted_dist = VersionlessRequirement(dist)
    >>> str(adapted_dist.as_requirement())
    'foo'
    """

    def __init__(self, dist):
        self.__dist = dist

    def __getattr__(self, name):
        return getattr(self.__dist, name)

    def as_requirement(self):
        return self.project_name
command/install_scripts.py000064400000004607151733473700011772 0ustar00from distutils import log
import distutils.command.install_scripts as orig
import os
import sys

from pkg_resources import Distribution, PathMetadata, ensure_directory


class install_scripts(orig.install_scripts):
    """Do normal script install, plus any egg_info wrapper scripts"""

    def initialize_options(self):
        orig.install_scripts.initialize_options(self)
        self.no_ep = False

    def run(self):
        import setuptools.command.easy_install as ei

        self.run_command("egg_info")
        if self.distribution.scripts:
            orig.install_scripts.run(self)  # run first to set up self.outfiles
        else:
            self.outfiles = []
        if self.no_ep:
            # don't install entry point scripts into .egg file!
            return

        ei_cmd = self.get_finalized_command("egg_info")
        dist = Distribution(
            ei_cmd.egg_base, PathMetadata(ei_cmd.egg_base, ei_cmd.egg_info),
            ei_cmd.egg_name, ei_cmd.egg_version,
        )
        bs_cmd = self.get_finalized_command('build_scripts')
        exec_param = getattr(bs_cmd, 'executable', None)
        bw_cmd = self.get_finalized_command("bdist_wininst")
        is_wininst = getattr(bw_cmd, '_is_running', False)
        writer = ei.ScriptWriter
        if is_wininst:
            exec_param = "python.exe"
            writer = ei.WindowsScriptWriter
        if exec_param == sys.executable:
            # In case the path to the Python executable contains a space, wrap
            # it so it's not split up.
            exec_param = [exec_param]
        # resolve the writer to the environment
        writer = writer.best()
        cmd = writer.command_spec_class.best().from_param(exec_param)
        for args in writer.get_args(dist, cmd.as_header()):
            self.write_script(*args)

    def write_script(self, script_name, contents, mode="t", *ignored):
        """Write an executable file to the scripts directory"""
        from setuptools.command.easy_install import chmod, current_umask

        log.info("Installing %s script to %s", script_name, self.install_dir)
        target = os.path.join(self.install_dir, script_name)
        self.outfiles.append(target)

        mask = current_umask()
        if not self.dry_run:
            ensure_directory(target)
            f = open(target, "w" + mode)
            f.write(contents)
            f.close()
            chmod(target, 0o777 - mask)
command/dist_info.pyc000064400000003407151733473700010673 0ustar00�
�fc@sLdZddlZddlmZddlmZdefd��YZdS(sD
Create a dist_info directory
As defined in the wheel specification
i����N(tCommand(tlogt	dist_infocBs2eZdZdgZd�Zd�Zd�ZRS(screate a .dist-info directorys	egg-base=tesLdirectory containing .egg-info directories (default: top of the source tree)cCs
d|_dS(N(tNonetegg_base(tself((s@/usr/lib/python2.7/site-packages/setuptools/command/dist_info.pytinitialize_optionsscCsdS(N((R((s@/usr/lib/python2.7/site-packages/setuptools/command/dist_info.pytfinalize_optionsscCs�|jd�}|j|_|j�|j�|jtd� d}tjdjt	j
j|���|jd�}|j|j|�dS(Ntegg_infos	.egg-infos
.dist-infos
creating '{}'tbdist_wheel(
tget_finalized_commandRRtrunR	tlenRtinfotformattostpathtabspathtegg2dist(RR	t
dist_info_dirR
((s@/usr/lib/python2.7/site-packages/setuptools/command/dist_info.pyRs

"(s	egg-base=RsLdirectory containing .egg-info directories (default: top of the source tree)(t__name__t
__module__tdescriptiontuser_optionsRRR(((s@/usr/lib/python2.7/site-packages/setuptools/command/dist_info.pyRs
			(t__doc__Rtdistutils.coreRt	distutilsRR(((s@/usr/lib/python2.7/site-packages/setuptools/command/dist_info.pyt<module>scommand/alias.pyc000064400000006032151733473700010003 0ustar00�
�fc@shddlmZddlmZddlmZmZmZd�Zdefd��YZ	d�Z
dS(	i����(tDistutilsOptionError(tmap(tedit_configtoption_basetconfig_filecCsJx$dD]}||krt|�SqW|j�|gkrFt|�S|S(s4Quote an argument for later parsing by shlex.split()t"t's\t#(RRs\R(treprtsplit(targtc((s</usr/lib/python2.7/site-packages/setuptools/command/alias.pytshquotes

taliascBsUeZdZdZeZdgejZejdgZd�Z	d�Z
d�ZRS(	s3Define a shortcut that invokes one or more commandss0define a shortcut to invoke one or more commandstremovetrsremove (unset) the aliascCs#tj|�d|_d|_dS(N(Rtinitialize_optionstNonetargsR(tself((s</usr/lib/python2.7/site-packages/setuptools/command/alias.pyRs
	cCs>tj|�|jr:t|j�dkr:td��ndS(NisFMust specify exactly one argument (the alias name) when using --remove(Rtfinalize_optionsRtlenRR(R((s</usr/lib/python2.7/site-packages/setuptools/command/alias.pyR#s
cCs	|jjd�}|jsNdGHdGHx"|D]}dt||�fGHq,WdSt|j�dkr�|j\}|jr�d}q�||kr�dt||�fGHdSd|GHdSn,|jd}djtt	|jd��}t
|jii||6d6|j�dS(	NtaliasessCommand Aliasess---------------ssetup.py aliasis No alias definition found for %rit (
tdistributiontget_option_dictRtformat_aliasRRRtjoinRRRtfilenametdry_run(RRR
tcommand((s</usr/lib/python2.7/site-packages/setuptools/command/alias.pytrun+s&	
			
(RRsremove (unset) the alias(t__name__t
__module__t__doc__tdescriptiontTruetcommand_consumes_argumentsRtuser_optionstboolean_optionsRRR(((s</usr/lib/python2.7/site-packages/setuptools/command/alias.pyR
s
		cCs{||\}}|td�kr+d}n@|td�krFd}n%|td�krad}n
d|}||d|S(	Ntglobals--global-config tusers--user-config tlocalts
--filename=%rR(R(tnameRtsourceR((s</usr/lib/python2.7/site-packages/setuptools/command/alias.pyRFs			
N(tdistutils.errorsRtsetuptools.extern.six.movesRtsetuptools.command.setoptRRRRR
R(((s</usr/lib/python2.7/site-packages/setuptools/command/alias.pyt<module>s
	
4command/launcher manifest.xml000064400000001164151733473700012310 0ustar00<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity version="1.0.0.0"
                      processorArchitecture="X86"
                      name="%(name)s"
                      type="win32"/>
    <!-- Identify the application security requirements. -->
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
            <requestedPrivileges>
                <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
            </requestedPrivileges>
        </security>
    </trustInfo>
</assembly>
command/build_py.py000064400000022574151733473700010367 0ustar00from glob import glob
from distutils.util import convert_path
import distutils.command.build_py as orig
import os
import fnmatch
import textwrap
import io
import distutils.errors
import itertools

from setuptools.extern import six
from setuptools.extern.six.moves import map, filter, filterfalse

try:
    from setuptools.lib2to3_ex import Mixin2to3
except ImportError:

    class Mixin2to3:
        def run_2to3(self, files, doctests=True):
            "do nothing"


class build_py(orig.build_py, Mixin2to3):
    """Enhanced 'build_py' command that includes data files with packages

    The data files are specified via a 'package_data' argument to 'setup()'.
    See 'setuptools.dist.Distribution' for more details.

    Also, this version of the 'build_py' command allows you to specify both
    'py_modules' and 'packages' in the same setup operation.
    """

    def finalize_options(self):
        orig.build_py.finalize_options(self)
        self.package_data = self.distribution.package_data
        self.exclude_package_data = (self.distribution.exclude_package_data or
                                     {})
        if 'data_files' in self.__dict__:
            del self.__dict__['data_files']
        self.__updated_files = []
        self.__doctests_2to3 = []

    def run(self):
        """Build modules, packages, and copy data files to build directory"""
        if not self.py_modules and not self.packages:
            return

        if self.py_modules:
            self.build_modules()

        if self.packages:
            self.build_packages()
            self.build_package_data()

        self.run_2to3(self.__updated_files, False)
        self.run_2to3(self.__updated_files, True)
        self.run_2to3(self.__doctests_2to3, True)

        # Only compile actual .py files, using our base class' idea of what our
        # output files are.
        self.byte_compile(orig.build_py.get_outputs(self, include_bytecode=0))

    def __getattr__(self, attr):
        "lazily compute data files"
        if attr == 'data_files':
            self.data_files = self._get_data_files()
            return self.data_files
        return orig.build_py.__getattr__(self, attr)

    def build_module(self, module, module_file, package):
        if six.PY2 and isinstance(package, six.string_types):
            # avoid errors on Python 2 when unicode is passed (#190)
            package = package.split('.')
        outfile, copied = orig.build_py.build_module(self, module, module_file,
                                                     package)
        if copied:
            self.__updated_files.append(outfile)
        return outfile, copied

    def _get_data_files(self):
        """Generate list of '(package,src_dir,build_dir,filenames)' tuples"""
        self.analyze_manifest()
        return list(map(self._get_pkg_data_files, self.packages or ()))

    def _get_pkg_data_files(self, package):
        # Locate package source directory
        src_dir = self.get_package_dir(package)

        # Compute package build directory
        build_dir = os.path.join(*([self.build_lib] + package.split('.')))

        # Strip directory from globbed filenames
        filenames = [
            os.path.relpath(file, src_dir)
            for file in self.find_data_files(package, src_dir)
        ]
        return package, src_dir, build_dir, filenames

    def find_data_files(self, package, src_dir):
        """Return filenames for package's data files in 'src_dir'"""
        patterns = self._get_platform_patterns(
            self.package_data,
            package,
            src_dir,
        )
        globs_expanded = map(glob, patterns)
        # flatten the expanded globs into an iterable of matches
        globs_matches = itertools.chain.from_iterable(globs_expanded)
        glob_files = filter(os.path.isfile, globs_matches)
        files = itertools.chain(
            self.manifest_files.get(package, []),
            glob_files,
        )
        return self.exclude_data_files(package, src_dir, files)

    def build_package_data(self):
        """Copy data files into build directory"""
        for package, src_dir, build_dir, filenames in self.data_files:
            for filename in filenames:
                target = os.path.join(build_dir, filename)
                self.mkpath(os.path.dirname(target))
                srcfile = os.path.join(src_dir, filename)
                outf, copied = self.copy_file(srcfile, target)
                srcfile = os.path.abspath(srcfile)
                if (copied and
                        srcfile in self.distribution.convert_2to3_doctests):
                    self.__doctests_2to3.append(outf)

    def analyze_manifest(self):
        self.manifest_files = mf = {}
        if not self.distribution.include_package_data:
            return
        src_dirs = {}
        for package in self.packages or ():
            # Locate package source directory
            src_dirs[assert_relative(self.get_package_dir(package))] = package

        self.run_command('egg_info')
        ei_cmd = self.get_finalized_command('egg_info')
        for path in ei_cmd.filelist.files:
            d, f = os.path.split(assert_relative(path))
            prev = None
            oldf = f
            while d and d != prev and d not in src_dirs:
                prev = d
                d, df = os.path.split(d)
                f = os.path.join(df, f)
            if d in src_dirs:
                if path.endswith('.py') and f == oldf:
                    continue  # it's a module, not data
                mf.setdefault(src_dirs[d], []).append(path)

    def get_data_files(self):
        pass  # Lazily compute data files in _get_data_files() function.

    def check_package(self, package, package_dir):
        """Check namespace packages' __init__ for declare_namespace"""
        try:
            return self.packages_checked[package]
        except KeyError:
            pass

        init_py = orig.build_py.check_package(self, package, package_dir)
        self.packages_checked[package] = init_py

        if not init_py or not self.distribution.namespace_packages:
            return init_py

        for pkg in self.distribution.namespace_packages:
            if pkg == package or pkg.startswith(package + '.'):
                break
        else:
            return init_py

        with io.open(init_py, 'rb') as f:
            contents = f.read()
        if b'declare_namespace' not in contents:
            raise distutils.errors.DistutilsError(
                "Namespace package problem: %s is a namespace package, but "
                "its\n__init__.py does not call declare_namespace()! Please "
                'fix it.\n(See the setuptools manual under '
                '"Namespace Packages" for details.)\n"' % (package,)
            )
        return init_py

    def initialize_options(self):
        self.packages_checked = {}
        orig.build_py.initialize_options(self)

    def get_package_dir(self, package):
        res = orig.build_py.get_package_dir(self, package)
        if self.distribution.src_root is not None:
            return os.path.join(self.distribution.src_root, res)
        return res

    def exclude_data_files(self, package, src_dir, files):
        """Filter filenames for package's data files in 'src_dir'"""
        files = list(files)
        patterns = self._get_platform_patterns(
            self.exclude_package_data,
            package,
            src_dir,
        )
        match_groups = (
            fnmatch.filter(files, pattern)
            for pattern in patterns
        )
        # flatten the groups of matches into an iterable of matches
        matches = itertools.chain.from_iterable(match_groups)
        bad = set(matches)
        keepers = (
            fn
            for fn in files
            if fn not in bad
        )
        # ditch dupes
        return list(_unique_everseen(keepers))

    @staticmethod
    def _get_platform_patterns(spec, package, src_dir):
        """
        yield platform-specific path patterns (suitable for glob
        or fn_match) from a glob-based spec (such as
        self.package_data or self.exclude_package_data)
        matching package in src_dir.
        """
        raw_patterns = itertools.chain(
            spec.get('', []),
            spec.get(package, []),
        )
        return (
            # Each pattern has to be converted to a platform-specific path
            os.path.join(src_dir, convert_path(pattern))
            for pattern in raw_patterns
        )


# from Python docs
def _unique_everseen(iterable, key=None):
    "List unique elements, preserving order. Remember all elements ever seen."
    # unique_everseen('AAAABBBCCDAABBB') --> A B C D
    # unique_everseen('ABBCcAD', str.lower) --> A B C D
    seen = set()
    seen_add = seen.add
    if key is None:
        for element in filterfalse(seen.__contains__, iterable):
            seen_add(element)
            yield element
    else:
        for element in iterable:
            k = key(element)
            if k not in seen:
                seen_add(k)
                yield element


def assert_relative(path):
    if not os.path.isabs(path):
        return path
    from distutils.errors import DistutilsSetupError

    msg = textwrap.dedent("""
        Error: setup script specifies an absolute path:

            %s

        setup() arguments must *always* be /-separated paths relative to the
        setup.py directory, *never* absolute paths.
        """).lstrip() % path
    raise DistutilsSetupError(msg)
command/test.py000064400000021776151733473700007542 0ustar00import os
import operator
import sys
import contextlib
import itertools
import unittest
from distutils.errors import DistutilsError, DistutilsOptionError
from distutils import log
from unittest import TestLoader

from setuptools.extern import six
from setuptools.extern.six.moves import map, filter

from pkg_resources import (resource_listdir, resource_exists, normalize_path,
                           working_set, _namespace_packages, evaluate_marker,
                           add_activation_listener, require, EntryPoint)
from setuptools import Command


class ScanningLoader(TestLoader):

    def __init__(self):
        TestLoader.__init__(self)
        self._visited = set()

    def loadTestsFromModule(self, module, pattern=None):
        """Return a suite of all tests cases contained in the given module

        If the module is a package, load tests from all the modules in it.
        If the module has an ``additional_tests`` function, call it and add
        the return value to the tests.
        """
        if module in self._visited:
            return None
        self._visited.add(module)

        tests = []
        tests.append(TestLoader.loadTestsFromModule(self, module))

        if hasattr(module, "additional_tests"):
            tests.append(module.additional_tests())

        if hasattr(module, '__path__'):
            for file in resource_listdir(module.__name__, ''):
                if file.endswith('.py') and file != '__init__.py':
                    submodule = module.__name__ + '.' + file[:-3]
                else:
                    if resource_exists(module.__name__, file + '/__init__.py'):
                        submodule = module.__name__ + '.' + file
                    else:
                        continue
                tests.append(self.loadTestsFromName(submodule))

        if len(tests) != 1:
            return self.suiteClass(tests)
        else:
            return tests[0]  # don't create a nested suite for only one return


# adapted from jaraco.classes.properties:NonDataProperty
class NonDataProperty(object):
    def __init__(self, fget):
        self.fget = fget

    def __get__(self, obj, objtype=None):
        if obj is None:
            return self
        return self.fget(obj)


class test(Command):
    """Command to run unit tests after in-place build"""

    description = "run unit tests after in-place build"

    user_options = [
        ('test-module=', 'm', "Run 'test_suite' in specified module"),
        ('test-suite=', 's',
         "Run single test, case or suite (e.g. 'module.test_suite')"),
        ('test-runner=', 'r', "Test runner to use"),
    ]

    def initialize_options(self):
        self.test_suite = None
        self.test_module = None
        self.test_loader = None
        self.test_runner = None

    def finalize_options(self):

        if self.test_suite and self.test_module:
            msg = "You may specify a module or a suite, but not both"
            raise DistutilsOptionError(msg)

        if self.test_suite is None:
            if self.test_module is None:
                self.test_suite = self.distribution.test_suite
            else:
                self.test_suite = self.test_module + ".test_suite"

        if self.test_loader is None:
            self.test_loader = getattr(self.distribution, 'test_loader', None)
        if self.test_loader is None:
            self.test_loader = "setuptools.command.test:ScanningLoader"
        if self.test_runner is None:
            self.test_runner = getattr(self.distribution, 'test_runner', None)

    @NonDataProperty
    def test_args(self):
        return list(self._test_args())

    def _test_args(self):
        if not self.test_suite and sys.version_info >= (2, 7):
            yield 'discover'
        if self.verbose:
            yield '--verbose'
        if self.test_suite:
            yield self.test_suite

    def with_project_on_sys_path(self, func):
        """
        Backward compatibility for project_on_sys_path context.
        """
        with self.project_on_sys_path():
            func()

    @contextlib.contextmanager
    def project_on_sys_path(self, include_dists=[]):
        with_2to3 = six.PY3 and getattr(self.distribution, 'use_2to3', False)

        if with_2to3:
            # If we run 2to3 we can not do this inplace:

            # Ensure metadata is up-to-date
            self.reinitialize_command('build_py', inplace=0)
            self.run_command('build_py')
            bpy_cmd = self.get_finalized_command("build_py")
            build_path = normalize_path(bpy_cmd.build_lib)

            # Build extensions
            self.reinitialize_command('egg_info', egg_base=build_path)
            self.run_command('egg_info')

            self.reinitialize_command('build_ext', inplace=0)
            self.run_command('build_ext')
        else:
            # Without 2to3 inplace works fine:
            self.run_command('egg_info')

            # Build extensions in-place
            self.reinitialize_command('build_ext', inplace=1)
            self.run_command('build_ext')

        ei_cmd = self.get_finalized_command("egg_info")

        old_path = sys.path[:]
        old_modules = sys.modules.copy()

        try:
            project_path = normalize_path(ei_cmd.egg_base)
            sys.path.insert(0, project_path)
            working_set.__init__()
            add_activation_listener(lambda dist: dist.activate())
            require('%s==%s' % (ei_cmd.egg_name, ei_cmd.egg_version))
            with self.paths_on_pythonpath([project_path]):
                yield
        finally:
            sys.path[:] = old_path
            sys.modules.clear()
            sys.modules.update(old_modules)
            working_set.__init__()

    @staticmethod
    @contextlib.contextmanager
    def paths_on_pythonpath(paths):
        """
        Add the indicated paths to the head of the PYTHONPATH environment
        variable so that subprocesses will also see the packages at
        these paths.

        Do this in a context that restores the value on exit.
        """
        nothing = object()
        orig_pythonpath = os.environ.get('PYTHONPATH', nothing)
        current_pythonpath = os.environ.get('PYTHONPATH', '')
        try:
            prefix = os.pathsep.join(paths)
            to_join = filter(None, [prefix, current_pythonpath])
            new_path = os.pathsep.join(to_join)
            if new_path:
                os.environ['PYTHONPATH'] = new_path
            yield
        finally:
            if orig_pythonpath is nothing:
                os.environ.pop('PYTHONPATH', None)
            else:
                os.environ['PYTHONPATH'] = orig_pythonpath

    @staticmethod
    def install_dists(dist):
        """
        Install the requirements indicated by self.distribution and
        return an iterable of the dists that were built.
        """
        ir_d = dist.fetch_build_eggs(dist.install_requires)
        tr_d = dist.fetch_build_eggs(dist.tests_require or [])
        er_d = dist.fetch_build_eggs(
            v for k, v in dist.extras_require.items()
            if k.startswith(':') and evaluate_marker(k[1:])
        )
        return itertools.chain(ir_d, tr_d, er_d)

    def run(self):
        installed_dists = self.install_dists(self.distribution)

        cmd = ' '.join(self._argv)
        if self.dry_run:
            self.announce('skipping "%s" (dry run)' % cmd)
            return

        self.announce('running "%s"' % cmd)

        paths = map(operator.attrgetter('location'), installed_dists)
        with self.paths_on_pythonpath(paths):
            with self.project_on_sys_path():
                self.run_tests()

    def run_tests(self):
        # Purge modules under test from sys.modules. The test loader will
        # re-import them from the build location. Required when 2to3 is used
        # with namespace packages.
        if six.PY3 and getattr(self.distribution, 'use_2to3', False):
            module = self.test_suite.split('.')[0]
            if module in _namespace_packages:
                del_modules = []
                if module in sys.modules:
                    del_modules.append(module)
                module += '.'
                for name in sys.modules:
                    if name.startswith(module):
                        del_modules.append(name)
                list(map(sys.modules.__delitem__, del_modules))

        test = unittest.main(
            None, None, self._argv,
            testLoader=self._resolve_as_ep(self.test_loader),
            testRunner=self._resolve_as_ep(self.test_runner),
            exit=False,
        )
        if not test.result.wasSuccessful():
            msg = 'Test failed: %s' % test.result
            self.announce(msg, log.ERROR)
            raise DistutilsError(msg)

    @property
    def _argv(self):
        return ['unittest'] + self.test_args

    @staticmethod
    def _resolve_as_ep(val):
        """
        Load the indicated attribute value, called, as a as if it were
        specified as an entry point.
        """
        if val is None:
            return
        parsed = EntryPoint.parse("x=" + val)
        return parsed.resolve()()
command/register.pyo000064400000001306151733473700010551 0ustar00�
�fc@s/ddljjZdejfd��YZdS(i����NtregistercBseZejjZd�ZRS(cCs!|jd�tjj|�dS(Ntegg_info(trun_commandtorigRtrun(tself((s?/usr/lib/python2.7/site-packages/setuptools/command/register.pyRs
(t__name__t
__module__RRt__doc__R(((s?/usr/lib/python2.7/site-packages/setuptools/command/register.pyRs(tdistutils.command.registertcommandRR(((s?/usr/lib/python2.7/site-packages/setuptools/command/register.pyt<module>scommand/sdist.pyc000064400000017217151733473700010047 0ustar00�
�fc@s�ddlmZddljjZddlZddlZddlZddl	Z	ddl
mZddlm
Z
ddlZeZdd�Zde
ejfd	��YZdS(
i����(tlogN(tsixi(tsdist_add_defaultstccs@x9tjd�D](}x|j�|�D]}|Vq)WqWdS(s%Find all files under revision controlssetuptools.file_findersN(t
pkg_resourcestiter_entry_pointstload(tdirnameteptitem((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pytwalk_revctrlstsdistcBs/eZdZd"ddddfd#gZiZd
ddd
gZed�eD��Zd�Z	d�Z
d�Zd�Ze
ejd���Zd�Zejd$kp�d%ejko�d&knp�d'ejko�d(knZer�eZnd�Zd�Zd�Zd�Zd�Zd �ZRS()s=Smart sdist that finds anything supported by revision controlsformats=s6formats for source distribution (comma-separated list)s	keep-temptks1keep the distribution tree around after creating sarchive file(s)s	dist-dir=tdsFdirectory to put the source distribution archive(s) in [default: dist]Rs.rsts.txts.mdccs|]}dj|�VqdS(s	README{0}N(tformat(t.0text((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pys	<genexpr>)scCs�|jd�|jd�}|j|_|jjtjj|jd��|j�x!|j	�D]}|j|�qaW|j
�t|jdg�}x<|j
D]1}dd|f}||kr�|j|�q�q�WdS(Ntegg_infosSOURCES.txtt
dist_filesRR(trun_commandtget_finalized_commandtfilelisttappendtostpathtjoinRtcheck_readmetget_sub_commandstmake_distributiontgetattrtdistributiont
archive_files(tselftei_cmdtcmd_nameRtfiletdata((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pytrun+s
"

cCstjj|�|j�dS(N(torigRtinitialize_optionst_default_to_gztar(R ((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyR'>scCs#tjdkrdSdg|_dS(Niiitbetaitgztar(iiiR)i(tsystversion_infotformats(R ((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyR(CscCs'|j��tjj|�WdQXdS(s%
        Workaround for #516
        N(t_remove_os_linkR&RR(R ((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyRIs
ccssddd��Y}ttd|�}y
t`Wntk
rBnXz	dVWd||k	rnttd|�nXdS(sG
        In a context, remove and restore os.link if it exists
        tNoValuecBseZRS((t__name__t
__module__(((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyR/WstlinkN((RRR2t	Exceptiontsetattr(R/torig_val((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyR.Ps

	cCs[ytjj|�Wn@tk
rVtj�\}}}|jjjdj	��nXdS(Nttemplate(
R&Rt
read_templateR3R+texc_infottb_nextttb_frametf_localstclose(R t_ttb((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyt__read_template_hackes
iiiiiicCs�|jj�r�|jd�}|jj|j��|jjs�xR|jD]D\}}}}|jjg|D]}tj	j
||�^ql�qJWq�ndS(sgetting python filestbuild_pyN(Rthas_pure_modulesRRtextendtget_source_filestinclude_package_datat
data_filesRRR(R R@R=tsrc_dirt	filenamestfilename((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyt_add_defaults_python|scCsOy*tjrtj|�n
t�j�Wntk
rJtjd�nXdS(Ns&data_files contains unexpected objects(RtPY2Rt_add_defaults_data_filestsupert	TypeErrorRtwarn(R ((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyRK�s	
cCsKxD|jD]}tjj|�r
dSq
W|jddj|j��dS(Ns,standard file not found: should have one of s, (tREADMESRRtexistsRNR(R tf((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyR�scCs�tjj|||�tjj|d�}ttd�rltjj|�rltj|�|j	d|�n|j
d�j|�dS(Ns	setup.cfgR2R(R&Rtmake_release_treeRRRthasattrRPtunlinkt	copy_fileRtsave_version_info(R tbase_dirtfilestdest((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyRR�s!
cCsStjj|j�stStj|jd��}|j�}WdQX|dj�kS(Ntrbs+# file GENERATED by distutils, do NOT edit
(	RRtisfiletmanifesttFalsetiotopentreadlinetencode(R tfpt
first_line((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyt_manifest_is_not_generated�scCs�tjd|j�t|jd�}x�|D]�}tjryy|jd�}Wqytk
rutjd|�q,qyXn|j	�}|j
d�s,|r�q,n|jj|�q,W|j
�dS(s�Read the manifest file (named by 'self.manifest') and use it to
        fill in 'self.filelist', the list of files to include in the source
        distribution.
        sreading manifest file '%s'RZsUTF-8s"%r not UTF-8 decodable -- skippingt#N(RtinfoR\R_RtPY3tdecodetUnicodeDecodeErrorRNtstript
startswithRRR<(R R\tline((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyt
read_manifest�s
	

N(sformats=Ns6formats for source distribution (comma-separated list)(s	dist-dir=R
sFdirectory to put the source distribution archive(s) in [default: dist](iii(ii(iii(ii(iii(R0R1t__doc__tNonetuser_optionstnegative_opttREADME_EXTENSIONSttupleROR%R'R(Rtstaticmethodt
contextlibtcontextmanagerR.t_sdist__read_template_hackR+R,thas_leaky_handleR7RIRKRRRRdRm(((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyRs:											
	
	
(t	distutilsRtdistutils.command.sdisttcommandRR&RR+R^Rutsetuptools.externRt
py36compatRRtlistt_default_revctrlR
(((s</usr/lib/python2.7/site-packages/setuptools/command/sdist.pyt<module>scommand/install.pyc000064400000011531151733473700010360 0ustar00�
�fc@s�ddlmZddlZddlZddlZddlZddljjZ	ddl
Z
e	jZde	jfd��YZge	jjD]Z
e
dejkr�e
^q�eje_dS(i����(tDistutilsArgErrorNtinstallcBs�eZdZejjddgZejjddgZdd�fdd�fgZe	e�Z
d	�Zd
�Zd�Z
d�Zed
��Zd�ZRS(s7Use easy_install to install the package, w/dependenciessold-and-unmanageablesTry not to use this!s!single-version-externally-manageds5used by system package builders to create 'flat' eggstinstall_egg_infocCstS(N(tTrue(tself((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyt<lambda>ttinstall_scriptscCstS(N(R(R((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyRRcCs&tjj|�d|_d|_dS(N(torigRtinitialize_optionstNonetold_and_unmanageablet!single_version_externally_managed(R((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyR	 s	cCsXtjj|�|jr%t|_n/|jrT|jrT|jrTtd��qTndS(NsAYou must specify --record or --root when building system packages(RRtfinalize_optionstrootRRtrecordR(R((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyR
%s		cCs8|js|jr"tjj|�Sd|_d|_dS(NR(RRRRthandle_extra_pathR
t	path_filet
extra_dirs(R((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyR0s	cCsX|js|jr"tjj|�S|jtj��sJtjj|�n
|j�dS(N(	RRRRtrunt_called_from_setuptinspecttcurrentframetdo_egg_install(R((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyR:s
cCs�|d
krKd}tj|�tj�dkrGd}tj|�ntStj|�d}|d \}tj|�}|j	j
dd�}|dko�|jd	kS(s�
        Attempt to detect whether run() was called from setup() or by another
        command.  If called by setup(), the parent caller will be the
        'run_command' method in 'distutils.dist', and *its* caller will be
        the 'run_commands' method.  If called any other way, the
        immediate caller *might* be 'run_command', but it won't have been
        called by 'run_commands'. Return True in that case or if a call stack
        is unavailable. Return False otherwise.
        s4Call stack not available. bdist_* commands may fail.t
IronPythons6For best results, pass -X:Frames to enable call stack.iit__name__Rsdistutils.disttrun_commandsN(R
twarningstwarntplatformtpython_implementationRRtgetouterframestgetframeinfot	f_globalstgettfunction(t	run_frametmsgtrestcallertinfot
caller_module((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyREs

cCs�|jjd�}||jddd|jd|j�}|j�d|_|jjtjd��|j	d�|jj
d�jg}tj
r�|jd	tj
�n||_|j�dt_
dS(
Nteasy_installtargstxRRt.s*.eggt	bdist_eggi(tdistributiontget_command_classRRtensure_finalizedtalways_copy_fromt
package_indextscantglobtrun_commandtget_command_objt
egg_outputt
setuptoolstbootstrap_install_fromtinsertR+RR
(RR*tcmdR+((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyR`s$
	
		
N(sold-and-unmanageableNsTry not to use this!(s!single-version-externally-managedNs5used by system package builders to create 'flat' eggs(Rt
__module__t__doc__RRtuser_optionsR
tboolean_optionstnew_commandstdictt_ncR	R
RRtstaticmethodRR(((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyRs 	
	
			
	i(tdistutils.errorsRRR5RRtdistutils.command.installtcommandRRR9t_installtsub_commandsR<RCRA(((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyt<module>s	l/command/upload.pyc000064400000003144151733473700010177 0ustar00�
�fc@s9ddlZddlmZdejfd��YZdS(i����N(tuploadRcBs)eZdZd�Zd�Zd�ZRS(sa
    Override default upload behavior to obtain password
    in a variety of different ways.
    cCsPtjj|�|jp"tj�|_|jpF|j�pF|j�|_dS(N(	torigRtfinalize_optionstusernametgetpasstgetusertpasswordt_load_password_from_keyringt_prompt_for_password(tself((s=/usr/lib/python2.7/site-packages/setuptools/command/upload.pyRs		cCs>y&td�}|j|j|j�SWntk
r9nXdS(sM
        Attempt to load password from keyring. Suppress Exceptions.
        tkeyringN(t
__import__tget_passwordt
repositoryRt	Exception(R	R
((s=/usr/lib/python2.7/site-packages/setuptools/command/upload.pyRs

cCs,ytj�SWnttfk
r'nXdS(sH
        Prompt for a password on the tty. Suppress Exceptions.
        N(RRtKeyboardInterrupt(R	((s=/usr/lib/python2.7/site-packages/setuptools/command/upload.pyR#s(t__name__t
__module__t__doc__RRR(((s=/usr/lib/python2.7/site-packages/setuptools/command/upload.pyRs		
(Rtdistutils.commandRR(((s=/usr/lib/python2.7/site-packages/setuptools/command/upload.pyt<module>scommand/py36compat.pyc000064400000012656151733473700010730 0ustar00�
�fc@s�ddlZddlmZddlmZddlmZddlmZdd
d��YZe	ejd�r�ddd	��YZndS(i����N(tglob(tconvert_path(tsdist(tfiltertsdist_add_defaultscBseeZdZd�Zed��Zd�Zd�Zd�Zd�Z	d�Z
d�Zd	�ZRS(
s�
    Mix-in providing forward-compatibility for functionality as found in
    distutils on Python 3.7.

    Do not edit the code in this class except to update functionality
    as implemented in distutils. Instead, override in the subclass.
    cCsJ|j�|j�|j�|j�|j�|j�|j�dS(s9Add all the default files to self.filelist:
          - README or README.txt
          - setup.py
          - test/test*.py
          - all pure Python modules mentioned in setup script
          - all files pointed by package_data (build_py)
          - all files defined in data_files.
          - all files defined as scripts.
          - all C sources listed as part of extensions or C libraries
            in the setup script (doesn't catch C headers!)
        Warns if (README or README.txt) or setup.py are missing; everything
        else is optional.
        N(t_add_defaults_standardst_add_defaults_optionalt_add_defaults_pythont_add_defaults_data_filest_add_defaults_extt_add_defaults_c_libst_add_defaults_scripts(tself((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pytadd_defaultss





cCsStjj|�stStjj|�}tjj|�\}}|tj|�kS(s�
        Case-sensitive path existence check

        >>> sdist_add_defaults._cs_path_exists(__file__)
        True
        >>> sdist_add_defaults._cs_path_exists(__file__.upper())
        False
        (tostpathtexiststFalsetabspathtsplittlistdir(tfspathRt	directorytfilename((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyt_cs_path_exists(s

cCs�|j|jjg}x�|D]�}t|t�r�|}t}x7|D]/}|j|�rDt}|jj	|�PqDqDW|s�|j
ddj|��q�q|j|�r�|jj	|�q|j
d|�qWdS(Ns,standard file not found: should have one of s, sstandard file '%s' not found(tREADMEStdistributiontscript_namet
isinstancettupleRRtTruetfilelisttappendtwarntjoin(Rt	standardstfntaltstgot_it((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyR9s 

	cCsLddg}x9|D]1}ttjjt|��}|jj|�qWdS(Ns
test/test*.pys	setup.cfg(RRRtisfileRRtextend(Rtoptionaltpatterntfiles((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyRNs
cCs�|jd�}|jj�r7|jj|j��nxM|jD]B\}}}}x-|D]%}|jjtj	j
||��qZWqAWdS(Ntbuild_py(tget_finalized_commandRthas_pure_modulesRR(tget_source_filest
data_filesR RRR"(RR,tpkgtsrc_dirt	build_dirt	filenamesR((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyRTs
cCs�|jj�r�x�|jjD]�}t|t�ret|�}tjj|�r�|j	j
|�q�q|\}}x?|D]7}t|�}tjj|�rx|j	j
|�qxqxWqWndS(N(Rthas_data_filesR0RtstrRRRR'RR (RtitemtdirnameR4tf((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyRds
cCs;|jj�r7|jd�}|jj|j��ndS(Nt	build_ext(Rthas_ext_modulesR-RR(R/(RR:((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyR	uscCs;|jj�r7|jd�}|jj|j��ndS(Nt
build_clib(Rthas_c_librariesR-RR(R/(RR<((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyR
zscCs;|jj�r7|jd�}|jj|j��ndS(Nt
build_scripts(Rthas_scriptsR-RR(R/(RR>((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyRs(
t__name__t
__module__t__doc__R
tstaticmethodRRRRRR	R
R(((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyR	s							RcBseZRS((R@RA(((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyR�s(((
RRtdistutils.utilRtdistutils.commandRtsetuptools.extern.six.movesRRthasattr(((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyt<module>s|command/install_lib.pyo000064400000011330151733473710011220 0ustar00�
�fc@s]ddlZddlZddlmZmZddljjZdejfd��YZdS(i����N(tproducttstarmaptinstall_libcBsneZdZd�Zd�Zd�Zed��Zd�Zed��Z	ddddd	�Z
d
�ZRS(s9Don't add compiled flags to filenames of non-Python filescCs6|j�|j�}|dk	r2|j|�ndS(N(tbuildtinstalltNonetbyte_compile(tselftoutfiles((sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pytrun
s
csG�fd��j�D�}t|�j��}tt�j|��S(s�
        Return a collections.Sized collections.Container of paths to be
        excluded for single_version_externally_managed installations.
        c3s+|]!}�j|�D]}|VqqdS(N(t
_all_packages(t.0tns_pkgtpkg(R(sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pys	<genexpr>s(t_get_SVEM_NSPsRt_gen_exclusion_pathstsetRt_exclude_pkg_path(Rtall_packagest
excl_specs((RsB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pytget_exclusionsscCs,|jd�|g}tjj|j|�S(sw
        Given a package name and exclusion path within that package,
        compute the full exclusion path.
        t.(tsplittostpathtjointinstall_dir(RR
texclusion_pathtparts((sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pyRsccs.x'|r)|V|jd�\}}}qWdS(sn
        >>> list(install_lib._all_packages('foo.bar.baz'))
        ['foo.bar.baz', 'foo.bar', 'foo']
        RN(t
rpartition(tpkg_nametseptchild((sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pyR
's	cCs<|jjsgS|jd�}|j}|r8|jjSgS(s�
        Get namespace packages (list) but only for
        single_version_externally_managed installations and empty otherwise.
        R(tdistributiontnamespace_packagestget_finalized_commandt!single_version_externally_managed(Rtinstall_cmdtsvem((sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pyR1s
	ccsidVdVdVttd�s"dStjjddtj��}|dV|d	V|d
V|dVdS(sk
        Generate file paths to be excluded for namespace packages (bytecode
        cache files).
        s__init__.pys__init__.pycs__init__.pyotget_tagNt__pycache__s	__init__.s.pycs.pyos
.opt-1.pycs
.opt-2.pyc(thasattrtimpRRRR'(tbase((sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pyRAs			iic	sw|j���s(tjj|||�Sddlm}ddlm�g����fd�}||||��S(Ni����(tunpack_directory(tlogcsP|�kr �jd|�tS�jd|tjj|���j|�|S(Ns/Skipping installation of %s (namespace package)scopying %s -> %s(twarntFalsetinfoRRtdirnametappend(tsrctdst(texcludeR-R(sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pytpfgs	
(RtorigRt	copy_treetsetuptools.archive_utilR,t	distutilsR-(	Rtinfiletoutfilet
preserve_modetpreserve_timestpreserve_symlinkstlevelR,R6((R5R-RsB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pyR8Vs
cCsKtjj|�}|j�}|rGg|D]}||kr+|^q+S|S(N(R7Rtget_outputsR(RtoutputsR5tf((sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pyRAts
#(t__name__t
__module__t__doc__R	RRtstaticmethodR
RRR8RA(((sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pyRs			
	(	RR*t	itertoolsRRtdistutils.command.install_libtcommandRR7(((sB/usr/lib/python2.7/site-packages/setuptools/command/install_lib.pyt<module>scommand/__init__.pyo000064400000001562151733473710010471 0ustar00�
�fc@s�dddddddddd	d
ddd
dddddddddgZddlmZddlZddlmZdejkr�dejd<ejjd�n[[dS(taliast	bdist_eggt	bdist_rpmt	build_exttbuild_pytdevelopteasy_installtegg_infotinstalltinstall_libtrotatetsaveoptstsdisttsetoptttesttinstall_egg_infotinstall_scriptstregistert
bdist_wininsttupload_docstuploadt
build_clibt	dist_infoi����(tbdistN(RteggsPython .egg file(RsPython .egg file(	t__all__tdistutils.command.bdistRtsystsetuptools.commandRtformat_commandstformat_commandtappend(((s?/usr/lib/python2.7/site-packages/setuptools/command/__init__.pyt<module>s	
command/setopt.pyo000064400000013642151733473710010252 0ustar00�
�fc@s�ddlmZddlmZddlmZddlZddlZddlmZddl	m
Z
ddd	d
gZdd�Ze
d
�Zd	e
fd��YZd
efd��YZdS(i����(tconvert_path(tlog(tDistutilsOptionErrorN(tconfigparser(tCommandtconfig_filetedit_configtoption_basetsetopttlocalcCs�|dkrdS|dkr>tjjtjjtj�d�S|dkrtjdkr_dpbd}tjjtd	|��St	d
|��dS(s�Get the filename of the distutils, local, global, or per-user config

    `kind` must be one of "local", "global", or "user"
    R	s	setup.cfgtglobals
distutils.cfgtusertposixt.ts~/%spydistutils.cfgs7config_file() type must be 'local', 'global', or 'user'N(
tostpathtjointdirnamet	distutilst__file__tnamet
expanduserRt
ValueError(tkindtdot((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pyRs	c	Cs�tjd|�tj�}|j|g�x+|j�D]\}}|d	krttjd||�|j|�q9|j	|�s�tjd||�|j
|�nx�|j�D]�\}}|d	kr&tjd|||�|j||�|j|�sRtjd||�|j|�qRq�tjd||||�|j
|||�q�Wq9Wtjd|�|s�t|d��}|j|�Wd	QXnd	S(
sYEdit a configuration file to include `settings`

    `settings` is a dictionary of dictionaries or ``None`` values, keyed by
    command/section name.  A ``None`` value means to delete the entire section,
    while a dictionary lists settings to be changed or deleted in that section.
    A setting of ``None`` means to delete that setting.
    sReading configuration from %ssDeleting section [%s] from %ssAdding new section [%s] to %ssDeleting %s.%s from %ss#Deleting empty [%s] section from %ssSetting %s.%s to %r in %ss
Writing %stwN(RtdebugRtRawConfigParsertreadtitemstNonetinfotremove_sectionthas_sectiontadd_sectiont
remove_optiontoptionstsettopentwrite(	tfilenametsettingstdry_runtoptstsectionR%toptiontvaluetf((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pyR!s8
	
cBs;eZdZdd
dgZddgZd
�Zd�ZRS(s<Abstract base class for commands that mess with config filess
global-configtgs0save options to the site-wide distutils.cfg filesuser-configtus7save options to the current user's pydistutils.cfg files	filename=R0s-configuration file to use (default=setup.cfg)cCsd|_d|_d|_dS(N(Rt
global_configtuser_configR)(tself((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pytinitialize_options\s		cCs�g}|jr%|jtd��n|jrD|jtd��n|jdk	rf|j|j�n|s�|jtd��nt|�dkr�td|��n|\|_dS(NR
RR	is/Must specify only one configuration file option(R3tappendRR4R)RtlenR(R5t	filenames((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pytfinalize_optionsas		(s
global-configR1s0save options to the site-wide distutils.cfg file(suser-configR2s7save options to the current user's pydistutils.cfg file(s	filename=R0s-configuration file to use (default=setup.cfg)(t__name__t
__module__t__doc__tuser_optionstboolean_optionsR6R:(((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pyRLs		cBsXeZdZdZddddgejZejdgZd�Zd�Zd�Z	RS(s#Save command-line options to a files1set an option in setup.cfg or another config filescommand=tcscommand to set an option forsoption=tos
option to sets
set-value=tssvalue of the optiontremovetrsremove (unset) the valuecCs5tj|�d|_d|_d|_d|_dS(N(RR6RtcommandR.t	set_valueRC(R5((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pyR6�s

			cCsftj|�|jdks+|jdkr:td��n|jdkrb|jrbtd��ndS(Ns%Must specify --command *and* --options$Must specify --set-value or --remove(RR:RERR.RRFRC(R5((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pyR:�s

cCs=t|jii|j|jjdd�6|j6|j�dS(Nt-t_(RR)RFR.treplaceRER+(R5((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pytrun�s	#(scommand=R@scommand to set an option for(soption=RAs
option to set(s
set-value=RBsvalue of the option(RCRDsremove (unset) the value(
R;R<R=tdescriptionRR>R?R6R:RJ(((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pyRss
		(tdistutils.utilRRRtdistutils.errorsRRtsetuptools.extern.six.movesRt
setuptoolsRt__all__RtFalseRRR(((s=/usr/lib/python2.7/site-packages/setuptools/command/setopt.pyt<module>s+'command/bdist_rpm.pyo000064400000003572151733473710010720 0ustar00�
�fc@s/ddljjZdejfd��YZdS(i����Nt	bdist_rpmcBs eZdZd�Zd�ZRS(sf
    Override the default bdist_rpm behavior to do the following:

    1. Run egg_info to ensure the name and version are properly calculated.
    2. Always run 'install' using --single-version-externally-managed to
       disable eggs in RPM distributions.
    3. Replace dash with underscore in the version numbers for better RPM
       compatibility.
    cCs!|jd�tjj|�dS(Ntegg_info(trun_commandtorigRtrun(tself((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_rpm.pyRs
c	Cs�|jj�}|jdd�}tjj|�}d|}d|}g|D]<}|jdd�jdd�jdd	�j||�^qN}|j|�d
}d|}|j||�|S(Nt-t_s%define version sSource0: %{name}-%{version}.tars)Source0: %{name}-%{unmangled_version}.tarssetup.py install s5setup.py install --single-version-externally-managed s%setups&%setup -n %{name}-%{unmangled_version}is%define unmangled_version (tdistributiontget_versiontreplaceRRt_make_spec_filetindextinsert(	Rtversiont
rpmversiontspectline23tline24tlinet
insert_loctunmangled_version((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_rpm.pyRs


F
(t__name__t
__module__t__doc__RR(((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_rpm.pyRs		(tdistutils.command.bdist_rpmtcommandRR(((s@/usr/lib/python2.7/site-packages/setuptools/command/bdist_rpm.pyt<module>scommand/bdist_wininst.pyo000064400000002247151733473710011613 0ustar00�
�fc@s/ddljjZdejfd��YZdS(i����Nt
bdist_wininstcBseZdd�Zd�ZRS(icCs1|jj||�}|dkr-d|_n|S(sj
        Supplement reinitialize_command to work around
        http://bugs.python.org/issue20819
        tinstalltinstall_lib(RRN(tdistributiontreinitialize_commandtNoneR(tselftcommandtreinit_subcommandstcmd((sD/usr/lib/python2.7/site-packages/setuptools/command/bdist_wininst.pyRs
	cCs.t|_ztjj|�Wdt|_XdS(N(tTruet_is_runningtorigRtruntFalse(R((sD/usr/lib/python2.7/site-packages/setuptools/command/bdist_wininst.pyR
s	(t__name__t
__module__RR
(((sD/usr/lib/python2.7/site-packages/setuptools/command/bdist_wininst.pyRs(tdistutils.command.bdist_wininstRRR(((sD/usr/lib/python2.7/site-packages/setuptools/command/bdist_wininst.pyt<module>scommand/py36compat.pyo000064400000012656151733473710010745 0ustar00�
�fc@s�ddlZddlmZddlmZddlmZddlmZdd
d��YZe	ejd�r�ddd	��YZndS(i����N(tglob(tconvert_path(tsdist(tfiltertsdist_add_defaultscBseeZdZd�Zed��Zd�Zd�Zd�Zd�Z	d�Z
d�Zd	�ZRS(
s�
    Mix-in providing forward-compatibility for functionality as found in
    distutils on Python 3.7.

    Do not edit the code in this class except to update functionality
    as implemented in distutils. Instead, override in the subclass.
    cCsJ|j�|j�|j�|j�|j�|j�|j�dS(s9Add all the default files to self.filelist:
          - README or README.txt
          - setup.py
          - test/test*.py
          - all pure Python modules mentioned in setup script
          - all files pointed by package_data (build_py)
          - all files defined in data_files.
          - all files defined as scripts.
          - all C sources listed as part of extensions or C libraries
            in the setup script (doesn't catch C headers!)
        Warns if (README or README.txt) or setup.py are missing; everything
        else is optional.
        N(t_add_defaults_standardst_add_defaults_optionalt_add_defaults_pythont_add_defaults_data_filest_add_defaults_extt_add_defaults_c_libst_add_defaults_scripts(tself((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pytadd_defaultss





cCsStjj|�stStjj|�}tjj|�\}}|tj|�kS(s�
        Case-sensitive path existence check

        >>> sdist_add_defaults._cs_path_exists(__file__)
        True
        >>> sdist_add_defaults._cs_path_exists(__file__.upper())
        False
        (tostpathtexiststFalsetabspathtsplittlistdir(tfspathRt	directorytfilename((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyt_cs_path_exists(s

cCs�|j|jjg}x�|D]�}t|t�r�|}t}x7|D]/}|j|�rDt}|jj	|�PqDqDW|s�|j
ddj|��q�q|j|�r�|jj	|�q|j
d|�qWdS(Ns,standard file not found: should have one of s, sstandard file '%s' not found(tREADMEStdistributiontscript_namet
isinstancettupleRRtTruetfilelisttappendtwarntjoin(Rt	standardstfntaltstgot_it((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyR9s 

	cCsLddg}x9|D]1}ttjjt|��}|jj|�qWdS(Ns
test/test*.pys	setup.cfg(RRRtisfileRRtextend(Rtoptionaltpatterntfiles((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyRNs
cCs�|jd�}|jj�r7|jj|j��nxM|jD]B\}}}}x-|D]%}|jjtj	j
||��qZWqAWdS(Ntbuild_py(tget_finalized_commandRthas_pure_modulesRR(tget_source_filest
data_filesR RRR"(RR,tpkgtsrc_dirt	build_dirt	filenamesR((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyRTs
cCs�|jj�r�x�|jjD]�}t|t�ret|�}tjj|�r�|j	j
|�q�q|\}}x?|D]7}t|�}tjj|�rx|j	j
|�qxqxWqWndS(N(Rthas_data_filesR0RtstrRRRR'RR (RtitemtdirnameR4tf((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyRds
cCs;|jj�r7|jd�}|jj|j��ndS(Nt	build_ext(Rthas_ext_modulesR-RR(R/(RR:((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyR	uscCs;|jj�r7|jd�}|jj|j��ndS(Nt
build_clib(Rthas_c_librariesR-RR(R/(RR<((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyR
zscCs;|jj�r7|jd�}|jj|j��ndS(Nt
build_scripts(Rthas_scriptsR-RR(R/(RR>((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyRs(
t__name__t
__module__t__doc__R
tstaticmethodRRRRRR	R
R(((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyR	s							RcBseZRS((R@RA(((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyR�s(((
RRtdistutils.utilRtdistutils.commandRtsetuptools.extern.six.movesRRthasattr(((sA/usr/lib/python2.7/site-packages/setuptools/command/py36compat.pyt<module>s|command/build_clib.pyo000064400000005434151733473710011024 0ustar00�
�fc@s_ddljjZddlmZddlmZddlm	Z	dejfd��YZdS(i����N(tDistutilsSetupError(tlog(tnewer_pairwise_groupt
build_clibcBseZdZd�ZRS(sv
    Override the default build_clib behaviour to do the following:

    1. Implement a rudimentary timestamp-based dependency system
       so 'compile()' doesn't run every time.
    2. Add more keys to the 'build_info' dictionary:
        * obj_deps - specify dependencies for each object compiled.
                     this should be a dictionary mapping a key
                     with the source filename to a list of
                     dependencies. Use an empty string for global
                     dependencies.
        * cflags   - specify a list of additional flags to pass to
                     the compiler.
    c
Cs4x-|D]%\}}|jd�}|dksDt|ttf�rWtd|��nt|�}tjd|�|jdt��}t|t�s�td|��ng}|jdt��}t|ttf�s�td|��nx{|D]s}|g}	|	j	|�|j|t��}
t|
ttf�sMtd|��n|	j	|
�|j
|	�q�W|jj|d|j
�}t||�ggfkr|jd�}|jd	�}
|jd
�}|jj|d|j
d|d	|
d|d|j�}n|jj||d|jd|j�qWdS(
Ntsourcessfin 'libraries' option (library '%s'), 'sources' must be present and must be a list of source filenamessbuilding '%s' librarytobj_depss\in 'libraries' option (library '%s'), 'obj_deps' must be a dictionary of type 'source: list'tt
output_dirtmacrostinclude_dirstcflagstextra_postargstdebug(tgettNonet
isinstancetlistttupleRRtinfotdicttextendtappendtcompilertobject_filenamest
build_tempRtcompileRtcreate_static_libR(tselft	librariestlib_namet
build_infoRRtdependenciestglobal_depstsourcetsrc_depst
extra_depstexpected_objectsRR	R
tobjects((sA/usr/lib/python2.7/site-packages/setuptools/command/build_clib.pytbuild_librariess`"



	


					(t__name__t
__module__t__doc__R&(((sA/usr/lib/python2.7/site-packages/setuptools/command/build_clib.pyRs(
tdistutils.command.build_clibtcommandRtorigtdistutils.errorsRt	distutilsRtsetuptools.dep_utilR(((sA/usr/lib/python2.7/site-packages/setuptools/command/build_clib.pyt<module>scommand/install_scripts.pyc000064400000005513151733473710012133 0ustar00�
�fc@ssddlmZddljjZddlZddlZddlm	Z	m
Z
mZdejfd��YZdS(i����(tlogN(tDistributiontPathMetadatatensure_directorytinstall_scriptscBs,eZdZd�Zd�Zdd�ZRS(s;Do normal script install, plus any egg_info wrapper scriptscCstjj|�t|_dS(N(torigRtinitialize_optionstFalsetno_ep(tself((sF/usr/lib/python2.7/site-packages/setuptools/command/install_scripts.pyRscCsfddljj}|jd�|jjr>tjj|�n	g|_	|j
rTdS|jd�}t|j
t|j
|j�|j|j�}|jd�}t|dd�}|jd�}t|dt�}|j}|r�d}|j}n|tjkr|g}n|j�}|jj�j|�}	x-|j||	j��D]}
|j|
�qKWdS(Ni����tegg_infot
build_scriptst
executablet
bdist_wininstt_is_runnings
python.exe(tsetuptools.command.easy_installtcommandteasy_installtrun_commandtdistributiontscriptsRRtruntoutfilesRtget_finalized_commandRtegg_baseRR
tegg_nametegg_versiontgetattrtNoneRtScriptWritertWindowsScriptWritertsysRtbesttcommand_spec_classt
from_paramtget_argst	as_headertwrite_script(R	teitei_cmdtdisttbs_cmdt
exec_paramtbw_cmdt
is_wininsttwritertcmdtargs((sF/usr/lib/python2.7/site-packages/setuptools/command/install_scripts.pyRs2
			ttc
Gs�ddlm}m}tjd||j�tjj|j|�}|j	j
|�|�}|js�t|�t
|d|�}	|	j|�|	j�||d|�ndS(s1Write an executable file to the scripts directoryi����(tchmodt
current_umasksInstalling %s script to %stwi�N(RR1R2Rtinfotinstall_dirtostpathtjoinRtappendtdry_runRtopentwritetclose(
R	tscript_nametcontentstmodetignoredR1R2ttargettmasktf((sF/usr/lib/python2.7/site-packages/setuptools/command/install_scripts.pyR%3s		


(t__name__t
__module__t__doc__RRR%(((sF/usr/lib/python2.7/site-packages/setuptools/command/install_scripts.pyR	s		#(t	distutilsRt!distutils.command.install_scriptsRRRR6Rt
pkg_resourcesRRR(((sF/usr/lib/python2.7/site-packages/setuptools/command/install_scripts.pyt<module>s
command/build_ext.py000064400000031565151733473710010540 0ustar00import os
import sys
import itertools
import imp
from distutils.command.build_ext import build_ext as _du_build_ext
from distutils.file_util import copy_file
from distutils.ccompiler import new_compiler
from distutils.sysconfig import customize_compiler, get_config_var
from distutils.errors import DistutilsError
from distutils import log

from setuptools.extension import Library
from setuptools.extern import six

try:
    # Attempt to use Cython for building extensions, if available
    from Cython.Distutils.build_ext import build_ext as _build_ext
    # Additionally, assert that the compiler module will load
    # also. Ref #1229.
    __import__('Cython.Compiler.Main')
except ImportError:
    _build_ext = _du_build_ext

# make sure _config_vars is initialized
get_config_var("LDSHARED")
from distutils.sysconfig import _config_vars as _CONFIG_VARS


def _customize_compiler_for_shlib(compiler):
    if sys.platform == "darwin":
        # building .dylib requires additional compiler flags on OSX; here we
        # temporarily substitute the pyconfig.h variables so that distutils'
        # 'customize_compiler' uses them before we build the shared libraries.
        tmp = _CONFIG_VARS.copy()
        try:
            # XXX Help!  I don't have any idea whether these are right...
            _CONFIG_VARS['LDSHARED'] = (
                "gcc -Wl,-x -dynamiclib -undefined dynamic_lookup")
            _CONFIG_VARS['CCSHARED'] = " -dynamiclib"
            _CONFIG_VARS['SO'] = ".dylib"
            customize_compiler(compiler)
        finally:
            _CONFIG_VARS.clear()
            _CONFIG_VARS.update(tmp)
    else:
        customize_compiler(compiler)


have_rtld = False
use_stubs = False
libtype = 'shared'

if sys.platform == "darwin":
    use_stubs = True
elif os.name != 'nt':
    try:
        import dl
        use_stubs = have_rtld = hasattr(dl, 'RTLD_NOW')
    except ImportError:
        pass

if_dl = lambda s: s if have_rtld else ''


def get_abi3_suffix():
    """Return the file extension for an abi3-compliant Extension()"""
    for suffix, _, _ in (s for s in imp.get_suffixes() if s[2] == imp.C_EXTENSION):
        if '.abi3' in suffix:  # Unix
            return suffix
        elif suffix == '.pyd':  # Windows
            return suffix


class build_ext(_build_ext):
    def run(self):
        """Build extensions in build directory, then copy if --inplace"""
        old_inplace, self.inplace = self.inplace, 0
        _build_ext.run(self)
        self.inplace = old_inplace
        if old_inplace:
            self.copy_extensions_to_source()

    def copy_extensions_to_source(self):
        build_py = self.get_finalized_command('build_py')
        for ext in self.extensions:
            fullname = self.get_ext_fullname(ext.name)
            filename = self.get_ext_filename(fullname)
            modpath = fullname.split('.')
            package = '.'.join(modpath[:-1])
            package_dir = build_py.get_package_dir(package)
            dest_filename = os.path.join(package_dir,
                                         os.path.basename(filename))
            src_filename = os.path.join(self.build_lib, filename)

            # Always copy, even if source is older than destination, to ensure
            # that the right extensions for the current Python/platform are
            # used.
            copy_file(
                src_filename, dest_filename, verbose=self.verbose,
                dry_run=self.dry_run
            )
            if ext._needs_stub:
                self.write_stub(package_dir or os.curdir, ext, True)

    def get_ext_filename(self, fullname):
        filename = _build_ext.get_ext_filename(self, fullname)
        if fullname in self.ext_map:
            ext = self.ext_map[fullname]
            use_abi3 = (
                six.PY3
                and getattr(ext, 'py_limited_api')
                and get_abi3_suffix()
            )
            if use_abi3:
                so_ext = _get_config_var_837('EXT_SUFFIX')
                filename = filename[:-len(so_ext)]
                filename = filename + get_abi3_suffix()
            if isinstance(ext, Library):
                fn, ext = os.path.splitext(filename)
                return self.shlib_compiler.library_filename(fn, libtype)
            elif use_stubs and ext._links_to_dynamic:
                d, fn = os.path.split(filename)
                return os.path.join(d, 'dl-' + fn)
        return filename

    def initialize_options(self):
        _build_ext.initialize_options(self)
        self.shlib_compiler = None
        self.shlibs = []
        self.ext_map = {}

    def finalize_options(self):
        _build_ext.finalize_options(self)
        self.extensions = self.extensions or []
        self.check_extensions_list(self.extensions)
        self.shlibs = [ext for ext in self.extensions
                       if isinstance(ext, Library)]
        if self.shlibs:
            self.setup_shlib_compiler()
        for ext in self.extensions:
            ext._full_name = self.get_ext_fullname(ext.name)
        for ext in self.extensions:
            fullname = ext._full_name
            self.ext_map[fullname] = ext

            # distutils 3.1 will also ask for module names
            # XXX what to do with conflicts?
            self.ext_map[fullname.split('.')[-1]] = ext

            ltd = self.shlibs and self.links_to_dynamic(ext) or False
            ns = ltd and use_stubs and not isinstance(ext, Library)
            ext._links_to_dynamic = ltd
            ext._needs_stub = ns
            filename = ext._file_name = self.get_ext_filename(fullname)
            libdir = os.path.dirname(os.path.join(self.build_lib, filename))
            if ltd and libdir not in ext.library_dirs:
                ext.library_dirs.append(libdir)
            if ltd and use_stubs and os.curdir not in ext.runtime_library_dirs:
                ext.runtime_library_dirs.append(os.curdir)

    def setup_shlib_compiler(self):
        compiler = self.shlib_compiler = new_compiler(
            compiler=self.compiler, dry_run=self.dry_run, force=self.force
        )
        _customize_compiler_for_shlib(compiler)

        if self.include_dirs is not None:
            compiler.set_include_dirs(self.include_dirs)
        if self.define is not None:
            # 'define' option is a list of (name,value) tuples
            for (name, value) in self.define:
                compiler.define_macro(name, value)
        if self.undef is not None:
            for macro in self.undef:
                compiler.undefine_macro(macro)
        if self.libraries is not None:
            compiler.set_libraries(self.libraries)
        if self.library_dirs is not None:
            compiler.set_library_dirs(self.library_dirs)
        if self.rpath is not None:
            compiler.set_runtime_library_dirs(self.rpath)
        if self.link_objects is not None:
            compiler.set_link_objects(self.link_objects)

        # hack so distutils' build_extension() builds a library instead
        compiler.link_shared_object = link_shared_object.__get__(compiler)

    def get_export_symbols(self, ext):
        if isinstance(ext, Library):
            return ext.export_symbols
        return _build_ext.get_export_symbols(self, ext)

    def build_extension(self, ext):
        ext._convert_pyx_sources_to_lang()
        _compiler = self.compiler
        try:
            if isinstance(ext, Library):
                self.compiler = self.shlib_compiler
            _build_ext.build_extension(self, ext)
            if ext._needs_stub:
                cmd = self.get_finalized_command('build_py').build_lib
                self.write_stub(cmd, ext)
        finally:
            self.compiler = _compiler

    def links_to_dynamic(self, ext):
        """Return true if 'ext' links to a dynamic lib in the same package"""
        # XXX this should check to ensure the lib is actually being built
        # XXX as dynamic, and not just using a locally-found version or a
        # XXX static-compiled version
        libnames = dict.fromkeys([lib._full_name for lib in self.shlibs])
        pkg = '.'.join(ext._full_name.split('.')[:-1] + [''])
        return any(pkg + libname in libnames for libname in ext.libraries)

    def get_outputs(self):
        return _build_ext.get_outputs(self) + self.__get_stubs_outputs()

    def __get_stubs_outputs(self):
        # assemble the base name for each extension that needs a stub
        ns_ext_bases = (
            os.path.join(self.build_lib, *ext._full_name.split('.'))
            for ext in self.extensions
            if ext._needs_stub
        )
        # pair each base with the extension
        pairs = itertools.product(ns_ext_bases, self.__get_output_extensions())
        return list(base + fnext for base, fnext in pairs)

    def __get_output_extensions(self):
        yield '.py'
        yield '.pyc'
        if self.get_finalized_command('build_py').optimize:
            yield '.pyo'

    def write_stub(self, output_dir, ext, compile=False):
        log.info("writing stub loader for %s to %s", ext._full_name,
                 output_dir)
        stub_file = (os.path.join(output_dir, *ext._full_name.split('.')) +
                     '.py')
        if compile and os.path.exists(stub_file):
            raise DistutilsError(stub_file + " already exists! Please delete.")
        if not self.dry_run:
            f = open(stub_file, 'w')
            f.write(
                '\n'.join([
                    "def __bootstrap__():",
                    "   global __bootstrap__, __file__, __loader__",
                    "   import sys, os, pkg_resources, imp" + if_dl(", dl"),
                    "   __file__ = pkg_resources.resource_filename"
                    "(__name__,%r)"
                    % os.path.basename(ext._file_name),
                    "   del __bootstrap__",
                    "   if '__loader__' in globals():",
                    "       del __loader__",
                    if_dl("   old_flags = sys.getdlopenflags()"),
                    "   old_dir = os.getcwd()",
                    "   try:",
                    "     os.chdir(os.path.dirname(__file__))",
                    if_dl("     sys.setdlopenflags(dl.RTLD_NOW)"),
                    "     imp.load_dynamic(__name__,__file__)",
                    "   finally:",
                    if_dl("     sys.setdlopenflags(old_flags)"),
                    "     os.chdir(old_dir)",
                    "__bootstrap__()",
                    ""  # terminal \n
                ])
            )
            f.close()
        if compile:
            from distutils.util import byte_compile

            byte_compile([stub_file], optimize=0,
                         force=True, dry_run=self.dry_run)
            optimize = self.get_finalized_command('install_lib').optimize
            if optimize > 0:
                byte_compile([stub_file], optimize=optimize,
                             force=True, dry_run=self.dry_run)
            if os.path.exists(stub_file) and not self.dry_run:
                os.unlink(stub_file)


if use_stubs or os.name == 'nt':
    # Build shared libraries
    #
    def link_shared_object(
            self, objects, output_libname, output_dir=None, libraries=None,
            library_dirs=None, runtime_library_dirs=None, export_symbols=None,
            debug=0, extra_preargs=None, extra_postargs=None, build_temp=None,
            target_lang=None):
        self.link(
            self.SHARED_LIBRARY, objects, output_libname,
            output_dir, libraries, library_dirs, runtime_library_dirs,
            export_symbols, debug, extra_preargs, extra_postargs,
            build_temp, target_lang
        )
else:
    # Build static libraries everywhere else
    libtype = 'static'

    def link_shared_object(
            self, objects, output_libname, output_dir=None, libraries=None,
            library_dirs=None, runtime_library_dirs=None, export_symbols=None,
            debug=0, extra_preargs=None, extra_postargs=None, build_temp=None,
            target_lang=None):
        # XXX we need to either disallow these attrs on Library instances,
        # or warn/abort here if set, or something...
        # libraries=None, library_dirs=None, runtime_library_dirs=None,
        # export_symbols=None, extra_preargs=None, extra_postargs=None,
        # build_temp=None

        assert output_dir is None  # distutils build_ext doesn't pass this
        output_dir, filename = os.path.split(output_libname)
        basename, ext = os.path.splitext(filename)
        if self.library_filename("x").startswith('lib'):
            # strip 'lib' prefix; this is kludgy if some platform uses
            # a different prefix
            basename = basename[3:]

        self.create_static_lib(
            objects, basename, output_dir, debug, target_lang
        )


def _get_config_var_837(name):
    """
    In https://github.com/pypa/setuptools/pull/837, we discovered
    Python 3.3.0 exposes the extension suffix under the name 'SO'.
    """
    if sys.version_info < (3, 3, 1):
        name = 'SO'
    return get_config_var(name)
command/setopt.py000064400000011735151733473710010074 0ustar00from distutils.util import convert_path
from distutils import log
from distutils.errors import DistutilsOptionError
import distutils
import os

from setuptools.extern.six.moves import configparser

from setuptools import Command

__all__ = ['config_file', 'edit_config', 'option_base', 'setopt']


def config_file(kind="local"):
    """Get the filename of the distutils, local, global, or per-user config

    `kind` must be one of "local", "global", or "user"
    """
    if kind == 'local':
        return 'setup.cfg'
    if kind == 'global':
        return os.path.join(
            os.path.dirname(distutils.__file__), 'distutils.cfg'
        )
    if kind == 'user':
        dot = os.name == 'posix' and '.' or ''
        return os.path.expanduser(convert_path("~/%spydistutils.cfg" % dot))
    raise ValueError(
        "config_file() type must be 'local', 'global', or 'user'", kind
    )


def edit_config(filename, settings, dry_run=False):
    """Edit a configuration file to include `settings`

    `settings` is a dictionary of dictionaries or ``None`` values, keyed by
    command/section name.  A ``None`` value means to delete the entire section,
    while a dictionary lists settings to be changed or deleted in that section.
    A setting of ``None`` means to delete that setting.
    """
    log.debug("Reading configuration from %s", filename)
    opts = configparser.RawConfigParser()
    opts.read([filename])
    for section, options in settings.items():
        if options is None:
            log.info("Deleting section [%s] from %s", section, filename)
            opts.remove_section(section)
        else:
            if not opts.has_section(section):
                log.debug("Adding new section [%s] to %s", section, filename)
                opts.add_section(section)
            for option, value in options.items():
                if value is None:
                    log.debug(
                        "Deleting %s.%s from %s",
                        section, option, filename
                    )
                    opts.remove_option(section, option)
                    if not opts.options(section):
                        log.info("Deleting empty [%s] section from %s",
                                 section, filename)
                        opts.remove_section(section)
                else:
                    log.debug(
                        "Setting %s.%s to %r in %s",
                        section, option, value, filename
                    )
                    opts.set(section, option, value)

    log.info("Writing %s", filename)
    if not dry_run:
        with open(filename, 'w') as f:
            opts.write(f)


class option_base(Command):
    """Abstract base class for commands that mess with config files"""

    user_options = [
        ('global-config', 'g',
         "save options to the site-wide distutils.cfg file"),
        ('user-config', 'u',
         "save options to the current user's pydistutils.cfg file"),
        ('filename=', 'f',
         "configuration file to use (default=setup.cfg)"),
    ]

    boolean_options = [
        'global-config', 'user-config',
    ]

    def initialize_options(self):
        self.global_config = None
        self.user_config = None
        self.filename = None

    def finalize_options(self):
        filenames = []
        if self.global_config:
            filenames.append(config_file('global'))
        if self.user_config:
            filenames.append(config_file('user'))
        if self.filename is not None:
            filenames.append(self.filename)
        if not filenames:
            filenames.append(config_file('local'))
        if len(filenames) > 1:
            raise DistutilsOptionError(
                "Must specify only one configuration file option",
                filenames
            )
        self.filename, = filenames


class setopt(option_base):
    """Save command-line options to a file"""

    description = "set an option in setup.cfg or another config file"

    user_options = [
        ('command=', 'c', 'command to set an option for'),
        ('option=', 'o', 'option to set'),
        ('set-value=', 's', 'value of the option'),
        ('remove', 'r', 'remove (unset) the value'),
    ] + option_base.user_options

    boolean_options = option_base.boolean_options + ['remove']

    def initialize_options(self):
        option_base.initialize_options(self)
        self.command = None
        self.option = None
        self.set_value = None
        self.remove = None

    def finalize_options(self):
        option_base.finalize_options(self)
        if self.command is None or self.option is None:
            raise DistutilsOptionError("Must specify --command *and* --option")
        if self.set_value is None and not self.remove:
            raise DistutilsOptionError("Must specify --set-value or --remove")

    def run(self):
        edit_config(
            self.filename, {
                self.command: {self.option.replace('-', '_'): self.set_value}
            },
            self.dry_run
        )
command/saveopts.pyo000064400000002151151733473710010571 0ustar00�
�fc@s0ddlmZmZdefd��YZdS(i����(tedit_configtoption_basetsaveoptscBseZdZdZd�ZRS(s#Save command-line options to a files7save supplied options to setup.cfg or other config filecCs�|j}i}xt|jD]i}|dkr1qnxN|j|�j�D]7\}\}}|dkrG||j|i�|<qGqGWqWt|j||j�dS(NRscommand line(tdistributiontcommand_optionstget_option_dicttitemst
setdefaultRtfilenametdry_run(tselftdisttsettingstcmdtopttsrctval((s?/usr/lib/python2.7/site-packages/setuptools/command/saveopts.pytrun	s	(!(t__name__t
__module__t__doc__tdescriptionR(((s?/usr/lib/python2.7/site-packages/setuptools/command/saveopts.pyRsN(tsetuptools.command.setoptRRR(((s?/usr/lib/python2.7/site-packages/setuptools/command/saveopts.pyt<module>scommand/install_egg_info.pyc000064400000006161151733473710012221 0ustar00�
�fc@s~ddlmZmZddlZddlmZddlmZddlmZddl	Z	dej
efd��YZdS(i����(tlogtdir_utilN(tCommand(t
namespaces(tunpack_archivetinstall_egg_infocBsJeZdZdZd	gZd�Zd�Zd�Zd�Zd�Z	RS(
s.Install an .egg-info directory for the packagesinstall-dir=tdsdirectory to install tocCs
d|_dS(N(tNonetinstall_dir(tself((sG/usr/lib/python2.7/site-packages/setuptools/command/install_egg_info.pytinitialize_optionsscCs{|jdd�|jd�}tjdd|j|j�j�d}|j|_t	j
j|j|�|_
g|_dS(Ntinstall_libRtegg_infos	.egg-info(RR(tset_undefined_optionstget_finalized_commandt
pkg_resourcestDistributionRtegg_nametegg_versionRtsourcetostpathtjoinRttargettoutputs(R	tei_cmdtbasename((sG/usr/lib/python2.7/site-packages/setuptools/command/install_egg_info.pytfinalize_optionss	cCs�|jd�tjj|j�rTtjj|j�rTtj|jd|j�n;tjj	|j�r�|j
tj|jfd|j�n|js�tj
|j�n|j
|jdd|j|jf�|j�dS(NRtdry_runs	Removing sCopying %s to %s((trun_commandRRtisdirRtislinkRtremove_treeRtexiststexecutetunlinkRtensure_directorytcopytreeRtinstall_namespaces(R	((sG/usr/lib/python2.7/site-packages/setuptools/command/install_egg_info.pytrun!s
+&	 cCs|jS(N(R(R	((sG/usr/lib/python2.7/site-packages/setuptools/command/install_egg_info.pytget_outputs.scs)�fd�}t�j�j|�dS(Ncs[x1dD])}|j|�s,d||krdSqW�jj|�tjd||�|S(Ns.svn/sCVS/t/sCopying %s to %s(s.svn/sCVS/(t
startswithRRtappendRtdebug(tsrctdsttskip(R	(sG/usr/lib/python2.7/site-packages/setuptools/command/install_egg_info.pytskimmer3s
(RRR(R	R0((R	sG/usr/lib/python2.7/site-packages/setuptools/command/install_egg_info.pyR%1s(sinstall-dir=Rsdirectory to install to(
t__name__t
__module__t__doc__tdescriptiontuser_optionsR
RR'R(R%(((sG/usr/lib/python2.7/site-packages/setuptools/command/install_egg_info.pyR
s				
	(t	distutilsRRRt
setuptoolsRRtsetuptools.archive_utilRRt	InstallerR(((sG/usr/lib/python2.7/site-packages/setuptools/command/install_egg_info.pyt<module>scommand/register.pyc000064400000001306151733473710010536 0ustar00�
�fc@s/ddljjZdejfd��YZdS(i����NtregistercBseZejjZd�ZRS(cCs!|jd�tjj|�dS(Ntegg_info(trun_commandtorigRtrun(tself((s?/usr/lib/python2.7/site-packages/setuptools/command/register.pyRs
(t__name__t
__module__RRt__doc__R(((s?/usr/lib/python2.7/site-packages/setuptools/command/register.pyRs(tdistutils.command.registertcommandRR(((s?/usr/lib/python2.7/site-packages/setuptools/command/register.pyt<module>scommand/egg_info.py000064400000060340151733473710010327 0ustar00"""setuptools.command.egg_info

Create a distribution's .egg-info directory and contents"""

from distutils.filelist import FileList as _FileList
from distutils.errors import DistutilsInternalError
from distutils.util import convert_path
from distutils import log
import distutils.errors
import distutils.filelist
import os
import re
import sys
import io
import warnings
import time
import collections

from setuptools.extern import six
from setuptools.extern.six.moves import map

from setuptools import Command
from setuptools.command.sdist import sdist
from setuptools.command.sdist import walk_revctrl
from setuptools.command.setopt import edit_config
from setuptools.command import bdist_egg
from pkg_resources import (
    parse_requirements, safe_name, parse_version,
    safe_version, yield_lines, EntryPoint, iter_entry_points, to_filename)
import setuptools.unicode_utils as unicode_utils
from setuptools.glob import glob

from setuptools.extern import packaging


def translate_pattern(glob):
    """
    Translate a file path glob like '*.txt' in to a regular expression.
    This differs from fnmatch.translate which allows wildcards to match
    directory separators. It also knows about '**/' which matches any number of
    directories.
    """
    pat = ''

    # This will split on '/' within [character classes]. This is deliberate.
    chunks = glob.split(os.path.sep)

    sep = re.escape(os.sep)
    valid_char = '[^%s]' % (sep,)

    for c, chunk in enumerate(chunks):
        last_chunk = c == len(chunks) - 1

        # Chunks that are a literal ** are globstars. They match anything.
        if chunk == '**':
            if last_chunk:
                # Match anything if this is the last component
                pat += '.*'
            else:
                # Match '(name/)*'
                pat += '(?:%s+%s)*' % (valid_char, sep)
            continue  # Break here as the whole path component has been handled

        # Find any special characters in the remainder
        i = 0
        chunk_len = len(chunk)
        while i < chunk_len:
            char = chunk[i]
            if char == '*':
                # Match any number of name characters
                pat += valid_char + '*'
            elif char == '?':
                # Match a name character
                pat += valid_char
            elif char == '[':
                # Character class
                inner_i = i + 1
                # Skip initial !/] chars
                if inner_i < chunk_len and chunk[inner_i] == '!':
                    inner_i = inner_i + 1
                if inner_i < chunk_len and chunk[inner_i] == ']':
                    inner_i = inner_i + 1

                # Loop till the closing ] is found
                while inner_i < chunk_len and chunk[inner_i] != ']':
                    inner_i = inner_i + 1

                if inner_i >= chunk_len:
                    # Got to the end of the string without finding a closing ]
                    # Do not treat this as a matching group, but as a literal [
                    pat += re.escape(char)
                else:
                    # Grab the insides of the [brackets]
                    inner = chunk[i + 1:inner_i]
                    char_class = ''

                    # Class negation
                    if inner[0] == '!':
                        char_class = '^'
                        inner = inner[1:]

                    char_class += re.escape(inner)
                    pat += '[%s]' % (char_class,)

                    # Skip to the end ]
                    i = inner_i
            else:
                pat += re.escape(char)
            i += 1

        # Join each chunk with the dir separator
        if not last_chunk:
            pat += sep

    pat += r'\Z'
    return re.compile(pat, flags=re.MULTILINE|re.DOTALL)


class egg_info(Command):
    description = "create a distribution's .egg-info directory"

    user_options = [
        ('egg-base=', 'e', "directory containing .egg-info directories"
                           " (default: top of the source tree)"),
        ('tag-date', 'd', "Add date stamp (e.g. 20050528) to version number"),
        ('tag-build=', 'b', "Specify explicit tag to add to version number"),
        ('no-date', 'D', "Don't include date stamp [default]"),
    ]

    boolean_options = ['tag-date']
    negative_opt = {
        'no-date': 'tag-date',
    }

    def initialize_options(self):
        self.egg_name = None
        self.egg_version = None
        self.egg_base = None
        self.egg_info = None
        self.tag_build = None
        self.tag_date = 0
        self.broken_egg_info = False
        self.vtags = None

    ####################################
    # allow the 'tag_svn_revision' to be detected and
    # set, supporting sdists built on older Setuptools.
    @property
    def tag_svn_revision(self):
        pass

    @tag_svn_revision.setter
    def tag_svn_revision(self, value):
        pass
    ####################################

    def save_version_info(self, filename):
        """
        Materialize the value of date into the
        build tag. Install build keys in a deterministic order
        to avoid arbitrary reordering on subsequent builds.
        """
        egg_info = collections.OrderedDict()
        # follow the order these keys would have been added
        # when PYTHONHASHSEED=0
        egg_info['tag_build'] = self.tags()
        egg_info['tag_date'] = 0
        edit_config(filename, dict(egg_info=egg_info))

    def finalize_options(self):
        self.egg_name = safe_name(self.distribution.get_name())
        self.vtags = self.tags()
        self.egg_version = self.tagged_version()

        parsed_version = parse_version(self.egg_version)

        try:
            is_version = isinstance(parsed_version, packaging.version.Version)
            spec = (
                "%s==%s" if is_version else "%s===%s"
            )
            list(
                parse_requirements(spec % (self.egg_name, self.egg_version))
            )
        except ValueError:
            raise distutils.errors.DistutilsOptionError(
                "Invalid distribution name or version syntax: %s-%s" %
                (self.egg_name, self.egg_version)
            )

        if self.egg_base is None:
            dirs = self.distribution.package_dir
            self.egg_base = (dirs or {}).get('', os.curdir)

        self.ensure_dirname('egg_base')
        self.egg_info = to_filename(self.egg_name) + '.egg-info'
        if self.egg_base != os.curdir:
            self.egg_info = os.path.join(self.egg_base, self.egg_info)
        if '-' in self.egg_name:
            self.check_broken_egg_info()

        # Set package version for the benefit of dumber commands
        # (e.g. sdist, bdist_wininst, etc.)
        #
        self.distribution.metadata.version = self.egg_version

        # If we bootstrapped around the lack of a PKG-INFO, as might be the
        # case in a fresh checkout, make sure that any special tags get added
        # to the version info
        #
        pd = self.distribution._patched_dist
        if pd is not None and pd.key == self.egg_name.lower():
            pd._version = self.egg_version
            pd._parsed_version = parse_version(self.egg_version)
            self.distribution._patched_dist = None

    def write_or_delete_file(self, what, filename, data, force=False):
        """Write `data` to `filename` or delete if empty

        If `data` is non-empty, this routine is the same as ``write_file()``.
        If `data` is empty but not ``None``, this is the same as calling
        ``delete_file(filename)`.  If `data` is ``None``, then this is a no-op
        unless `filename` exists, in which case a warning is issued about the
        orphaned file (if `force` is false), or deleted (if `force` is true).
        """
        if data:
            self.write_file(what, filename, data)
        elif os.path.exists(filename):
            if data is None and not force:
                log.warn(
                    "%s not set in setup(), but %s exists", what, filename
                )
                return
            else:
                self.delete_file(filename)

    def write_file(self, what, filename, data):
        """Write `data` to `filename` (if not a dry run) after announcing it

        `what` is used in a log message to identify what is being written
        to the file.
        """
        log.info("writing %s to %s", what, filename)
        if six.PY3:
            data = data.encode("utf-8")
        if not self.dry_run:
            f = open(filename, 'wb')
            f.write(data)
            f.close()

    def delete_file(self, filename):
        """Delete `filename` (if not a dry run) after announcing it"""
        log.info("deleting %s", filename)
        if not self.dry_run:
            os.unlink(filename)

    def tagged_version(self):
        version = self.distribution.get_version()
        # egg_info may be called more than once for a distribution,
        # in which case the version string already contains all tags.
        if self.vtags and version.endswith(self.vtags):
            return safe_version(version)
        return safe_version(version + self.vtags)

    def run(self):
        self.mkpath(self.egg_info)
        installer = self.distribution.fetch_build_egg
        for ep in iter_entry_points('egg_info.writers'):
            ep.require(installer=installer)
            writer = ep.resolve()
            writer(self, ep.name, os.path.join(self.egg_info, ep.name))

        # Get rid of native_libs.txt if it was put there by older bdist_egg
        nl = os.path.join(self.egg_info, "native_libs.txt")
        if os.path.exists(nl):
            self.delete_file(nl)

        self.find_sources()

    def tags(self):
        version = ''
        if self.tag_build:
            version += self.tag_build
        if self.tag_date:
            version += time.strftime("-%Y%m%d")
        return version

    def find_sources(self):
        """Generate SOURCES.txt manifest file"""
        manifest_filename = os.path.join(self.egg_info, "SOURCES.txt")
        mm = manifest_maker(self.distribution)
        mm.manifest = manifest_filename
        mm.run()
        self.filelist = mm.filelist

    def check_broken_egg_info(self):
        bei = self.egg_name + '.egg-info'
        if self.egg_base != os.curdir:
            bei = os.path.join(self.egg_base, bei)
        if os.path.exists(bei):
            log.warn(
                "-" * 78 + '\n'
                "Note: Your current .egg-info directory has a '-' in its name;"
                '\nthis will not work correctly with "setup.py develop".\n\n'
                'Please rename %s to %s to correct this problem.\n' + '-' * 78,
                bei, self.egg_info
            )
            self.broken_egg_info = self.egg_info
            self.egg_info = bei  # make it work for now


class FileList(_FileList):
    # Implementations of the various MANIFEST.in commands

    def process_template_line(self, line):
        # Parse the line: split it up, make sure the right number of words
        # is there, and return the relevant words.  'action' is always
        # defined: it's the first word of the line.  Which of the other
        # three are defined depends on the action; it'll be either
        # patterns, (dir and patterns), or (dir_pattern).
        (action, patterns, dir, dir_pattern) = self._parse_template_line(line)

        # OK, now we know that the action is valid and we have the
        # right number of words on the line for that action -- so we
        # can proceed with minimal error-checking.
        if action == 'include':
            self.debug_print("include " + ' '.join(patterns))
            for pattern in patterns:
                if not self.include(pattern):
                    log.warn("warning: no files found matching '%s'", pattern)

        elif action == 'exclude':
            self.debug_print("exclude " + ' '.join(patterns))
            for pattern in patterns:
                if not self.exclude(pattern):
                    log.warn(("warning: no previously-included files "
                              "found matching '%s'"), pattern)

        elif action == 'global-include':
            self.debug_print("global-include " + ' '.join(patterns))
            for pattern in patterns:
                if not self.global_include(pattern):
                    log.warn(("warning: no files found matching '%s' "
                              "anywhere in distribution"), pattern)

        elif action == 'global-exclude':
            self.debug_print("global-exclude " + ' '.join(patterns))
            for pattern in patterns:
                if not self.global_exclude(pattern):
                    log.warn(("warning: no previously-included files matching "
                              "'%s' found anywhere in distribution"),
                             pattern)

        elif action == 'recursive-include':
            self.debug_print("recursive-include %s %s" %
                             (dir, ' '.join(patterns)))
            for pattern in patterns:
                if not self.recursive_include(dir, pattern):
                    log.warn(("warning: no files found matching '%s' "
                              "under directory '%s'"),
                             pattern, dir)

        elif action == 'recursive-exclude':
            self.debug_print("recursive-exclude %s %s" %
                             (dir, ' '.join(patterns)))
            for pattern in patterns:
                if not self.recursive_exclude(dir, pattern):
                    log.warn(("warning: no previously-included files matching "
                              "'%s' found under directory '%s'"),
                             pattern, dir)

        elif action == 'graft':
            self.debug_print("graft " + dir_pattern)
            if not self.graft(dir_pattern):
                log.warn("warning: no directories found matching '%s'",
                         dir_pattern)

        elif action == 'prune':
            self.debug_print("prune " + dir_pattern)
            if not self.prune(dir_pattern):
                log.warn(("no previously-included directories found "
                          "matching '%s'"), dir_pattern)

        else:
            raise DistutilsInternalError(
                "this cannot happen: invalid action '%s'" % action)

    def _remove_files(self, predicate):
        """
        Remove all files from the file list that match the predicate.
        Return True if any matching files were removed
        """
        found = False
        for i in range(len(self.files) - 1, -1, -1):
            if predicate(self.files[i]):
                self.debug_print(" removing " + self.files[i])
                del self.files[i]
                found = True
        return found

    def include(self, pattern):
        """Include files that match 'pattern'."""
        found = [f for f in glob(pattern) if not os.path.isdir(f)]
        self.extend(found)
        return bool(found)

    def exclude(self, pattern):
        """Exclude files that match 'pattern'."""
        match = translate_pattern(pattern)
        return self._remove_files(match.match)

    def recursive_include(self, dir, pattern):
        """
        Include all files anywhere in 'dir/' that match the pattern.
        """
        full_pattern = os.path.join(dir, '**', pattern)
        found = [f for f in glob(full_pattern, recursive=True)
                 if not os.path.isdir(f)]
        self.extend(found)
        return bool(found)

    def recursive_exclude(self, dir, pattern):
        """
        Exclude any file anywhere in 'dir/' that match the pattern.
        """
        match = translate_pattern(os.path.join(dir, '**', pattern))
        return self._remove_files(match.match)

    def graft(self, dir):
        """Include all files from 'dir/'."""
        found = [
            item
            for match_dir in glob(dir)
            for item in distutils.filelist.findall(match_dir)
        ]
        self.extend(found)
        return bool(found)

    def prune(self, dir):
        """Filter out files from 'dir/'."""
        match = translate_pattern(os.path.join(dir, '**'))
        return self._remove_files(match.match)

    def global_include(self, pattern):
        """
        Include all files anywhere in the current directory that match the
        pattern. This is very inefficient on large file trees.
        """
        if self.allfiles is None:
            self.findall()
        match = translate_pattern(os.path.join('**', pattern))
        found = [f for f in self.allfiles if match.match(f)]
        self.extend(found)
        return bool(found)

    def global_exclude(self, pattern):
        """
        Exclude all files anywhere that match the pattern.
        """
        match = translate_pattern(os.path.join('**', pattern))
        return self._remove_files(match.match)

    def append(self, item):
        if item.endswith('\r'):  # Fix older sdists built on Windows
            item = item[:-1]
        path = convert_path(item)

        if self._safe_path(path):
            self.files.append(path)

    def extend(self, paths):
        self.files.extend(filter(self._safe_path, paths))

    def _repair(self):
        """
        Replace self.files with only safe paths

        Because some owners of FileList manipulate the underlying
        ``files`` attribute directly, this method must be called to
        repair those paths.
        """
        self.files = list(filter(self._safe_path, self.files))

    def _safe_path(self, path):
        enc_warn = "'%s' not %s encodable -- skipping"

        # To avoid accidental trans-codings errors, first to unicode
        u_path = unicode_utils.filesys_decode(path)
        if u_path is None:
            log.warn("'%s' in unexpected encoding -- skipping" % path)
            return False

        # Must ensure utf-8 encodability
        utf8_path = unicode_utils.try_encode(u_path, "utf-8")
        if utf8_path is None:
            log.warn(enc_warn, path, 'utf-8')
            return False

        try:
            # accept is either way checks out
            if os.path.exists(u_path) or os.path.exists(utf8_path):
                return True
        # this will catch any encode errors decoding u_path
        except UnicodeEncodeError:
            log.warn(enc_warn, path, sys.getfilesystemencoding())


class manifest_maker(sdist):
    template = "MANIFEST.in"

    def initialize_options(self):
        self.use_defaults = 1
        self.prune = 1
        self.manifest_only = 1
        self.force_manifest = 1

    def finalize_options(self):
        pass

    def run(self):
        self.filelist = FileList()
        if not os.path.exists(self.manifest):
            self.write_manifest()  # it must exist so it'll get in the list
        self.add_defaults()
        if os.path.exists(self.template):
            self.read_template()
        self.prune_file_list()
        self.filelist.sort()
        self.filelist.remove_duplicates()
        self.write_manifest()

    def _manifest_normalize(self, path):
        path = unicode_utils.filesys_decode(path)
        return path.replace(os.sep, '/')

    def write_manifest(self):
        """
        Write the file list in 'self.filelist' to the manifest file
        named by 'self.manifest'.
        """
        self.filelist._repair()

        # Now _repairs should encodability, but not unicode
        files = [self._manifest_normalize(f) for f in self.filelist.files]
        msg = "writing manifest file '%s'" % self.manifest
        self.execute(write_file, (self.manifest, files), msg)

    def warn(self, msg):
        if not self._should_suppress_warning(msg):
            sdist.warn(self, msg)

    @staticmethod
    def _should_suppress_warning(msg):
        """
        suppress missing-file warnings from sdist
        """
        return re.match(r"standard file .*not found", msg)

    def add_defaults(self):
        sdist.add_defaults(self)
        self.filelist.append(self.template)
        self.filelist.append(self.manifest)
        rcfiles = list(walk_revctrl())
        if rcfiles:
            self.filelist.extend(rcfiles)
        elif os.path.exists(self.manifest):
            self.read_manifest()
        ei_cmd = self.get_finalized_command('egg_info')
        self.filelist.graft(ei_cmd.egg_info)

    def prune_file_list(self):
        build = self.get_finalized_command('build')
        base_dir = self.distribution.get_fullname()
        self.filelist.prune(build.build_base)
        self.filelist.prune(base_dir)
        sep = re.escape(os.sep)
        self.filelist.exclude_pattern(r'(^|' + sep + r')(RCS|CVS|\.svn)' + sep,
                                      is_regex=1)


def write_file(filename, contents):
    """Create a file with the specified name and write 'contents' (a
    sequence of strings without line terminators) to it.
    """
    contents = "\n".join(contents)

    # assuming the contents has been vetted for utf-8 encoding
    contents = contents.encode("utf-8")

    with open(filename, "wb") as f:  # always write POSIX-style manifest
        f.write(contents)


def write_pkg_info(cmd, basename, filename):
    log.info("writing %s", filename)
    if not cmd.dry_run:
        metadata = cmd.distribution.metadata
        metadata.version, oldver = cmd.egg_version, metadata.version
        metadata.name, oldname = cmd.egg_name, metadata.name

        try:
            # write unescaped data to PKG-INFO, so older pkg_resources
            # can still parse it
            metadata.write_pkg_info(cmd.egg_info)
        finally:
            metadata.name, metadata.version = oldname, oldver

        safe = getattr(cmd.distribution, 'zip_safe', None)

        bdist_egg.write_safety_flag(cmd.egg_info, safe)


def warn_depends_obsolete(cmd, basename, filename):
    if os.path.exists(filename):
        log.warn(
            "WARNING: 'depends.txt' is not used by setuptools 0.6!\n"
            "Use the install_requires/extras_require setup() args instead."
        )


def _write_requirements(stream, reqs):
    lines = yield_lines(reqs or ())
    append_cr = lambda line: line + '\n'
    lines = map(append_cr, lines)
    stream.writelines(lines)


def write_requirements(cmd, basename, filename):
    dist = cmd.distribution
    data = six.StringIO()
    _write_requirements(data, dist.install_requires)
    extras_require = dist.extras_require or {}
    for extra in sorted(extras_require):
        data.write('\n[{extra}]\n'.format(**vars()))
        _write_requirements(data, extras_require[extra])
    cmd.write_or_delete_file("requirements", filename, data.getvalue())


def write_setup_requirements(cmd, basename, filename):
    data = io.StringIO()
    _write_requirements(data, cmd.distribution.setup_requires)
    cmd.write_or_delete_file("setup-requirements", filename, data.getvalue())


def write_toplevel_names(cmd, basename, filename):
    pkgs = dict.fromkeys(
        [
            k.split('.', 1)[0]
            for k in cmd.distribution.iter_distribution_names()
        ]
    )
    cmd.write_file("top-level names", filename, '\n'.join(sorted(pkgs)) + '\n')


def overwrite_arg(cmd, basename, filename):
    write_arg(cmd, basename, filename, True)


def write_arg(cmd, basename, filename, force=False):
    argname = os.path.splitext(basename)[0]
    value = getattr(cmd.distribution, argname, None)
    if value is not None:
        value = '\n'.join(value) + '\n'
    cmd.write_or_delete_file(argname, filename, value, force)


def write_entries(cmd, basename, filename):
    ep = cmd.distribution.entry_points

    if isinstance(ep, six.string_types) or ep is None:
        data = ep
    elif ep is not None:
        data = []
        for section, contents in sorted(ep.items()):
            if not isinstance(contents, six.string_types):
                contents = EntryPoint.parse_group(section, contents)
                contents = '\n'.join(sorted(map(str, contents.values())))
            data.append('[%s]\n%s\n\n' % (section, contents))
        data = ''.join(data)

    cmd.write_or_delete_file('entry points', filename, data, True)


def get_pkg_info_revision():
    """
    Get a -r### off of PKG-INFO Version in case this is an sdist of
    a subversion revision.
    """
    warnings.warn("get_pkg_info_revision is deprecated.", DeprecationWarning)
    if os.path.exists('PKG-INFO'):
        with io.open('PKG-INFO') as f:
            for line in f:
                match = re.match(r"Version:.*-r(\d+)\s*$", line)
                if match:
                    return int(match.group(1))
    return 0
command/upload_docs.pyo000064400000017205151733473710011227 0ustar00�
�fc@s�dZddlmZddlmZddlmZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlmZddlmZmZddlmZd	d
lmZd�Zdefd
��YZdS(spupload_docs

Implements a Distutils 'upload_docs' subcommand (upload documentation to
PyPI's pythonhosted.org).
i����(tstandard_b64encode(tlog(tDistutilsOptionErrorN(tsix(thttp_clientturllib(titer_entry_pointsi(tuploadcCs%tjrdnd}|jd|�S(Ntsurrogateescapetstrictsutf-8(RtPY3tencode(tsterrors((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyt_encodestupload_docscBs�eZdZdZdddejfddgZejZd	�Zd
efgZ	d�Z
d�Zd
�Zd�Z
ed��Zed��Zd�ZRS(shttps://pypi.python.org/pypi/sUpload documentation to PyPIsrepository=trsurl of repository [default: %s]s
show-responses&display full response text from serversupload-dir=sdirectory to uploadcCs1|jdkr-xtdd�D]}tSWndS(Nsdistutils.commandstbuild_sphinx(t
upload_dirtNoneRtTrue(tselftep((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyt
has_sphinx/sRcCs#tj|�d|_d|_dS(N(Rtinitialize_optionsRRt
target_dir(R((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyR6s
	cCs�tj|�|jdkrs|j�rF|jd�}|j|_q�|jd�}tj	j
|jd�|_n|jd�|j|_d|j
kr�tjd�n|jd|j�dS(NRtbuildtdocsRspypi.python.orgs3Upload_docs command is deprecated. Use RTD instead.sUsing upload directory %s(Rtfinalize_optionsRRRtget_finalized_commandtbuilder_target_dirRtostpathtjoint
build_basetensure_dirnamet
repositoryRtwarntannounce(RRR((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyR;s

cCs�tj|d�}z�|j|j�x�tj|j�D]�\}}}||jkry|ryd}t||j��nxj|D]b}tjj||�}|t	|j�j
tjj�}	tjj|	|�}
|j||
�q�Wq8WWd|j
�XdS(Ntws'no files found in upload directory '%s'(tzipfiletZipFiletmkpathRRtwalkRR R!tlentlstriptseptwritetclose(Rtfilenametzip_filetroottdirstfilesttmpltnametfulltrelativetdest((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pytcreate_zipfileKs"
"cCs�x!|j�D]}|j|�q
Wtj�}|jjj�}tjj	|d|�}z|j
|�|j|�Wdtj
|�XdS(Ns%s.zip(tget_sub_commandstrun_commandttempfiletmkdtemptdistributiontmetadatatget_nameRR R!R;tupload_filetshutiltrmtree(Rtcmd_namettmp_dirR7R2((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pytrun[s
ccs�|\}}d|}t|t�s1|g}nx�|D]x}t|t�rl|d|d7}|d}nt|�}|Vt|�VdV|V|r8|ddkr8dVq8q8WdS(	Ns*
Content-Disposition: form-data; name="%s"s; filename="%s"iis

i����s
s
(t
isinstancetlistttupleR(titemtsep_boundarytkeytvaluesttitletvalue((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyt_build_partis


cCs�d}d|}|d}|df}tj|jd|�}t||j��}tjj|�}tj||�}	d|jd�}
dj	|	�|
fS(	s=
        Build up the MIME payload for the POST data
        s3--------------GHSKFJDLGDS7543FJKLFHRE75642756743254s
--s--s
RMs multipart/form-data; boundary=%stasciit(
t	functoolstpartialRRtmaptitemst	itertoolstchaint
from_iterabletdecodeR!(tclstdatatboundaryRMtend_boundaryt	end_itemstbuildertpart_groupstpartst
body_itemstcontent_type((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyt_build_multipart}s

		cCs�t|d��}|j�}WdQX|jj}idd6|j�d6tjj|�|fd6}t|j	d|j
�}t|�}tj
r�|jd�}nd|}|j|�\}}	d	|j}
|j|
tj�tjj|j�\}}}
}}}|d
kr(tj|�}n.|dkrFtj|�}ntd|��d
}yw|j�|jd|
�|	}|jd|�|jdtt|���|jd|�|j �|j!|�Wn0t"j#k
r}|jt|�tj$�dSX|j%�}|j&dkrMd|j&|j'f}
|j|
tj�n�|j&dkr�|j(d�}|dkr�d|j�}nd|}
|j|
tj�n)d|j&|j'f}
|j|
tj$�|j*r�dd|j�ddfGHndS(Ntrbt
doc_uploads:actionR7tcontentt:RSsBasic sSubmitting documentation to %sthttpthttpssunsupported schema RTtPOSTsContent-typesContent-lengtht
Authorizationi�sServer response (%s): %si-tLocationshttps://pythonhosted.org/%s/sUpload successful. Visit %ssUpload failed (%s): %st-iK(+topentreadR@RARBRR tbasenameRtusernametpasswordRRR
R\RgR$R&RtINFORtparseturlparseRtHTTPConnectiontHTTPSConnectiontAssertionErrortconnectt
putrequestt	putheadertstrR,t
endheaderstsendtsocketterrortERRORtgetresponsetstatustreasont	getheaderRt
show_response(RR1tfRjtmetaR^tcredentialstauthtbodytcttmsgtschematnetlocturltparamstqueryt	fragmentstconnRfteRtlocation((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyRC�s`
	

'


	N(s
show-responseNs&display full response text from server(supload-dir=Nsdirectory to upload(t__name__t
__module__tDEFAULT_REPOSITORYtdescriptionRRtuser_optionstboolean_optionsRtsub_commandsRRR;RHtstaticmethodRRtclassmethodRgRC(((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyRs"
							(t__doc__tbase64Rt	distutilsRtdistutils.errorsRRR�R(R>RDRYRUtsetuptools.externRtsetuptools.extern.six.movesRRt
pkg_resourcesRRRR(((sB/usr/lib/python2.7/site-packages/setuptools/command/upload_docs.pyt<module>s 	command/dist_info.py000064400000001700151733473710010523 0ustar00"""
Create a dist_info directory
As defined in the wheel specification
"""

import os

from distutils.core import Command
from distutils import log


class dist_info(Command):

    description = 'create a .dist-info directory'

    user_options = [
        ('egg-base=', 'e', "directory containing .egg-info directories"
                           " (default: top of the source tree)"),
    ]

    def initialize_options(self):
        self.egg_base = None

    def finalize_options(self):
        pass

    def run(self):
        egg_info = self.get_finalized_command('egg_info')
        egg_info.egg_base = self.egg_base
        egg_info.finalize_options()
        egg_info.run()
        dist_info_dir = egg_info.egg_info[:-len('.egg-info')] + '.dist-info'
        log.info("creating '{}'".format(os.path.abspath(dist_info_dir)))

        bdist_wheel = self.get_finalized_command('bdist_wheel')
        bdist_wheel.egg2dist(egg_info.egg_info, dist_info_dir)
command/__init__.pyc000064400000001562151733473710010455 0ustar00�
�fc@s�dddddddddd	d
ddd
dddddddddgZddlmZddlZddlmZdejkr�dejd<ejjd�n[[dS(taliast	bdist_eggt	bdist_rpmt	build_exttbuild_pytdevelopteasy_installtegg_infotinstalltinstall_libtrotatetsaveoptstsdisttsetoptttesttinstall_egg_infotinstall_scriptstregistert
bdist_wininsttupload_docstuploadt
build_clibt	dist_infoi����(tbdistN(RteggsPython .egg file(RsPython .egg file(	t__all__tdistutils.command.bdistRtsystsetuptools.commandRtformat_commandstformat_commandtappend(((s?/usr/lib/python2.7/site-packages/setuptools/command/__init__.pyt<module>s	
command/rotate.pyo000064400000005734151733473710010235 0ustar00�
�fc@s�ddlmZddlmZddlmZddlZddlZddlm	Z	ddl
mZdefd��YZdS(	i����(tconvert_path(tlog(tDistutilsOptionErrorN(tsix(tCommandtrotatecBsDeZdZdZdddgZgZd�Zd�Zd
�ZRS(sDelete older distributionss2delete older distributions, keeping N newest filessmatch=tmspatterns to match (required)s	dist-dir=tds%directory where the distributions areskeep=tks(number of matching distributions to keepcCsd|_d|_d|_dS(N(tNonetmatchtdist_dirtkeep(tself((s=/usr/lib/python2.7/site-packages/setuptools/command/rotate.pytinitialize_optionss		cCs�|jdkrtd��n|jdkr<td��nyt|j�|_Wntk
rqtd��nXt|jtj�r�g|jj	d�D]}t
|j��^q�|_n|jdd�dS(NsQMust specify one or more (comma-separated) match patterns (e.g. '.zip' or '.egg')s$Must specify number of files to keeps--keep must be an integert,tbdistR(RR(
R
R	RRtintt
ValueErrort
isinstanceRtstring_typestsplitRtstriptset_undefined_options(R
tp((s=/usr/lib/python2.7/site-packages/setuptools/command/rotate.pytfinalize_optionss
7cCs1|jd�ddlm}x
|jD]}|jj�d|}|tjj|j|��}g|D]}tjj	|�|f^qi}|j
�|j�tj
dt|�|�||j}x_|D]W\}}tj
d|�|js�tjj|�rtj|�q%tj|�q�q�Wq'WdS(Ntegg_infoi����(tglobt*s%d file(s) matching %ssDeleting %s(trun_commandRR
tdistributiontget_nametostpathtjoinRtgetmtimetsorttreverseRtinfotlenRtdry_runtisdirtshutiltrmtreetunlink(R
Rtpatterntfilestftt((s=/usr/lib/python2.7/site-packages/setuptools/command/rotate.pytrun/s 
+


	(smatch=Rspatterns to match (required)(s	dist-dir=Rs%directory where the distributions are(skeep=Rs(number of matching distributions to keep(	t__name__t
__module__t__doc__tdescriptiontuser_optionstboolean_optionsRRR1(((s=/usr/lib/python2.7/site-packages/setuptools/command/rotate.pyRs			(
tdistutils.utilRt	distutilsRtdistutils.errorsRR R*tsetuptools.externRt
setuptoolsRR(((s=/usr/lib/python2.7/site-packages/setuptools/command/rotate.pyt<module>scommand/alias.py000064400000004572151733473710007650 0ustar00from distutils.errors import DistutilsOptionError

from setuptools.extern.six.moves import map

from setuptools.command.setopt import edit_config, option_base, config_file


def shquote(arg):
    """Quote an argument for later parsing by shlex.split()"""
    for c in '"', "'", "\\", "#":
        if c in arg:
            return repr(arg)
    if arg.split() != [arg]:
        return repr(arg)
    return arg


class alias(option_base):
    """Define a shortcut that invokes one or more commands"""

    description = "define a shortcut to invoke one or more commands"
    command_consumes_arguments = True

    user_options = [
        ('remove', 'r', 'remove (unset) the alias'),
    ] + option_base.user_options

    boolean_options = option_base.boolean_options + ['remove']

    def initialize_options(self):
        option_base.initialize_options(self)
        self.args = None
        self.remove = None

    def finalize_options(self):
        option_base.finalize_options(self)
        if self.remove and len(self.args) != 1:
            raise DistutilsOptionError(
                "Must specify exactly one argument (the alias name) when "
                "using --remove"
            )

    def run(self):
        aliases = self.distribution.get_option_dict('aliases')

        if not self.args:
            print("Command Aliases")
            print("---------------")
            for alias in aliases:
                print("setup.py alias", format_alias(alias, aliases))
            return

        elif len(self.args) == 1:
            alias, = self.args
            if self.remove:
                command = None
            elif alias in aliases:
                print("setup.py alias", format_alias(alias, aliases))
                return
            else:
                print("No alias definition found for %r" % alias)
                return
        else:
            alias = self.args[0]
            command = ' '.join(map(shquote, self.args[1:]))

        edit_config(self.filename, {'aliases': {alias: command}}, self.dry_run)


def format_alias(name, aliases):
    source, command = aliases[name]
    if source == config_file('global'):
        source = '--global-config '
    elif source == config_file('user'):
        source = '--user-config '
    elif source == config_file('local'):
        source = ''
    else:
        source = '--filename=%r' % source
    return source + name + ' ' + command
command/build_clib.py000064400000010604151733473720010641 0ustar00import distutils.command.build_clib as orig
from distutils.errors import DistutilsSetupError
from distutils import log
from setuptools.dep_util import newer_pairwise_group


class build_clib(orig.build_clib):
    """
    Override the default build_clib behaviour to do the following:

    1. Implement a rudimentary timestamp-based dependency system
       so 'compile()' doesn't run every time.
    2. Add more keys to the 'build_info' dictionary:
        * obj_deps - specify dependencies for each object compiled.
                     this should be a dictionary mapping a key
                     with the source filename to a list of
                     dependencies. Use an empty string for global
                     dependencies.
        * cflags   - specify a list of additional flags to pass to
                     the compiler.
    """

    def build_libraries(self, libraries):
        for (lib_name, build_info) in libraries:
            sources = build_info.get('sources')
            if sources is None or not isinstance(sources, (list, tuple)):
                raise DistutilsSetupError(
                       "in 'libraries' option (library '%s'), "
                       "'sources' must be present and must be "
                       "a list of source filenames" % lib_name)
            sources = list(sources)

            log.info("building '%s' library", lib_name)

            # Make sure everything is the correct type.
            # obj_deps should be a dictionary of keys as sources
            # and a list/tuple of files that are its dependencies.
            obj_deps = build_info.get('obj_deps', dict())
            if not isinstance(obj_deps, dict):
                raise DistutilsSetupError(
                       "in 'libraries' option (library '%s'), "
                       "'obj_deps' must be a dictionary of "
                       "type 'source: list'" % lib_name)
            dependencies = []

            # Get the global dependencies that are specified by the '' key.
            # These will go into every source's dependency list.
            global_deps = obj_deps.get('', list())
            if not isinstance(global_deps, (list, tuple)):
                raise DistutilsSetupError(
                       "in 'libraries' option (library '%s'), "
                       "'obj_deps' must be a dictionary of "
                       "type 'source: list'" % lib_name)

            # Build the list to be used by newer_pairwise_group
            # each source will be auto-added to its dependencies.
            for source in sources:
                src_deps = [source]
                src_deps.extend(global_deps)
                extra_deps = obj_deps.get(source, list())
                if not isinstance(extra_deps, (list, tuple)):
                    raise DistutilsSetupError(
                           "in 'libraries' option (library '%s'), "
                           "'obj_deps' must be a dictionary of "
                           "type 'source: list'" % lib_name)
                src_deps.extend(extra_deps)
                dependencies.append(src_deps)

            expected_objects = self.compiler.object_filenames(
                    sources,
                    output_dir=self.build_temp
                    )

            if newer_pairwise_group(dependencies, expected_objects) != ([], []):
                # First, compile the source code to object files in the library
                # directory.  (This should probably change to putting object
                # files in a temporary build directory.)
                macros = build_info.get('macros')
                include_dirs = build_info.get('include_dirs')
                cflags = build_info.get('cflags')
                objects = self.compiler.compile(
                        sources,
                        output_dir=self.build_temp,
                        macros=macros,
                        include_dirs=include_dirs,
                        extra_postargs=cflags,
                        debug=self.debug
                        )

            # Now "link" the object files together into a static library.
            # (On Unix at least, this isn't really linking -- it just
            # builds an archive.  Whatever.)
            self.compiler.create_static_lib(
                    expected_objects,
                    lib_name,
                    output_dir=self.build_clib,
                    debug=self.debug
                    )
command/sdist.py000064400000015067151733473720007707 0ustar00from distutils import log
import distutils.command.sdist as orig
import os
import sys
import io
import contextlib

from setuptools.extern import six

from .py36compat import sdist_add_defaults

import pkg_resources

_default_revctrl = list


def walk_revctrl(dirname=''):
    """Find all files under revision control"""
    for ep in pkg_resources.iter_entry_points('setuptools.file_finders'):
        for item in ep.load()(dirname):
            yield item


class sdist(sdist_add_defaults, orig.sdist):
    """Smart sdist that finds anything supported by revision control"""

    user_options = [
        ('formats=', None,
         "formats for source distribution (comma-separated list)"),
        ('keep-temp', 'k',
         "keep the distribution tree around after creating " +
         "archive file(s)"),
        ('dist-dir=', 'd',
         "directory to put the source distribution archive(s) in "
         "[default: dist]"),
    ]

    negative_opt = {}

    README_EXTENSIONS = ['', '.rst', '.txt', '.md']
    READMES = tuple('README{0}'.format(ext) for ext in README_EXTENSIONS)

    def run(self):
        self.run_command('egg_info')
        ei_cmd = self.get_finalized_command('egg_info')
        self.filelist = ei_cmd.filelist
        self.filelist.append(os.path.join(ei_cmd.egg_info, 'SOURCES.txt'))
        self.check_readme()

        # Run sub commands
        for cmd_name in self.get_sub_commands():
            self.run_command(cmd_name)

        self.make_distribution()

        dist_files = getattr(self.distribution, 'dist_files', [])
        for file in self.archive_files:
            data = ('sdist', '', file)
            if data not in dist_files:
                dist_files.append(data)

    def initialize_options(self):
        orig.sdist.initialize_options(self)

        self._default_to_gztar()

    def _default_to_gztar(self):
        # only needed on Python prior to 3.6.
        if sys.version_info >= (3, 6, 0, 'beta', 1):
            return
        self.formats = ['gztar']

    def make_distribution(self):
        """
        Workaround for #516
        """
        with self._remove_os_link():
            orig.sdist.make_distribution(self)

    @staticmethod
    @contextlib.contextmanager
    def _remove_os_link():
        """
        In a context, remove and restore os.link if it exists
        """

        class NoValue:
            pass

        orig_val = getattr(os, 'link', NoValue)
        try:
            del os.link
        except Exception:
            pass
        try:
            yield
        finally:
            if orig_val is not NoValue:
                setattr(os, 'link', orig_val)

    def __read_template_hack(self):
        # This grody hack closes the template file (MANIFEST.in) if an
        #  exception occurs during read_template.
        # Doing so prevents an error when easy_install attempts to delete the
        #  file.
        try:
            orig.sdist.read_template(self)
        except Exception:
            _, _, tb = sys.exc_info()
            tb.tb_next.tb_frame.f_locals['template'].close()
            raise

    # Beginning with Python 2.7.2, 3.1.4, and 3.2.1, this leaky file handle
    #  has been fixed, so only override the method if we're using an earlier
    #  Python.
    has_leaky_handle = (
        sys.version_info < (2, 7, 2)
        or (3, 0) <= sys.version_info < (3, 1, 4)
        or (3, 2) <= sys.version_info < (3, 2, 1)
    )
    if has_leaky_handle:
        read_template = __read_template_hack

    def _add_defaults_python(self):
        """getting python files"""
        if self.distribution.has_pure_modules():
            build_py = self.get_finalized_command('build_py')
            self.filelist.extend(build_py.get_source_files())
            # This functionality is incompatible with include_package_data, and
            # will in fact create an infinite recursion if include_package_data
            # is True.  Use of include_package_data will imply that
            # distutils-style automatic handling of package_data is disabled
            if not self.distribution.include_package_data:
                for _, src_dir, _, filenames in build_py.data_files:
                    self.filelist.extend([os.path.join(src_dir, filename)
                                          for filename in filenames])

    def _add_defaults_data_files(self):
        try:
            if six.PY2:
                sdist_add_defaults._add_defaults_data_files(self)
            else:
                super()._add_defaults_data_files()
        except TypeError:
            log.warn("data_files contains unexpected objects")

    def check_readme(self):
        for f in self.READMES:
            if os.path.exists(f):
                return
        else:
            self.warn(
                "standard file not found: should have one of " +
                ', '.join(self.READMES)
            )

    def make_release_tree(self, base_dir, files):
        orig.sdist.make_release_tree(self, base_dir, files)

        # Save any egg_info command line options used to create this sdist
        dest = os.path.join(base_dir, 'setup.cfg')
        if hasattr(os, 'link') and os.path.exists(dest):
            # unlink and re-copy, since it might be hard-linked, and
            # we don't want to change the source version
            os.unlink(dest)
            self.copy_file('setup.cfg', dest)

        self.get_finalized_command('egg_info').save_version_info(dest)

    def _manifest_is_not_generated(self):
        # check for special comment used in 2.7.1 and higher
        if not os.path.isfile(self.manifest):
            return False

        with io.open(self.manifest, 'rb') as fp:
            first_line = fp.readline()
        return (first_line !=
                '# file GENERATED by distutils, do NOT edit\n'.encode())

    def read_manifest(self):
        """Read the manifest file (named by 'self.manifest') and use it to
        fill in 'self.filelist', the list of files to include in the source
        distribution.
        """
        log.info("reading manifest file '%s'", self.manifest)
        manifest = open(self.manifest, 'rb')
        for line in manifest:
            # The manifest must contain UTF-8. See #303.
            if six.PY3:
                try:
                    line = line.decode('UTF-8')
                except UnicodeDecodeError:
                    log.warn("%r not UTF-8 decodable -- skipping" % line)
                    continue
            # ignore comments and blank lines
            line = line.strip()
            if line.startswith('#') or not line:
                continue
            self.filelist.append(line)
        manifest.close()
command/register.py000064400000000416151733473720010375 0ustar00import distutils.command.register as orig


class register(orig.register):
    __doc__ = orig.register.__doc__

    def run(self):
        # Make sure that we are using valid current name/version info
        self.run_command('egg_info')
        orig.register.run(self)
command/install_scripts.pyo000064400000005513151733473720012150 0ustar00�
�fc@ssddlmZddljjZddlZddlZddlm	Z	m
Z
mZdejfd��YZdS(i����(tlogN(tDistributiontPathMetadatatensure_directorytinstall_scriptscBs,eZdZd�Zd�Zdd�ZRS(s;Do normal script install, plus any egg_info wrapper scriptscCstjj|�t|_dS(N(torigRtinitialize_optionstFalsetno_ep(tself((sF/usr/lib/python2.7/site-packages/setuptools/command/install_scripts.pyRscCsfddljj}|jd�|jjr>tjj|�n	g|_	|j
rTdS|jd�}t|j
t|j
|j�|j|j�}|jd�}t|dd�}|jd�}t|dt�}|j}|r�d}|j}n|tjkr|g}n|j�}|jj�j|�}	x-|j||	j��D]}
|j|
�qKWdS(Ni����tegg_infot
build_scriptst
executablet
bdist_wininstt_is_runnings
python.exe(tsetuptools.command.easy_installtcommandteasy_installtrun_commandtdistributiontscriptsRRtruntoutfilesRtget_finalized_commandRtegg_baseRR
tegg_nametegg_versiontgetattrtNoneRtScriptWritertWindowsScriptWritertsysRtbesttcommand_spec_classt
from_paramtget_argst	as_headertwrite_script(R	teitei_cmdtdisttbs_cmdt
exec_paramtbw_cmdt
is_wininsttwritertcmdtargs((sF/usr/lib/python2.7/site-packages/setuptools/command/install_scripts.pyRs2
			ttc
Gs�ddlm}m}tjd||j�tjj|j|�}|j	j
|�|�}|js�t|�t
|d|�}	|	j|�|	j�||d|�ndS(s1Write an executable file to the scripts directoryi����(tchmodt
current_umasksInstalling %s script to %stwi�N(RR1R2Rtinfotinstall_dirtostpathtjoinRtappendtdry_runRtopentwritetclose(
R	tscript_nametcontentstmodetignoredR1R2ttargettmasktf((sF/usr/lib/python2.7/site-packages/setuptools/command/install_scripts.pyR%3s		


(t__name__t
__module__t__doc__RRR%(((sF/usr/lib/python2.7/site-packages/setuptools/command/install_scripts.pyR	s		#(t	distutilsRt!distutils.command.install_scriptsRRRR6Rt
pkg_resourcesRRR(((sF/usr/lib/python2.7/site-packages/setuptools/command/install_scripts.pyt<module>s
command/install.pyo000064400000011531151733473720010376 0ustar00�
�fc@s�ddlmZddlZddlZddlZddlZddljjZ	ddl
Z
e	jZde	jfd��YZge	jjD]Z
e
dejkr�e
^q�eje_dS(i����(tDistutilsArgErrorNtinstallcBs�eZdZejjddgZejjddgZdd�fdd�fgZe	e�Z
d	�Zd
�Zd�Z
d�Zed
��Zd�ZRS(s7Use easy_install to install the package, w/dependenciessold-and-unmanageablesTry not to use this!s!single-version-externally-manageds5used by system package builders to create 'flat' eggstinstall_egg_infocCstS(N(tTrue(tself((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyt<lambda>ttinstall_scriptscCstS(N(R(R((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyRRcCs&tjj|�d|_d|_dS(N(torigRtinitialize_optionstNonetold_and_unmanageablet!single_version_externally_managed(R((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyR	 s	cCsXtjj|�|jr%t|_n/|jrT|jrT|jrTtd��qTndS(NsAYou must specify --record or --root when building system packages(RRtfinalize_optionstrootRRtrecordR(R((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyR
%s		cCs8|js|jr"tjj|�Sd|_d|_dS(NR(RRRRthandle_extra_pathR
t	path_filet
extra_dirs(R((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyR0s	cCsX|js|jr"tjj|�S|jtj��sJtjj|�n
|j�dS(N(	RRRRtrunt_called_from_setuptinspecttcurrentframetdo_egg_install(R((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyR:s
cCs�|d
krKd}tj|�tj�dkrGd}tj|�ntStj|�d}|d \}tj|�}|j	j
dd�}|dko�|jd	kS(s�
        Attempt to detect whether run() was called from setup() or by another
        command.  If called by setup(), the parent caller will be the
        'run_command' method in 'distutils.dist', and *its* caller will be
        the 'run_commands' method.  If called any other way, the
        immediate caller *might* be 'run_command', but it won't have been
        called by 'run_commands'. Return True in that case or if a call stack
        is unavailable. Return False otherwise.
        s4Call stack not available. bdist_* commands may fail.t
IronPythons6For best results, pass -X:Frames to enable call stack.iit__name__Rsdistutils.disttrun_commandsN(R
twarningstwarntplatformtpython_implementationRRtgetouterframestgetframeinfot	f_globalstgettfunction(t	run_frametmsgtrestcallertinfot
caller_module((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyREs

cCs�|jjd�}||jddd|jd|j�}|j�d|_|jjtjd��|j	d�|jj
d�jg}tj
r�|jd	tj
�n||_|j�dt_
dS(
Nteasy_installtargstxRRt.s*.eggt	bdist_eggi(tdistributiontget_command_classRRtensure_finalizedtalways_copy_fromt
package_indextscantglobtrun_commandtget_command_objt
egg_outputt
setuptoolstbootstrap_install_fromtinsertR+RR
(RR*tcmdR+((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyR`s$
	
		
N(sold-and-unmanageableNsTry not to use this!(s!single-version-externally-managedNs5used by system package builders to create 'flat' eggs(Rt
__module__t__doc__RRtuser_optionsR
tboolean_optionstnew_commandstdictt_ncR	R
RRtstaticmethodRR(((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyRs 	
	
			
	i(tdistutils.errorsRRR5RRtdistutils.command.installtcommandRRR9t_installtsub_commandsR<RCRA(((s>/usr/lib/python2.7/site-packages/setuptools/command/install.pyt<module>s	l/command/saveopts.py000064400000001222151733473720010411 0ustar00from setuptools.command.setopt import edit_config, option_base


class saveopts(option_base):
    """Save command-line options to a file"""

    description = "save supplied options to setup.cfg or other config file"

    def run(self):
        dist = self.distribution
        settings = {}

        for cmd in dist.command_options:

            if cmd == 'saveopts':
                continue  # don't save our own options!

            for opt, (src, val) in dist.get_option_dict(cmd).items():
                if src == "command line":
                    settings.setdefault(cmd, {})[opt] = val

        edit_config(self.filename, settings, self.dry_run)
lib2to3_ex.py000064400000003735151733473720007114 0ustar00"""
Customized Mixin2to3 support:

 - adds support for converting doctests


This module raises an ImportError on Python 2.
"""

from distutils.util import Mixin2to3 as _Mixin2to3
from distutils import log
from lib2to3.refactor import RefactoringTool, get_fixers_from_package

import setuptools


class DistutilsRefactoringTool(RefactoringTool):
    def log_error(self, msg, *args, **kw):
        log.error(msg, *args)

    def log_message(self, msg, *args):
        log.info(msg, *args)

    def log_debug(self, msg, *args):
        log.debug(msg, *args)


class Mixin2to3(_Mixin2to3):
    def run_2to3(self, files, doctests=False):
        # See of the distribution option has been set, otherwise check the
        # setuptools default.
        if self.distribution.use_2to3 is not True:
            return
        if not files:
            return
        log.info("Fixing " + " ".join(files))
        self.__build_fixer_names()
        self.__exclude_fixers()
        if doctests:
            if setuptools.run_2to3_on_doctests:
                r = DistutilsRefactoringTool(self.fixer_names)
                r.refactor(files, write=True, doctests_only=True)
        else:
            _Mixin2to3.run_2to3(self, files)

    def __build_fixer_names(self):
        if self.fixer_names:
            return
        self.fixer_names = []
        for p in setuptools.lib2to3_fixer_packages:
            self.fixer_names.extend(get_fixers_from_package(p))
        if self.distribution.use_2to3_fixers is not None:
            for p in self.distribution.use_2to3_fixers:
                self.fixer_names.extend(get_fixers_from_package(p))

    def __exclude_fixers(self):
        excluded_fixers = getattr(self, 'exclude_fixers', [])
        if self.distribution.use_2to3_exclude_fixers is not None:
            excluded_fixers.extend(self.distribution.use_2to3_exclude_fixers)
        for fixer_name in excluded_fixers:
            if fixer_name in self.fixer_names:
                self.fixer_names.remove(fixer_name)
script (dev).tmpl000064400000000311151733473720007635 0ustar00# EASY-INSTALL-DEV-SCRIPT: %(spec)r,%(script_name)r
__requires__ = %(spec)r
__import__('pkg_resources').require(%(spec)r)
__file__ = %(dev_path)r
exec(compile(open(__file__).read(), __file__, 'exec'))
glibc.pyc000064400000003650151733473720006361 0ustar00�
�fc@@s\ddlmZddlZddlZddlZd�Zd�Zd�Zd�ZdS(i(tabsolute_importNcC@sktjd�}y
|j}Wntk
r0dSXtj|_|�}t|t�sg|j	d�}n|S(s9Returns glibc version string, or None if not using glibc.tasciiN(
tctypestCDLLtNonetgnu_get_libc_versiontAttributeErrortc_char_ptrestypet
isinstancetstrtdecode(tprocess_namespaceRtversion_str((s4/usr/lib/python2.7/site-packages/setuptools/glibc.pytglibc_version_string
s

	cC@sdtjd|�}|s0tjd|t�tSt|jd��|koct|jd��|kS(Ns$(?P<major>[0-9]+)\.(?P<minor>[0-9]+)s=Expected glibc version with 2 components major.minor, got: %stmajortminor(tretmatchtwarningstwarntRuntimeWarningtFalsetinttgroup(R
trequired_majort
minimum_minortm((s4/usr/lib/python2.7/site-packages/setuptools/glibc.pytcheck_glibc_version$s	cC@s)t�}|dkrtSt|||�S(N(RRRR(RRR
((s4/usr/lib/python2.7/site-packages/setuptools/glibc.pythave_compatible_glibc4s	cC@s't�}|dkrdSd|fSdS(s�Try to determine the glibc version

    Returns a tuple of strings (lib, version) which default to empty strings
    in case the lookup fails.
    ttglibcN(RR(RR(t
glibc_version((s4/usr/lib/python2.7/site-packages/setuptools/glibc.pytlibc_verLs	(	t
__future__RRRRRRRR!(((s4/usr/lib/python2.7/site-packages/setuptools/glibc.pyt<module>s			config.pyc000064400000040770151733473720006552 0ustar00�
�fc@@s�ddlmZmZddlZddlZddlZddlmZddlm	Z	ddl
mZddlm
Z
mZddlmZeed�Zd	�Zed
�Zdefd��YZd
efd��YZdefd��YZdS(i(tabsolute_importtunicode_literalsN(tdefaultdict(tpartial(t
import_module(tDistutilsOptionErrortDistutilsFileError(tstring_typesc	C@s�ddlm}m}tjj|�}tjj|�sMtd|��ntj�}tj	tjj
|��zl|�}|r�|j�ng}||kr�|j|�n|j
|d|�t||jd|�}Wdtj	|�Xt|�S(u,Read given configuration file and returns options from it as a dict.

    :param str|unicode filepath: Path to configuration file
        to get options from.

    :param bool find_others: Whether to search for other configuration files
        which could be on in various places.

    :param bool ignore_option_errors: Whether to silently ignore
        options, values of which could not be resolved (e.g. due to exceptions
        in directives such as file:, attr:, etc.).
        If False exceptions are propagated as expected.

    :rtype: dict
    i(tDistributiont
_Distributionu%Configuration file %s does not exist.t	filenamestignore_option_errorsN(tsetuptools.distRR	tostpathtabspathtisfileRtgetcwdtchdirtdirnametfind_config_filestappendtparse_config_filestparse_configurationtcommand_optionstconfiguration_to_dict(	tfilepathtfind_othersRRR	tcurrent_directorytdistR
thandlers((s5/usr/lib/python2.7/site-packages/setuptools/config.pytread_configuration
s$	
cC@s�tt�}x|D]w}|j}|j}x\|jD]Q}t|d|d�}|dkrot||�}n	|�}||||<q5WqW|S(u�Returns configuration data gathered by given handlers as a dict.

    :param list[ConfigHandler] handlers: Handlers list,
        usually from parse_configuration()

    :rtype: dict
    uget_%sN(Rtdicttsection_prefixt
target_objtset_optionstgetattrtNone(Rtconfig_dictthandlert	obj_aliasR"toptiontgettertvalue((s5/usr/lib/python2.7/site-packages/setuptools/config.pyR<s
			cC@sEt|j||�}|j�t|||�}|j�||fS(u�Performs additional parsing of configuration options
    for a distribution.

    Returns a list of used option handlers.

    :param Distribution distribution:
    :param dict command_options:
    :param bool ignore_option_errors: Whether to silently ignore
        options, values of which could not be resolved (e.g. due to exceptions
        in directives such as file:, attr:, etc.).
        If False exceptions are propagated as expected.
    :rtype: list
    (tConfigMetadataHandlertmetadatatparsetConfigOptionsHandler(tdistributionRRtmetatoptions((s5/usr/lib/python2.7/site-packages/setuptools/config.pyRYs

t
ConfigHandlercB@s�eZdZdZiZed�Zed��Z	d�Z
edd��Zed��Z
ed��Zed��Zed	��Zed
��Zed��Zed��Zedd
��Zd�Zd�ZRS(u1Handles metadata supplied in configuration files.cC@s�i}|j}xT|j�D]F\}}|j|�s=qn|j|d�jd�}|||<qW||_||_||_g|_dS(Nuu.(	R!titemst
startswithtreplacetstripRR"tsectionsR#(tselfR"R2RR8R!tsection_nametsection_options((s5/usr/lib/python2.7/site-packages/setuptools/config.pyt__init__�s				cC@std|jj��dS(u.Metadata item name to parser function mapping.u!%s must provide .parsers propertyN(tNotImplementedErrort	__class__t__name__(R9((s5/usr/lib/python2.7/site-packages/setuptools/config.pytparsers�sc	C@st�}|j}|jj||�}t|||�}||krTt|��n|r^dSt}|jj|�}|r�y||�}Wq�tk
r�t	}|j
s��q�q�Xn|r�dSt|d|d�}|dkr�t|||�n
||�|j
j|�dS(Nuset_%s(ttupleR"taliasestgetR$tKeyErrortFalseR@t	ExceptiontTrueRR%tsetattrR#R(	R9toption_nameR+tunknownR"t
current_valuetskip_optiontparsertsetter((s5/usr/lib/python2.7/site-packages/setuptools/config.pyt__setitem__�s0		
	

u,cC@sft|t�r|Sd|kr.|j�}n|j|�}g|D]}|j�rD|j�^qDS(u�Represents value as a list.

        Value is split either by separator (defaults to comma) or by lines.

        :param value:
        :param separator: List items separator character.
        :rtype: list
        u
(t
isinstancetlistt
splitlinestsplitR7(tclsR+t	separatortchunk((s5/usr/lib/python2.7/site-packages/setuptools/config.pyt_parse_list�s
cC@swd}i}xd|j|�D]S}|j|�\}}}||krYtd|��n|j�||j�<qW|S(uPRepresents value as a dict.

        :param value:
        :rtype: dict
        u=u(Unable to parse option value to dict: %s(RWt	partitionRR7(RTR+RUtresulttlinetkeytseptval((s5/usr/lib/python2.7/site-packages/setuptools/config.pyt_parse_dict�scC@s|j�}|dkS(uQRepresents value as boolean.

        :param value:
        :rtype: bool
        u1utrueuyes(u1utrueuyes(tlower(RTR+((s5/usr/lib/python2.7/site-packages/setuptools/config.pyt_parse_bool�sc@srd}t|t�s|S|j|�s,|S|t|�}d�|jd�D�}dj�fd�|D��S(uiRepresents value as a string, allowing including text
        from nearest files using `file:` directive.

        Directive is sandboxed and won't reach anything outside
        directory with setup.py.

        Examples:
            file: LICENSE
            file: README.rst, CHANGELOG.md, src/file.txt

        :param str value:
        :rtype: str
        ufile:cs@s'|]}tjj|j��VqdS(N(R
RRR7(t.0R((s5/usr/lib/python2.7/site-packages/setuptools/config.pys	<genexpr>su,u
c3@sE|];}�j|�strtjj|�r�j|�VqdS(N(t
_assert_localRGR
RRt
_read_file(RaR(RT(s5/usr/lib/python2.7/site-packages/setuptools/config.pys	<genexpr>	s(RPRR5tlenRStjoin(RTR+tinclude_directivetspect	filepaths((RTs5/usr/lib/python2.7/site-packages/setuptools/config.pyt_parse_file�scC@s,|jtj��s(td|��ndS(Nu#`file:` directive can not access %s(R5R
RR(R((s5/usr/lib/python2.7/site-packages/setuptools/config.pyRbscC@s,tj|dd��}|j�SWdQXdS(Ntencodinguutf-8(tiotopentread(Rtf((s5/usr/lib/python2.7/site-packages/setuptools/config.pyRcscC@s�d}|j|�s|S|j|d�j�jd�}|j�}dj|�}|p^d}tjjdt	j
��zt|�}t||�}Wdtjdt_X|S(u�Represents value as a module attribute.

        Examples:
            attr: package.attr
            attr: package.module.attr

        :param str value:
        :rtype: str
        uattr:uu.u__init__iNi(
R5R6R7RStpopRetsysRtinsertR
RRR$(RTR+tattr_directivet
attrs_patht	attr_nametmodule_nametmodule((s5/usr/lib/python2.7/site-packages/setuptools/config.pyt_parse_attrs!c@s�fd�}|S(u�Returns parser function to represents value as a list.

        Parses a value applying given methods one after another.

        :param parse_methods:
        :rtype: callable
        c@s'|}x�D]}||�}q
W|S(N((R+tparsedtmethod(t
parse_methods(s5/usr/lib/python2.7/site-packages/setuptools/config.pyR.Bs
((RTRzR.((Rzs5/usr/lib/python2.7/site-packages/setuptools/config.pyt_get_parser_compound9s	cC@sLi}|pd�}x0|j�D]"\}\}}||�||<q"W|S(u�Parses section options into a dictionary.

        Optionally applies a given parser to values.

        :param dict section_options:
        :param callable values_parser:
        :rtype: dict
        cS@s|S(N((R]((s5/usr/lib/python2.7/site-packages/setuptools/config.pyt<lambda>Wt(R4(RTR;t
values_parserR+R[t_R]((s5/usr/lib/python2.7/site-packages/setuptools/config.pyt_parse_section_to_dictLs

cC@sIxB|j�D]4\}\}}y|||<Wq
tk
r@q
Xq
WdS(uQParses configuration file section.

        :param dict section_options:
        N(R4RD(R9R;tnameRR+((s5/usr/lib/python2.7/site-packages/setuptools/config.pyt
parse_section\s

cC@s�x�|jj�D]y\}}d}|r5d|}nt|d|jdd�d�}|dkrtd|j|f��n||�qWdS(uTParses configuration file items from one
        or more related sections.

        uu_%suparse_section%su.u__u0Unsupported distribution option section: [%s.%s]N(R8R4R$R6R%RR!(R9R:R;tmethod_postfixtsection_parser_method((s5/usr/lib/python2.7/site-packages/setuptools/config.pyR.hs
	N(R?t
__module__t__doc__R%R!RBRER<tpropertyR@ROtclassmethodRWR^R`RitstaticmethodRbRcRwR{R�R�R.(((s5/usr/lib/python2.7/site-packages/setuptools/config.pyR3ss&	&
 	R,cB@sNeZdZidd6dd6dd6dd6ZeZed	��Zd
�ZRS(umetadatauurlu	home_pageudescriptionusummaryuclassifiersu
classifieru	platformsuplatformcC@s{|j}|j}|j}i|d6|d6|d6|d6|d6|j||�d6|d6|d6|d	6|jd
6|d6S(u.Metadata item name to parser function mapping.u	platformsukeywordsuprovidesurequiresu	obsoletesuclassifiersulicenseudescriptionulong_descriptionuversionuproject_urls(RWRiR^R{t_parse_version(R9t
parse_listt
parse_filet
parse_dict((s5/usr/lib/python2.7/site-packages/setuptools/config.pyR@�s			
cC@sq|j|�}t|�r'|�}nt|t�smt|d�r`djtt|��}qmd|}n|S(uSParses `version` option value.

        :param value:
        :rtype: str

        u__iter__u.u%s(RwtcallableRPRthasattrRetmaptstr(R9R+tversion((s5/usr/lib/python2.7/site-packages/setuptools/config.pyR��s
(	R?R�R!RBREtstrict_modeR�R@R�(((s5/usr/lib/python2.7/site-packages/setuptools/config.pyR,�s
R/cB@s\eZdZed��Zd�Zd�Zd�Zd�Zd�Z	d�Z
d�ZRS(	uoptionscC@s�|j}t|jdd�}|j}|j}i|d6|d6|d6|d6|d6|d6|d	6|d
6|d6|d6|d
6|d6|d6|d6|jd6|jd6|d6S(u.Metadata item name to parser function mapping.RUu;uzip_safeuuse_2to3uinclude_package_dataupackage_diruuse_2to3_fixersuuse_2to3_exclude_fixersuconvert_2to3_doctestsuscriptsueager_resourcesudependency_linksunamespace_packagesuinstall_requiresusetup_requiresu
tests_requireupackagesuentry_pointsu
py_modules(RWRR`R^t_parse_packagesRi(R9R�tparse_list_semicolont
parse_boolR�((s5/usr/lib/python2.7/site-packages/setuptools/config.pyR@�s,			

cC@sZd}|j|�s"|j|�S|j|jjdi��}ddlm}||�S(uTParses `packages` option value.

        :param value:
        :rtype: list
        ufind:u
packages.findi(t
find_packages(R5RWtparse_section_packages__findR8RCt
setuptoolsR�(R9R+tfind_directivetfind_kwargsR�((s5/usr/lib/python2.7/site-packages/setuptools/config.pyR��s
cC@s�|j||j�}dddg}tg|j�D]*\}}||kr4|r4||f^q4�}|jd�}|dk	r�|d|d<n|S(u�Parses `packages.find` configuration file section.

        To be used in conjunction with _parse_packages().

        :param dict section_options:
        uwhereuincludeuexcludeiN(R�RWR R4RCR%(R9R;tsection_datat
valid_keystktvR�twhere((s5/usr/lib/python2.7/site-packages/setuptools/config.pyR��s@cC@s#|j||j�}||d<dS(u`Parses `entry_points` configuration file section.

        :param dict section_options:
        uentry_pointsN(R�RW(R9R;Rx((s5/usr/lib/python2.7/site-packages/setuptools/config.pytparse_section_entry_pointsscC@sB|j||j�}|jd�}|r>||d<|d=n|S(Nu*u(R�RWRC(R9R;Rxtroot((s5/usr/lib/python2.7/site-packages/setuptools/config.pyt_parse_package_datas

cC@s|j|�|d<dS(u`Parses `package_data` configuration file section.

        :param dict section_options:
        upackage_dataN(R�(R9R;((s5/usr/lib/python2.7/site-packages/setuptools/config.pytparse_section_package_datascC@s|j|�|d<dS(uhParses `exclude_package_data` configuration file section.

        :param dict section_options:
        uexclude_package_dataN(R�(R9R;((s5/usr/lib/python2.7/site-packages/setuptools/config.pyt"parse_section_exclude_package_datascC@s/t|jdd�}|j||�|d<dS(ubParses `extras_require` configuration file section.

        :param dict section_options:
        RUu;uextras_requireN(RRWR�(R9R;R�((s5/usr/lib/python2.7/site-packages/setuptools/config.pytparse_section_extras_require%s(R?R�R!R�R@R�R�R�R�R�R�R�(((s5/usr/lib/python2.7/site-packages/setuptools/config.pyR/�s				
		(t
__future__RRRkR
RptcollectionsRt	functoolsRt	importlibRtdistutils.errorsRRtsetuptools.extern.sixRRERRRtobjectR3R,R/(((s5/usr/lib/python2.7/site-packages/setuptools/config.pyt<module>s.	�;lib2to3_ex.pyc000064400000005674151733473720007263 0ustar00�
�fc@sxdZddlmZddlmZddlmZmZddl	Z	defd��YZ
defd	��YZdS(
sy
Customized Mixin2to3 support:

 - adds support for converting doctests


This module raises an ImportError on Python 2.
i����(t	Mixin2to3(tlog(tRefactoringTooltget_fixers_from_packageNtDistutilsRefactoringToolcBs#eZd�Zd�Zd�ZRS(cOstj||�dS(N(Rterror(tselftmsgtargstkw((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyt	log_errorscGstj||�dS(N(Rtinfo(RRR((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pytlog_messagescGstj||�dS(N(Rtdebug(RRR((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyt	log_debugs(t__name__t
__module__R
RR(((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyRs		RcBs&eZed�Zd�Zd�ZRS(cCs�|jjtk	rdS|s dStjddj|��|j�|j�|r�tj	r�t
|j�}|j|dtdt�q�nt
j||�dS(NsFixing t twritet
doctests_only(tdistributiontuse_2to3tTrueRRtjoint_Mixin2to3__build_fixer_namest_Mixin2to3__exclude_fixerst
setuptoolstrun_2to3_on_doctestsRtfixer_namestrefactort
_Mixin2to3trun_2to3(Rtfilestdocteststr((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyRs

	cCs�|jr
dSg|_x'tjD]}|jjt|��q W|jjdk	r�x-|jjD]}|jjt|��q_WndS(N(RRtlib2to3_fixer_packagestextendRRtuse_2to3_fixerstNone(Rtp((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyt__build_fixer_names.s		cCsqt|dg�}|jjdk	r:|j|jj�nx0|D](}||jkrA|jj|�qAqAWdS(Ntexclude_fixers(tgetattrRtuse_2to3_exclude_fixersR&R$Rtremove(Rtexcluded_fixerst
fixer_name((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyt__exclude_fixers8s
(RRtFalseRRR(((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyRs	
(t__doc__tdistutils.utilRRt	distutilsRtlib2to3.refactorRRRR(((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyt<module>s__init__.py000064400000013104151733473720006670 0ustar00"""Extensions to the 'distutils' for large or complex distributions"""

import os
import functools
import distutils.core
import distutils.filelist
from distutils.util import convert_path
from fnmatch import fnmatchcase

from setuptools.extern.six.moves import filter, map

import setuptools.version
from setuptools.extension import Extension
from setuptools.dist import Distribution, Feature
from setuptools.depends import Require
from . import monkey

__all__ = [
    'setup', 'Distribution', 'Feature', 'Command', 'Extension', 'Require',
    'find_packages',
]

__version__ = setuptools.version.__version__

bootstrap_install_from = None

# If we run 2to3 on .py files, should we also convert docstrings?
# Default: yes; assume that we can detect doctests reliably
run_2to3_on_doctests = True
# Standard package names for fixer packages
lib2to3_fixer_packages = ['lib2to3.fixes']


class PackageFinder(object):
    """
    Generate a list of all Python packages found within a directory
    """

    @classmethod
    def find(cls, where='.', exclude=(), include=('*',)):
        """Return a list all Python packages found within directory 'where'

        'where' is the root directory which will be searched for packages.  It
        should be supplied as a "cross-platform" (i.e. URL-style) path; it will
        be converted to the appropriate local path syntax.

        'exclude' is a sequence of package names to exclude; '*' can be used
        as a wildcard in the names, such that 'foo.*' will exclude all
        subpackages of 'foo' (but not 'foo' itself).

        'include' is a sequence of package names to include.  If it's
        specified, only the named packages will be included.  If it's not
        specified, all found packages will be included.  'include' can contain
        shell style wildcard patterns just like 'exclude'.
        """

        return list(cls._find_packages_iter(
            convert_path(where),
            cls._build_filter('ez_setup', '*__pycache__', *exclude),
            cls._build_filter(*include)))

    @classmethod
    def _find_packages_iter(cls, where, exclude, include):
        """
        All the packages found in 'where' that pass the 'include' filter, but
        not the 'exclude' filter.
        """
        for root, dirs, files in os.walk(where, followlinks=True):
            # Copy dirs to iterate over it, then empty dirs.
            all_dirs = dirs[:]
            dirs[:] = []

            for dir in all_dirs:
                full_path = os.path.join(root, dir)
                rel_path = os.path.relpath(full_path, where)
                package = rel_path.replace(os.path.sep, '.')

                # Skip directory trees that are not valid packages
                if ('.' in dir or not cls._looks_like_package(full_path)):
                    continue

                # Should this package be included?
                if include(package) and not exclude(package):
                    yield package

                # Keep searching subdirectories, as there may be more packages
                # down there, even if the parent was excluded.
                dirs.append(dir)

    @staticmethod
    def _looks_like_package(path):
        """Does a directory look like a package?"""
        return os.path.isfile(os.path.join(path, '__init__.py'))

    @staticmethod
    def _build_filter(*patterns):
        """
        Given a list of patterns, return a callable that will be true only if
        the input matches at least one of the patterns.
        """
        return lambda name: any(fnmatchcase(name, pat=pat) for pat in patterns)


class PEP420PackageFinder(PackageFinder):
    @staticmethod
    def _looks_like_package(path):
        return True


find_packages = PackageFinder.find


def _install_setup_requires(attrs):
    # Note: do not use `setuptools.Distribution` directly, as
    # our PEP 517 backend patch `distutils.core.Distribution`.
    dist = distutils.core.Distribution(dict(
        (k, v) for k, v in attrs.items()
        if k in ('dependency_links', 'setup_requires')
    ))
    # Honor setup.cfg's options.
    dist.parse_config_files(ignore_option_errors=True)
    if dist.setup_requires:
        dist.fetch_build_eggs(dist.setup_requires)


def setup(**attrs):
    # Make sure we have any requirements needed to interpret 'attrs'.
    _install_setup_requires(attrs)
    return distutils.core.setup(**attrs)

setup.__doc__ = distutils.core.setup.__doc__


_Command = monkey.get_unpatched(distutils.core.Command)


class Command(_Command):
    __doc__ = _Command.__doc__

    command_consumes_arguments = False

    def __init__(self, dist, **kw):
        """
        Construct the command for dist, updating
        vars(self) with any keyword parameters.
        """
        _Command.__init__(self, dist)
        vars(self).update(kw)

    def reinitialize_command(self, command, reinit_subcommands=0, **kw):
        cmd = _Command.reinitialize_command(self, command, reinit_subcommands)
        vars(cmd).update(kw)
        return cmd


def _find_all_simple(path):
    """
    Find all files under 'path'
    """
    results = (
        os.path.join(base, file)
        for base, dirs, files in os.walk(path, followlinks=True)
        for file in files
    )
    return filter(os.path.isfile, results)


def findall(dir=os.curdir):
    """
    Find all files under 'dir' and return the list of full filenames.
    Unless dir is '.', return full filenames with dir prepended.
    """
    files = _find_all_simple(dir)
    if dir == os.curdir:
        make_rel = functools.partial(os.path.relpath, start=dir)
        files = map(make_rel, files)
    return list(files)


monkey.patch_all()
glob.pyo000064400000011224151733473730006235 0ustar00�
�fc@s�dZddlZddlZddlZddlmZdddgZed�Zed�Z	d	�Z
d
�Zd�Zd�Z
d
�Zejd�Zejd�Zd�Zd�Zd�ZdS(s�
Filename globbing utility. Mostly a copy of `glob` from Python 3.5.

Changes include:
 * `yield from` and PEP3102 `*` removed.
 * `bytes` changed to `six.binary_type`.
 * Hidden files are not ignored.
i����N(tbinary_typetglobtiglobtescapecCstt|d|��S(syReturn a list of paths matching a pathname pattern.

    The pattern may contain simple shell-style wildcards a la
    fnmatch. However, unlike fnmatch, filenames starting with a
    dot are special cases that are not matched by '*' and '?'
    patterns.

    If recursive is true, the pattern '**' will match any files and
    zero or more directories and subdirectories.
    t	recursive(tlistR(tpathnameR((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyRscCs4t||�}|r0t|�r0t|�}n|S(s�Return an iterator which yields the paths matching a pathname pattern.

    The pattern may contain simple shell-style wildcards a la
    fnmatch. However, unlike fnmatch, filenames starting with a
    dot are special cases that are not matched by '*' and '?'
    patterns.

    If recursive is true, the pattern '**' will match any files and
    zero or more directories and subdirectories.
    (t_iglobt_isrecursivetnext(RRtitts((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyR s
ccsntjj|�\}}t|�se|rGtjj|�ra|Vqantjj|�ra|VndS|s�|r�t|�r�x>t||�D]}|Vq�Wnxt||�D]}|Vq�WdS||kr�t|�r�t	||�}n	|g}t|�r%|rt|�rt}q+t}nt
}x<|D]4}x+|||�D]}tjj||�VqHWq2WdS(N(tostpathtsplitt	has_magictlexiststisdirRtglob2tglob1Rtglob0tjoin(RRtdirnametbasenametxtdirstglob_in_dirtname((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyR2s4				
cCsn|s6t|t�r*tjjd�}q6tj}nytj|�}Wntk
r]gSXtj||�S(NtASCII(	t
isinstanceRRtcurdirtencodetlistdirtOSErrortfnmatchtfilter(Rtpatterntnames((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyR]s
cCsN|s"tjj|�rJ|gSn(tjjtjj||��rJ|gSgS(N(RR
RRR(RR((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyRjs
!ccs)|d Vxt|�D]}|VqWdS(Ni(t	_rlistdir(RR$R((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyRzs	ccs�|s6t|t�r*ttjd�}q6tj}nytj|�}Wntjk
r`dSXx_|D]W}|V|r�tjj||�n|}x(t|�D]}tjj||�Vq�WqhWdS(NR(	RRRRR terrorR
RR&(RR%RR
ty((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyR&�s
!s([*?[])cCs:t|t�r!tj|�}ntj|�}|dk	S(N(RRtmagic_check_bytestsearchtmagic_checktNone(Rtmatch((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyR�scCs't|t�r|dkS|dkSdS(Ns**(RR(R$((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyR�s
cCsVtjj|�\}}t|t�r<tjd|�}ntjd|�}||S(s#Escape all special characters.
    s[\1](RR
t
splitdriveRRR)tsubR+(Rtdrive((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyR�s
(t__doc__RtreR"tsetuptools.extern.sixRt__all__tFalseRRRRRRR&tcompileR+R)RRR(((s3/usr/lib/python2.7/site-packages/setuptools/glob.pyt<module>s"	+	
					py33compat.pyc000064400000003270151733473730007302 0ustar00�
�fc@s�ddlZddlZddlZyddlZWnek
rMdZnXddlmZddlm	Z	ej
dd�Zdefd��YZ
eede
�Zeed	e	j�j�ZdS(
i����N(tsix(thtml_parsertOpArgs
opcode argtBytecode_compatcBseZd�Zd�ZRS(cCs
||_dS(N(tcode(tselfR((s9/usr/lib/python2.7/site-packages/setuptools/py33compat.pyt__init__sccs�tjd|jj�}t|jj�}d}d}x�||kr�||}|tjkr�||d||dd|}|d7}|tjkr�tjd}||d�}q9q�nd	}|d7}t
||�Vq9Wd	S(
s>Yield '(op,arg)' pair for each operation in code object 'code'tbiiiiii����iN(tarrayRtco_codetlentdist
HAVE_ARGUMENTtEXTENDED_ARGRt
integer_typestNoneR(Rtbytesteoftptrtextended_argtoptargt	long_type((s9/usr/lib/python2.7/site-packages/setuptools/py33compat.pyt__iter__s 
"

	
(t__name__t
__module__RR(((s9/usr/lib/python2.7/site-packages/setuptools/py33compat.pyRs	tBytecodetunescape(RRtcollectionsthtmltImportErrorRtsetuptools.externRtsetuptools.extern.six.movesRt
namedtupleRtobjectRtgetattrRt
HTMLParserR(((s9/usr/lib/python2.7/site-packages/setuptools/py33compat.pyt<module>s

"py33compat.pyo000064400000003270151733473730007316 0ustar00�
�fc@s�ddlZddlZddlZyddlZWnek
rMdZnXddlmZddlm	Z	ej
dd�Zdefd��YZ
eede
�Zeed	e	j�j�ZdS(
i����N(tsix(thtml_parsertOpArgs
opcode argtBytecode_compatcBseZd�Zd�ZRS(cCs
||_dS(N(tcode(tselfR((s9/usr/lib/python2.7/site-packages/setuptools/py33compat.pyt__init__sccs�tjd|jj�}t|jj�}d}d}x�||kr�||}|tjkr�||d||dd|}|d7}|tjkr�tjd}||d�}q9q�nd	}|d7}t
||�Vq9Wd	S(
s>Yield '(op,arg)' pair for each operation in code object 'code'tbiiiiii����iN(tarrayRtco_codetlentdist
HAVE_ARGUMENTtEXTENDED_ARGRt
integer_typestNoneR(Rtbytesteoftptrtextended_argtoptargt	long_type((s9/usr/lib/python2.7/site-packages/setuptools/py33compat.pyt__iter__s 
"

	
(t__name__t
__module__RR(((s9/usr/lib/python2.7/site-packages/setuptools/py33compat.pyRs	tBytecodetunescape(RRtcollectionsthtmltImportErrorRtsetuptools.externRtsetuptools.extern.six.movesRt
namedtupleRtobjectRtgetattrRt
HTMLParserR(((s9/usr/lib/python2.7/site-packages/setuptools/py33compat.pyt<module>s

"version.pyo000064400000000502151733473730006774 0ustar00�
�fc@s@ddlZyejd�jZWnek
r;dZnXdS(i����Nt
setuptoolstunknown(t
pkg_resourcestget_distributiontversiont__version__t	Exception(((s6/usr/lib/python2.7/site-packages/setuptools/version.pyt<module>s
depends.pyc000064400000014523151733473730006725 0ustar00�
�fc@s�ddlZddlZddlZddlmZddlmZmZmZmZddl	m
Z
dddd	gZddd
��YZdd�Zddd�Zdd
�Zd�Ze�dS(i����N(t
StrictVersion(t
PKG_DIRECTORYtPY_COMPILEDt	PY_SOURCEt	PY_FROZENi(tBytecodetRequiretfind_moduletget_module_constanttextract_constantcBsYeZdZdd	d	d�Zd�Zd�Zd	dd�Zd	d�Zd	d�Z	RS(
s7A prerequisite to building or installing a distributiontcCsn|dkr!|dk	r!t}n|dk	rQ||�}|dkrQd}qQn|jjt��|`dS(Nt__version__(tNoneRt__dict__tupdatetlocalstself(Rtnametrequested_versiontmodulethomepaget	attributetformat((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyt__init__s	cCs*|jdk	r#d|j|jfS|jS(s0Return full package/distribution name, w/versions%s-%sN(RRR(R((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyt	full_name scCs=|jdkp<|jdkp<t|�dko<||jkS(s%Is 'version' sufficiently up-to-date?tunknownN(RRRtstrR(Rtversion((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyt
version_ok&sRcCs�|jdkr]y6t|j|�\}}}|r@|j�n|SWq]tk
rYdSXnt|j|j||�}|dk	r�||k	r�|jdk	r�|j|�S|S(s�Get version number of installed module, 'None', or 'default'

        Search 'paths' for module.  If not found, return 'None'.  If found,
        return the extracted version attribute, or 'default' if no version
        attribute was specified, or the value cannot be determined without
        importing the module.  The version is formatted according to the
        requirement's version format (if any), unless it is 'None' or the
        supplied 'default'.
        N(RRRRtclosetImportErrorRR(Rtpathstdefaulttftptitv((s6/usr/lib/python2.7/site-packages/setuptools/depends.pytget_version+s

'
cCs|j|�dk	S(s/Return true if dependency is present on 'paths'N(R%R(RR((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyt
is_presentFscCs,|j|�}|dkrtS|j|�S(s>Return true if dependency is present and up-to-date on 'paths'N(R%RtFalseR(RRR((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyt
is_currentJsN(
t__name__t
__module__t__doc__RRRRR%R&R((((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyRs
		c
Cs�|jd�}x�|r�|jd�}tj||�\}}\}}}}	|tkrv|pgdg}|g}q|rtd||f��qqW|	S(s7Just like 'imp.find_module()', but with package supportt.iRsCan't find %r in %s(tsplittpoptimpRRR(
RRtpartstpartR!tpathtsuffixtmodetkindtinfo((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyRRs	(c
Csy%t||�\}}\}}}Wntk
r9dSXz�|tkrh|jd�tj|�}	n�|tkr�tj	|�}	no|t
kr�t|j�|d�}	nH|tj
kr�tj||||||f�nttj
||d�SWd|r|j�nXt|	||�S(s�Find 'module' by searching 'paths', and extract 'symbol'

    Return 'None' if 'module' does not exist on 'paths', or it does not define
    'symbol'.  If the module defines 'symbol' as a constant, return the
    constant.  Otherwise, return 'default'.itexecN(RRRRtreadtmarshaltloadRR/tget_frozen_objectRtcompiletsystmodulestload_moduletgetattrRR	(
RtsymbolR RR!R2R3R4R5tcode((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyRes$%

"cCs�||jkrdSt|j�j|�}d}d}d}|}xpt|�D]b}|j}	|j}
|	|kr�|j|
}qP|
|kr�|	|ks�|	|kr�|S|}qPWdS(sExtract the constant value of 'symbol' from 'code'

    If the name 'symbol' is bound to a constant value by the Python code
    object 'code', return that value.  If 'symbol' is bound to an expression,
    return 'default'.  Otherwise, return 'None'.

    Return value is based on the first assignment to 'symbol'.  'symbol' must
    be a global, or at least a non-"fast" local in the code block.  That is,
    only 'STORE_NAME' and 'STORE_GLOBAL' opcodes are checked, and 'symbol'
    must be present in 'code.co_names'.
    iZiaidN(tco_namesRtlisttindexRtopcodetargt	co_consts(RBRAR tname_idxt
STORE_NAMEtSTORE_GLOBALt
LOAD_CONSTtconstt	byte_codetopRG((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyR	�s		$cCsXtjjd�r&tjdkr&dSd}x%|D]}t�|=tj|�q3WdS(s�
    Patch the globals to remove the objects not available on some platforms.

    XXX it'd be better to test assertions about bytecode instead.
    tjavatcliNR	R(R	R(R=tplatformt
startswithtglobalst__all__tremove(tincompatibleR((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyt_update_globals�s"

((R=R/R9tdistutils.versionRRRRRt
py33compatRRURRRRR	RX(((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyt<module>s"C"$	config.pyo000064400000040770151733473730006567 0ustar00�
�fc@@s�ddlmZmZddlZddlZddlZddlmZddlm	Z	ddl
mZddlm
Z
mZddlmZeed�Zd	�Zed
�Zdefd��YZd
efd��YZdefd��YZdS(i(tabsolute_importtunicode_literalsN(tdefaultdict(tpartial(t
import_module(tDistutilsOptionErrortDistutilsFileError(tstring_typesc	C@s�ddlm}m}tjj|�}tjj|�sMtd|��ntj�}tj	tjj
|��zl|�}|r�|j�ng}||kr�|j|�n|j
|d|�t||jd|�}Wdtj	|�Xt|�S(u,Read given configuration file and returns options from it as a dict.

    :param str|unicode filepath: Path to configuration file
        to get options from.

    :param bool find_others: Whether to search for other configuration files
        which could be on in various places.

    :param bool ignore_option_errors: Whether to silently ignore
        options, values of which could not be resolved (e.g. due to exceptions
        in directives such as file:, attr:, etc.).
        If False exceptions are propagated as expected.

    :rtype: dict
    i(tDistributiont
_Distributionu%Configuration file %s does not exist.t	filenamestignore_option_errorsN(tsetuptools.distRR	tostpathtabspathtisfileRtgetcwdtchdirtdirnametfind_config_filestappendtparse_config_filestparse_configurationtcommand_optionstconfiguration_to_dict(	tfilepathtfind_othersRRR	tcurrent_directorytdistR
thandlers((s5/usr/lib/python2.7/site-packages/setuptools/config.pytread_configuration
s$	
cC@s�tt�}x|D]w}|j}|j}x\|jD]Q}t|d|d�}|dkrot||�}n	|�}||||<q5WqW|S(u�Returns configuration data gathered by given handlers as a dict.

    :param list[ConfigHandler] handlers: Handlers list,
        usually from parse_configuration()

    :rtype: dict
    uget_%sN(Rtdicttsection_prefixt
target_objtset_optionstgetattrtNone(Rtconfig_dictthandlert	obj_aliasR"toptiontgettertvalue((s5/usr/lib/python2.7/site-packages/setuptools/config.pyR<s
			cC@sEt|j||�}|j�t|||�}|j�||fS(u�Performs additional parsing of configuration options
    for a distribution.

    Returns a list of used option handlers.

    :param Distribution distribution:
    :param dict command_options:
    :param bool ignore_option_errors: Whether to silently ignore
        options, values of which could not be resolved (e.g. due to exceptions
        in directives such as file:, attr:, etc.).
        If False exceptions are propagated as expected.
    :rtype: list
    (tConfigMetadataHandlertmetadatatparsetConfigOptionsHandler(tdistributionRRtmetatoptions((s5/usr/lib/python2.7/site-packages/setuptools/config.pyRYs

t
ConfigHandlercB@s�eZdZdZiZed�Zed��Z	d�Z
edd��Zed��Z
ed��Zed��Zed	��Zed
��Zed��Zed��Zedd
��Zd�Zd�ZRS(u1Handles metadata supplied in configuration files.cC@s�i}|j}xT|j�D]F\}}|j|�s=qn|j|d�jd�}|||<qW||_||_||_g|_dS(Nuu.(	R!titemst
startswithtreplacetstripRR"tsectionsR#(tselfR"R2RR8R!tsection_nametsection_options((s5/usr/lib/python2.7/site-packages/setuptools/config.pyt__init__�s				cC@std|jj��dS(u.Metadata item name to parser function mapping.u!%s must provide .parsers propertyN(tNotImplementedErrort	__class__t__name__(R9((s5/usr/lib/python2.7/site-packages/setuptools/config.pytparsers�sc	C@st�}|j}|jj||�}t|||�}||krTt|��n|r^dSt}|jj|�}|r�y||�}Wq�tk
r�t	}|j
s��q�q�Xn|r�dSt|d|d�}|dkr�t|||�n
||�|j
j|�dS(Nuset_%s(ttupleR"taliasestgetR$tKeyErrortFalseR@t	ExceptiontTrueRR%tsetattrR#R(	R9toption_nameR+tunknownR"t
current_valuetskip_optiontparsertsetter((s5/usr/lib/python2.7/site-packages/setuptools/config.pyt__setitem__�s0		
	

u,cC@sft|t�r|Sd|kr.|j�}n|j|�}g|D]}|j�rD|j�^qDS(u�Represents value as a list.

        Value is split either by separator (defaults to comma) or by lines.

        :param value:
        :param separator: List items separator character.
        :rtype: list
        u
(t
isinstancetlistt
splitlinestsplitR7(tclsR+t	separatortchunk((s5/usr/lib/python2.7/site-packages/setuptools/config.pyt_parse_list�s
cC@swd}i}xd|j|�D]S}|j|�\}}}||krYtd|��n|j�||j�<qW|S(uPRepresents value as a dict.

        :param value:
        :rtype: dict
        u=u(Unable to parse option value to dict: %s(RWt	partitionRR7(RTR+RUtresulttlinetkeytseptval((s5/usr/lib/python2.7/site-packages/setuptools/config.pyt_parse_dict�scC@s|j�}|dkS(uQRepresents value as boolean.

        :param value:
        :rtype: bool
        u1utrueuyes(u1utrueuyes(tlower(RTR+((s5/usr/lib/python2.7/site-packages/setuptools/config.pyt_parse_bool�sc@srd}t|t�s|S|j|�s,|S|t|�}d�|jd�D�}dj�fd�|D��S(uiRepresents value as a string, allowing including text
        from nearest files using `file:` directive.

        Directive is sandboxed and won't reach anything outside
        directory with setup.py.

        Examples:
            file: LICENSE
            file: README.rst, CHANGELOG.md, src/file.txt

        :param str value:
        :rtype: str
        ufile:cs@s'|]}tjj|j��VqdS(N(R
RRR7(t.0R((s5/usr/lib/python2.7/site-packages/setuptools/config.pys	<genexpr>su,u
c3@sE|];}�j|�strtjj|�r�j|�VqdS(N(t
_assert_localRGR
RRt
_read_file(RaR(RT(s5/usr/lib/python2.7/site-packages/setuptools/config.pys	<genexpr>	s(RPRR5tlenRStjoin(RTR+tinclude_directivetspect	filepaths((RTs5/usr/lib/python2.7/site-packages/setuptools/config.pyt_parse_file�scC@s,|jtj��s(td|��ndS(Nu#`file:` directive can not access %s(R5R
RR(R((s5/usr/lib/python2.7/site-packages/setuptools/config.pyRbscC@s,tj|dd��}|j�SWdQXdS(Ntencodinguutf-8(tiotopentread(Rtf((s5/usr/lib/python2.7/site-packages/setuptools/config.pyRcscC@s�d}|j|�s|S|j|d�j�jd�}|j�}dj|�}|p^d}tjjdt	j
��zt|�}t||�}Wdtjdt_X|S(u�Represents value as a module attribute.

        Examples:
            attr: package.attr
            attr: package.module.attr

        :param str value:
        :rtype: str
        uattr:uu.u__init__iNi(
R5R6R7RStpopRetsysRtinsertR
RRR$(RTR+tattr_directivet
attrs_patht	attr_nametmodule_nametmodule((s5/usr/lib/python2.7/site-packages/setuptools/config.pyt_parse_attrs!c@s�fd�}|S(u�Returns parser function to represents value as a list.

        Parses a value applying given methods one after another.

        :param parse_methods:
        :rtype: callable
        c@s'|}x�D]}||�}q
W|S(N((R+tparsedtmethod(t
parse_methods(s5/usr/lib/python2.7/site-packages/setuptools/config.pyR.Bs
((RTRzR.((Rzs5/usr/lib/python2.7/site-packages/setuptools/config.pyt_get_parser_compound9s	cC@sLi}|pd�}x0|j�D]"\}\}}||�||<q"W|S(u�Parses section options into a dictionary.

        Optionally applies a given parser to values.

        :param dict section_options:
        :param callable values_parser:
        :rtype: dict
        cS@s|S(N((R]((s5/usr/lib/python2.7/site-packages/setuptools/config.pyt<lambda>Wt(R4(RTR;t
values_parserR+R[t_R]((s5/usr/lib/python2.7/site-packages/setuptools/config.pyt_parse_section_to_dictLs

cC@sIxB|j�D]4\}\}}y|||<Wq
tk
r@q
Xq
WdS(uQParses configuration file section.

        :param dict section_options:
        N(R4RD(R9R;tnameRR+((s5/usr/lib/python2.7/site-packages/setuptools/config.pyt
parse_section\s

cC@s�x�|jj�D]y\}}d}|r5d|}nt|d|jdd�d�}|dkrtd|j|f��n||�qWdS(uTParses configuration file items from one
        or more related sections.

        uu_%suparse_section%su.u__u0Unsupported distribution option section: [%s.%s]N(R8R4R$R6R%RR!(R9R:R;tmethod_postfixtsection_parser_method((s5/usr/lib/python2.7/site-packages/setuptools/config.pyR.hs
	N(R?t
__module__t__doc__R%R!RBRER<tpropertyR@ROtclassmethodRWR^R`RitstaticmethodRbRcRwR{R�R�R.(((s5/usr/lib/python2.7/site-packages/setuptools/config.pyR3ss&	&
 	R,cB@sNeZdZidd6dd6dd6dd6ZeZed	��Zd
�ZRS(umetadatauurlu	home_pageudescriptionusummaryuclassifiersu
classifieru	platformsuplatformcC@s{|j}|j}|j}i|d6|d6|d6|d6|d6|j||�d6|d6|d6|d	6|jd
6|d6S(u.Metadata item name to parser function mapping.u	platformsukeywordsuprovidesurequiresu	obsoletesuclassifiersulicenseudescriptionulong_descriptionuversionuproject_urls(RWRiR^R{t_parse_version(R9t
parse_listt
parse_filet
parse_dict((s5/usr/lib/python2.7/site-packages/setuptools/config.pyR@�s			
cC@sq|j|�}t|�r'|�}nt|t�smt|d�r`djtt|��}qmd|}n|S(uSParses `version` option value.

        :param value:
        :rtype: str

        u__iter__u.u%s(RwtcallableRPRthasattrRetmaptstr(R9R+tversion((s5/usr/lib/python2.7/site-packages/setuptools/config.pyR��s
(	R?R�R!RBREtstrict_modeR�R@R�(((s5/usr/lib/python2.7/site-packages/setuptools/config.pyR,�s
R/cB@s\eZdZed��Zd�Zd�Zd�Zd�Zd�Z	d�Z
d�ZRS(	uoptionscC@s�|j}t|jdd�}|j}|j}i|d6|d6|d6|d6|d6|d6|d	6|d
6|d6|d6|d
6|d6|d6|d6|jd6|jd6|d6S(u.Metadata item name to parser function mapping.RUu;uzip_safeuuse_2to3uinclude_package_dataupackage_diruuse_2to3_fixersuuse_2to3_exclude_fixersuconvert_2to3_doctestsuscriptsueager_resourcesudependency_linksunamespace_packagesuinstall_requiresusetup_requiresu
tests_requireupackagesuentry_pointsu
py_modules(RWRR`R^t_parse_packagesRi(R9R�tparse_list_semicolont
parse_boolR�((s5/usr/lib/python2.7/site-packages/setuptools/config.pyR@�s,			

cC@sZd}|j|�s"|j|�S|j|jjdi��}ddlm}||�S(uTParses `packages` option value.

        :param value:
        :rtype: list
        ufind:u
packages.findi(t
find_packages(R5RWtparse_section_packages__findR8RCt
setuptoolsR�(R9R+tfind_directivetfind_kwargsR�((s5/usr/lib/python2.7/site-packages/setuptools/config.pyR��s
cC@s�|j||j�}dddg}tg|j�D]*\}}||kr4|r4||f^q4�}|jd�}|dk	r�|d|d<n|S(u�Parses `packages.find` configuration file section.

        To be used in conjunction with _parse_packages().

        :param dict section_options:
        uwhereuincludeuexcludeiN(R�RWR R4RCR%(R9R;tsection_datat
valid_keystktvR�twhere((s5/usr/lib/python2.7/site-packages/setuptools/config.pyR��s@cC@s#|j||j�}||d<dS(u`Parses `entry_points` configuration file section.

        :param dict section_options:
        uentry_pointsN(R�RW(R9R;Rx((s5/usr/lib/python2.7/site-packages/setuptools/config.pytparse_section_entry_pointsscC@sB|j||j�}|jd�}|r>||d<|d=n|S(Nu*u(R�RWRC(R9R;Rxtroot((s5/usr/lib/python2.7/site-packages/setuptools/config.pyt_parse_package_datas

cC@s|j|�|d<dS(u`Parses `package_data` configuration file section.

        :param dict section_options:
        upackage_dataN(R�(R9R;((s5/usr/lib/python2.7/site-packages/setuptools/config.pytparse_section_package_datascC@s|j|�|d<dS(uhParses `exclude_package_data` configuration file section.

        :param dict section_options:
        uexclude_package_dataN(R�(R9R;((s5/usr/lib/python2.7/site-packages/setuptools/config.pyt"parse_section_exclude_package_datascC@s/t|jdd�}|j||�|d<dS(ubParses `extras_require` configuration file section.

        :param dict section_options:
        RUu;uextras_requireN(RRWR�(R9R;R�((s5/usr/lib/python2.7/site-packages/setuptools/config.pytparse_section_extras_require%s(R?R�R!R�R@R�R�R�R�R�R�R�(((s5/usr/lib/python2.7/site-packages/setuptools/config.pyR/�s				
		(t
__future__RRRkR
RptcollectionsRt	functoolsRt	importlibRtdistutils.errorsRRtsetuptools.extern.sixRRERRRtobjectR3R,R/(((s5/usr/lib/python2.7/site-packages/setuptools/config.pyt<module>s.	�;launch.pyo000064400000001750151733473730006567 0ustar00�
�fc@sAdZddlZddlZd�Zedkr=e�ndS(s[
Launch the Python script on the command line after
setuptools is bootstrapped via import.
i����NcBs�eejd}ed|dddd
�}ejdej(eede�}||�j�}|j	dd�}e
||d	�}||Ud
S(sP
    Run the script in sys.argv[1] as if it had
    been invoked naturally.
    it__file__t__name__t__main__t__doc__topens\r\ns\ntexecN(t__builtins__tsystargvtdicttNonetgetattrttokenizeRtreadtreplacetcompile(tscript_namet	namespacetopen_tscripttnorm_scripttcode((s5/usr/lib/python2.7/site-packages/setuptools/launch.pytrun
s
	R(RRRRR(((s5/usr/lib/python2.7/site-packages/setuptools/launch.pyt<module>s
	launch.pyc000064400000001750151733473730006553 0ustar00�
�fc@sAdZddlZddlZd�Zedkr=e�ndS(s[
Launch the Python script on the command line after
setuptools is bootstrapped via import.
i����NcBs�eejd}ed|dddd
�}ejdej(eede�}||�j�}|j	dd�}e
||d	�}||Ud
S(sP
    Run the script in sys.argv[1] as if it had
    been invoked naturally.
    it__file__t__name__t__main__t__doc__topens\r\ns\ntexecN(t__builtins__tsystargvtdicttNonetgetattrttokenizeRtreadtreplacetcompile(tscript_namet	namespacetopen_tscripttnorm_scripttcode((s5/usr/lib/python2.7/site-packages/setuptools/launch.pytrun
s
	R(RRRRR(((s5/usr/lib/python2.7/site-packages/setuptools/launch.pyt<module>s
	archive_util.pyc000064400000013776151733473730007772 0ustar00�
�fc@s�dZddlZddlZddlZddlZddlZddlZddlmZddl	m
Z
ddddd	d
dgZd	efd��YZd
�Z
e
dd�Ze
d�Ze
d�Ze
d�ZeeefZdS(s/Utilities for extracting common archive formatsi����N(tDistutilsError(tensure_directorytunpack_archivetunpack_zipfiletunpack_tarfiletdefault_filtertUnrecognizedFormattextraction_driverstunpack_directorycBseZdZRS(s#Couldn't recognize the archive type(t__name__t
__module__t__doc__(((s;/usr/lib/python2.7/site-packages/setuptools/archive_util.pyRscCs|S(s@The default progress/filter callback; returns True for all files((tsrctdst((s;/usr/lib/python2.7/site-packages/setuptools/archive_util.pyRscCsZxS|ptD]5}y||||�Wntk
r=q
q
XdSq
Wtd|��dS(s�Unpack `filename` to `extract_dir`, or raise ``UnrecognizedFormat``

    `progress_filter` is a function taking two arguments: a source path
    internal to the archive ('/'-separated), and a filesystem path where it
    will be extracted.  The callback must return the desired extract path
    (which may be the same as the one passed in), or else ``None`` to skip
    that file or directory.  The callback can thus be used to report on the
    progress of the extraction, as well as to filter the items extracted or
    alter their extraction paths.

    `drivers`, if supplied, must be a non-empty sequence of functions with the
    same signature as this function (minus the `drivers` argument), that raise
    ``UnrecognizedFormat`` if they do not support extracting the designated
    archive type.  The `drivers` are tried in sequence until one is found that
    does not raise an error, or until all are exhausted (in which case
    ``UnrecognizedFormat`` is raised).  If you do not supply a sequence of
    drivers, the module's ``extraction_drivers`` constant will be used, which
    means that ``unpack_zipfile`` and ``unpack_tarfile`` will be tried, in that
    order.
    Ns!Not a recognized archive type: %s(RR(tfilenametextract_dirtprogress_filtertdriverstdriver((s;/usr/lib/python2.7/site-packages/setuptools/archive_util.pyRs
cCs:tjj|�s%td|��nid|f|6}x�tj|�D]�\}}}||\}}xD|D]<}	||	dtjj||	�f|tjj||	�<qnWx�|D]y}
tjj||
�}|||
|�}|s�q�nt|�tjj||
�}
tj|
|�tj	|
|�q�WqHWdS(s�"Unpack" a directory, using the same interface as for archives

    Raises ``UnrecognizedFormat`` if `filename` is not a directory
    s%s is not a directorytt/N(
tostpathtisdirRtwalktjoinRtshutiltcopyfiletcopystat(RRRtpathstbasetdirstfilesRR
tdtfttarget((s;/usr/lib/python2.7/site-packages/setuptools/archive_util.pyR?s"
:

c
CsGtj|�s%td|f��ntj|��
}x|j�D]�}|j}|jd�sDd|jd�kr}qDntj	j
||jd��}|||�}|s�qDn|jd�r�t|�nAt|�|j
|j�}t|d��}|j|�WdQX|jd?}	|	rDtj||	�qDqDWWdQXdS(s�Unpack zip `filename` to `extract_dir`

    Raises ``UnrecognizedFormat`` if `filename` is not a zipfile (as determined
    by ``zipfile.is_zipfile()``).  See ``unpack_archive()`` for an explanation
    of the `progress_filter` argument.
    s%s is not a zip fileRs..twbNi(tzipfilet
is_zipfileRtZipFiletinfolistRt
startswithtsplitRRRtendswithRtreadtopentwritet
external_attrtchmod(
RRRtztinfotnameR#tdataR"tunix_attributes((s;/usr/lib/python2.7/site-packages/setuptools/archive_util.pyRZs(	$


c

Cs�ytj|�}Wn'tjk
r<td|f��nXtj|���d�|_xk|D]c}|j}|jd�r`d|j	d�kr`t
jj||j	d��}x�|dk	r6|j�s�|j�r6|j}|j�r$tj|j�}tj||�}tj|�}n|j|�}q�W|dk	r�|j�s[|j�r�|||�}	|	r�|	jt
j�r�|	d }	ny|j||	�Wq�tjk
r�q�Xq�q�q`q`WtSWdQXdS(s�Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir`

    Raises ``UnrecognizedFormat`` if `filename` is not a tarfile (as determined
    by ``tarfile.open()``).  See ``unpack_archive()`` for an explanation
    of the `progress_filter` argument.
    s/%s is not a compressed or uncompressed tar filecWsdS(N(tNone(targs((s;/usr/lib/python2.7/site-packages/setuptools/archive_util.pyt<lambda>�RRs..i����N(ttarfileR-tTarErrorRt
contextlibtclosingtchownR3R)R*RRRR6tislnktissymtlinknamet	posixpathtdirnametnormpatht
_getmembertisfileRR+tsept_extract_membertExtractErrortTrue(
RRRttarobjtmemberR3t
prelim_dsttlinkpathRt	final_dst((s;/usr/lib/python2.7/site-packages/setuptools/archive_util.pyRs8
	%'	$
(RR%R9RRRAR;tdistutils.errorsRt
pkg_resourcesRt__all__RRR6RRRRR(((s;/usr/lib/python2.7/site-packages/setuptools/archive_util.pyt<module>s$	"%.extension.py000064400000003301151733473730007144 0ustar00import re
import functools
import distutils.core
import distutils.errors
import distutils.extension

from setuptools.extern.six.moves import map

from .monkey import get_unpatched


def _have_cython():
    """
    Return True if Cython can be imported.
    """
    cython_impl = 'Cython.Distutils.build_ext'
    try:
        # from (cython_impl) import build_ext
        __import__(cython_impl, fromlist=['build_ext']).build_ext
        return True
    except Exception:
        pass
    return False


# for compatibility
have_pyrex = _have_cython

_Extension = get_unpatched(distutils.core.Extension)


class Extension(_Extension):
    """Extension that uses '.c' files in place of '.pyx' files"""

    def __init__(self, name, sources, *args, **kw):
        # The *args is needed for compatibility as calls may use positional
        # arguments. py_limited_api may be set only via keyword.
        self.py_limited_api = kw.pop("py_limited_api", False)
        _Extension.__init__(self, name, sources, *args, **kw)

    def _convert_pyx_sources_to_lang(self):
        """
        Replace sources with .pyx extensions to sources with the target
        language extension. This mechanism allows language authors to supply
        pre-converted sources but to prefer the .pyx sources.
        """
        if _have_cython():
            # the build has Cython, so allow it to compile the .pyx files
            return
        lang = self.language or ''
        target_ext = '.cpp' if lang.lower() == 'c++' else '.c'
        sub = functools.partial(re.sub, '.pyx$', target_ext)
        self.sources = list(map(sub, self.sources))


class Library(Extension):
    """Just like a regular Extension, but built as a library instead"""
namespaces.py000064400000006177151733473730007265 0ustar00import os
from distutils import log
import itertools

from setuptools.extern.six.moves import map


flatten = itertools.chain.from_iterable


class Installer:

    nspkg_ext = '-nspkg.pth'

    def install_namespaces(self):
        nsp = self._get_all_ns_packages()
        if not nsp:
            return
        filename, ext = os.path.splitext(self._get_target())
        filename += self.nspkg_ext
        self.outputs.append(filename)
        log.info("Installing %s", filename)
        lines = map(self._gen_nspkg_line, nsp)

        if self.dry_run:
            # always generate the lines, even in dry run
            list(lines)
            return

        with open(filename, 'wt') as f:
            f.writelines(lines)

    def uninstall_namespaces(self):
        filename, ext = os.path.splitext(self._get_target())
        filename += self.nspkg_ext
        if not os.path.exists(filename):
            return
        log.info("Removing %s", filename)
        os.remove(filename)

    def _get_target(self):
        return self.target

    _nspkg_tmpl = (
        "import sys, types, os",
        "has_mfs = sys.version_info > (3, 5)",
        "p = os.path.join(%(root)s, *%(pth)r)",
        "importlib = has_mfs and __import__('importlib.util')",
        "has_mfs and __import__('importlib.machinery')",
        "m = has_mfs and "
            "sys.modules.setdefault(%(pkg)r, "
                "importlib.util.module_from_spec("
                    "importlib.machinery.PathFinder.find_spec(%(pkg)r, "
                        "[os.path.dirname(p)])))",
        "m = m or "
            "sys.modules.setdefault(%(pkg)r, types.ModuleType(%(pkg)r))",
        "mp = (m or []) and m.__dict__.setdefault('__path__',[])",
        "(p not in mp) and mp.append(p)",
    )
    "lines for the namespace installer"

    _nspkg_tmpl_multi = (
        'm and setattr(sys.modules[%(parent)r], %(child)r, m)',
    )
    "additional line(s) when a parent package is indicated"

    def _get_root(self):
        return "sys._getframe(1).f_locals['sitedir']"

    def _gen_nspkg_line(self, pkg):
        # ensure pkg is not a unicode string under Python 2.7
        pkg = str(pkg)
        pth = tuple(pkg.split('.'))
        root = self._get_root()
        tmpl_lines = self._nspkg_tmpl
        parent, sep, child = pkg.rpartition('.')
        if parent:
            tmpl_lines += self._nspkg_tmpl_multi
        return ';'.join(tmpl_lines) % locals() + '\n'

    def _get_all_ns_packages(self):
        """Return sorted list of all package namespaces"""
        pkgs = self.distribution.namespace_packages or []
        return sorted(flatten(map(self._pkg_names, pkgs)))

    @staticmethod
    def _pkg_names(pkg):
        """
        Given a namespace package, yield the components of that
        package.

        >>> names = Installer._pkg_names('a.b.c')
        >>> set(names) == set(['a', 'a.b', 'a.b.c'])
        True
        """
        parts = pkg.split('.')
        while parts:
            yield '.'.join(parts)
            parts.pop()


class DevelopInstaller(Installer):
    def _get_root(self):
        return repr(str(self.egg_path))

    def _get_target(self):
        return self.egg_link
msvc.pyc000064400000116640151733473730006256 0ustar00�
�fc@sydZddlZddlZddlZddlZddlZddlmZddl	m
Z
ddlmZej
�dkr�ddl	mZejZnd	fd
��YZe�ZeejjfZyddlmZWnek
r�nXd�Zd
d�Zd�Zd�Zdd�Zdfd��YZdfd��YZdfd��YZdfd��YZ dS(s@
Improved support for Microsoft Visual C++ compilers.

Known supported compilers:
--------------------------
Microsoft Visual C++ 9.0:
    Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64)
    Microsoft Windows SDK 6.1 (x86, x64, ia64)
    Microsoft Windows SDK 7.0 (x86, x64, ia64)

Microsoft Visual C++ 10.0:
    Microsoft Windows SDK 7.1 (x86, x64, ia64)

Microsoft Visual C++ 14.0:
    Microsoft Visual C++ Build Tools 2015 (x86, x64, arm)
    Microsoft Visual Studio 2017 (x86, x64, arm, arm64)
    Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64)
i����N(t
LegacyVersion(tfilterfalsei(t
get_unpatchedtWindows(twinregRcBs eZdZdZdZdZRS(N(t__name__t
__module__tNonet
HKEY_USERStHKEY_CURRENT_USERtHKEY_LOCAL_MACHINEtHKEY_CLASSES_ROOT(((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR(s(tRegcCs�d}|d|f}ytj|d�}WnQtk
ry&|d|f}tj|d�}Wq�tk
r{d}q�XnX|r�tjjjj|d�}tjj|�r�|Sntt	�|�S(s+
    Patched "distutils.msvc9compiler.find_vcvarsall" to use the standalone
    compiler build for Python (VCForPython). Fall back to original behavior
    when the standalone compiler is not available.

    Redirect the path of "vcvarsall.bat".

    Known supported compilers
    -------------------------
    Microsoft Visual C++ 9.0:
        Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64)

    Parameters
    ----------
    version: float
        Required Microsoft Visual C++ version.

    Return
    ------
    vcvarsall.bat path: str
    s-Software\%sMicrosoft\DevDiv\VCForPython\%0.1ftt
installdirsWow6432Node\s
vcvarsall.batN(
Rt	get_valuetKeyErrorRtostpathtjointisfileRtmsvc9_find_vcvarsall(tversiontVC_BASEtkeyt
productdirt	vcvarsall((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR?s

tx86cOs�y#tt�}|||||�SWn'tjjk
r<ntk
rLnXyt||�j�SWn,tjjk
r�}t|||��nXdS(s�
    Patched "distutils.msvc9compiler.query_vcvarsall" for support extra
    compilers.

    Set environment without use of "vcvarsall.bat".

    Known supported compilers
    -------------------------
    Microsoft Visual C++ 9.0:
        Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64)
        Microsoft Windows SDK 6.1 (x86, x64, ia64)
        Microsoft Windows SDK 7.0 (x86, x64, ia64)

    Microsoft Visual C++ 10.0:
        Microsoft Windows SDK 7.1 (x86, x64, ia64)

    Parameters
    ----------
    ver: float
        Required Microsoft Visual C++ version.
    arch: str
        Target architecture.

    Return
    ------
    environment: dict
    N(	Rtmsvc9_query_vcvarsallt	distutilsterrorstDistutilsPlatformErrort
ValueErrortEnvironmentInfot
return_envt_augment_exception(tvertarchtargstkwargstorigtexc((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRjs
cCsxytt�|�SWntjjk
r-nXyt|dd�j�SWn)tjjk
rs}t|d��nXdS(s'
    Patched "distutils._msvccompiler._get_vc_env" for support extra
    compilers.

    Set environment without use of "vcvarsall.bat".

    Known supported compilers
    -------------------------
    Microsoft Visual C++ 14.0:
        Microsoft Visual C++ Build Tools 2015 (x86, x64, arm)
        Microsoft Visual Studio 2017 (x86, x64, arm, arm64)
        Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64)

    Parameters
    ----------
    plat_spec: str
        Target architecture.

    Return
    ------
    environment: dict
    t
vc_min_verg,@N(Rtmsvc14_get_vc_envRRRR!R"R#(t	plat_specR)((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR+�s
cOsbdtjkrOddl}t|j�td�krO|jjj||�Sntt	�||�S(s�
    Patched "distutils._msvccompiler.gen_lib_options" for fix
    compatibility between "numpy.distutils" and "distutils._msvccompiler"
    (for Numpy < 1.11.2)
    snumpy.distutilsi����Ns1.11.2(
tsystmodulestnumpyRt__version__Rt	ccompilertgen_lib_optionsRtmsvc14_gen_lib_options(R&R'tnp((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR3�s
R
cCs�|jd}d|j�ks1d|j�kr�d}|jt��}d}|dkr�|j�jd�dkr�|d	7}||d
7}q�|d7}q�|dkr�|d
7}||d7}q�|dkr�|d7}q�n|f|_dS(sl
    Add details to the exception message to help guide the user
    as to what action will resolve it.
    iRsvisual cs0Microsoft Visual C++ {version:0.1f} is required.s-www.microsoft.com/download/details.aspx?id=%dg"@tia64i����s* Get it with "Microsoft Windows SDK 7.0": iBs% Get it from http://aka.ms/vcpython27g$@s* Get it with "Microsoft Windows SDK 7.1": iW g,@sj Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-toolsN(R&tlowertformattlocalstfind(R)RR%tmessagettmplt
msdownload((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR#�s 
$


tPlatformInfocBszeZdZejdd�j�Zd�Zed��Z	d�Z
d�Zeed�Z
eed�Zed	�ZRS(
s�
    Current and Target Architectures informations.

    Parameters
    ----------
    arch: str
        Target architecture.
    tprocessor_architectureR
cCs|j�jdd�|_dS(Ntx64tamd64(R6treplaceR%(tselfR%((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt__init__�scCs|j|jjd�dS(Nt_i(R%R9(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt
target_cpu�scCs
|jdkS(NR(RE(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt
target_is_x86scCs
|jdkS(NR(tcurrent_cpu(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytcurrent_is_x86scCs=|jdkr|rdS|jdkr2|r2dSd|jS(sj
        Current platform specific subfolder.

        Parameters
        ----------
        hidex86: bool
            return '' and not '�' if architecture is x86.
        x64: bool
            return 'd' and not 'md64' if architecture is amd64.

        Return
        ------
        subfolder: str
            '	arget', or '' (see hidex86 parameter)
        RR
R@s\x64s\%s(RG(RBthidex86R?((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytcurrent_dir	scCs=|jdkr|rdS|jdkr2|r2dSd|jS(sr
        Target platform specific subfolder.

        Parameters
        ----------
        hidex86: bool
            return '' and not '\x86' if architecture is x86.
        x64: bool
            return '\x64' and not '\amd64' if architecture is amd64.

        Return
        ------
        subfolder: str
            '\current', or '' (see hidex86 parameter)
        RR
R@s\x64s\%s(RE(RBRIR?((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt
target_dirscCsB|rdn|j}|j|kr(dS|j�jdd|�S(so
        Cross platform specific subfolder.

        Parameters
        ----------
        forcex86: bool
            Use 'x86' as current architecture even if current acritecture is
            not x86.

        Return
        ------
        subfolder: str
            '' if target architecture is current architecture,
            '\current_target' if not.
        RR
s\s\%s_(RGRERKRA(RBtforcex86tcurrent((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt	cross_dir5s(RRt__doc__tsafe_envtgetR6RGRCtpropertyRERFRHtFalseRJRKRN(((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR=�s			tRegistryInfocBs�eZdZejejejejfZd�Z	e
d��Ze
d��Ze
d��Z
e
d��Ze
d��Ze
d��Ze
d��Ze
d	��Ze
d
��Zed�Zd�ZRS(
s�
    Microsoft Visual Studio related registry informations.

    Parameters
    ----------
    platform_info: PlatformInfo
        "PlatformInfo" instance.
    cCs
||_dS(N(tpi(RBt
platform_info((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRCZscCsdS(s<
        Microsoft Visual Studio root registry key.
        tVisualStudio((RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytvisualstudio]scCstjj|jd�S(s;
        Microsoft Visual Studio SxS registry key.
        tSxS(RRRRX(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytsxsdscCstjj|jd�S(s8
        Microsoft Visual C++ VC7 registry key.
        tVC7(RRRRZ(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytvckscCstjj|jd�S(s;
        Microsoft Visual Studio VS7 registry key.
        tVS7(RRRRZ(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytvsrscCsdS(s?
        Microsoft Visual C++ for Python registry key.
        sDevDiv\VCForPython((RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt
vc_for_pythonyscCsdS(s-
        Microsoft SDK registry key.
        sMicrosoft SDKs((RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt
microsoft_sdk�scCstjj|jd�S(s>
        Microsoft Windows/Platform SDK registry key.
        R(RRRR`(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytwindows_sdk�scCstjj|jd�S(s<
        Microsoft .NET Framework SDK registry key.
        tNETFXSDK(RRRR`(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt	netfx_sdk�scCsdS(s<
        Microsoft Windows Kits Roots registry key.
        sWindows Kits\Installed Roots((RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytwindows_kits_roots�scCs:|jj�s|rdnd}tjjd|d|�S(s

        Return key in Microsoft software registry.

        Parameters
        ----------
        key: str
            Registry key path where look.
        x86: str
            Force x86 software registry.

        Return
        ------
        str: value
        R
tWow6432NodetSoftwaret	Microsoft(RURHRRR(RBRRtnode64((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt	microsoft�s!cCs�tj}tj}|j}x�|jD]�}y||||�d|�}Wnkttfk
r�|jj�s%y"||||t	�d|�}Wq�ttfk
r�q%q�Xq�q%nXytj
||�dSWq%ttfk
r�q%Xq%WdS(s
        Look for values in registry in Microsoft software registry.

        Parameters
        ----------
        key: str
            Registry key path where look.
        name: str
            Value name to find.

        Return
        ------
        str: value
        iN(RtKEY_READtOpenKeyRitHKEYStOSErrortIOErrorRURHtTruetQueryValueEx(RBRtnameRjtopenkeytmsthkeytbkey((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytlookup�s"			"
(RRRORRR	R
RRlRCRRRXRZR\R^R_R`RaRcRdRSRiRv(((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRTLs"	t
SystemInfocBsjeZdZejdd�Zejdd�Zejde�Zdd�Z	d�Z
d�Zed��Z
ed	��Zd
�Zd�Zed��Zed
��Zed��Zed��Zed��Zed��Zed��Zed��Zed��Zed��Zed��Zed��Zed��Zd�Zdd�ZRS(s�
    Microsoft Windows and Visual Studio related system inormations.

    Parameters
    ----------
    registry_info: RegistryInfo
        "RegistryInfo" instance.
    vc_ver: float
        Required Microsoft Visual C++ version.
    tWinDirR
tProgramFilessProgramFiles(x86)cCs1||_|jj|_|p'|j�|_dS(N(triRUt_find_latest_available_vc_vertvc_ver(RBt
registry_infoR|((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRC�s	cCsBy|j�dSWn)tk
r=d}tjj|��nXdS(Ni����s%No Microsoft Visual C++ version found(tfind_available_vc_verst
IndexErrorRRR(RBterr((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR{�s

cCs�|jj}|jj|jj|jjf}g}xI|jjD];}x2|D]*}y%tj|||�dtj�}Wnt	t
fk
r�qMnXtj|�\}}}	xdt|�D]V}
y<t
tj||
�d�}||kr�|j|�nWq�tk
rq�Xq�Wx`t|�D]R}
y8t
tj||
��}||kr^|j|�nWq!tk
rrq!Xq!WqMWq@Wt|�S(sC
        Find all available Microsoft Visual C++ versions.
        i(RzRiR\R_R^RlRRkRjRmRntQueryInfoKeytrangetfloatt	EnumValuetappendR tEnumKeytsorted(RBRstvckeystvc_versRtRRutsubkeystvaluesRDtiR$((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR~�s2!
%

cCsKd|j}tjj|j|�}|jj|jjd|j�pJ|S(s4
        Microsoft Visual Studio directory.
        sMicrosoft Visual Studio %0.1fs%0.1f(R|RRRtProgramFilesx86RzRvR^(RBRqtdefault((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytVSInstallDir
s
cCs�|j|j�p|j�}tjj|jjd|j�}|jj	|d�}|rqtjj|d�n|}|jj	|jj
d|j�p�|}tjj|�s�d}tj
j|��n|S(s1
        Microsoft Visual C++ directory.
        s%0.1fRtVCs(Microsoft Visual C++ directory not found(R�t	_guess_vct_guess_vc_legacyRRRRzR_R|RvR\tisdirRRR(RBtguess_vctreg_patht	python_vct
default_vcRtmsg((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytVCInstallDirs"!(cCs||jdkrdSd}tjj|j|�}y*tj|�d}tjj||�SWntttfk
rwnXdS(s*
        Locate Visual C for 2017
        g,@Ns
VC\Tools\MSVCi����(	R|RRRR�tlistdirRmRnR(RBR�R�tvc_exact_ver((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR�0scCs#d|j}tjj|j|�S(s<
        Locate Visual C for versions prior to 2017
        s Microsoft Visual Studio %0.1f\VC(R|RRRR�(RBR�((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR�@s
cCsc|jdkrdS|jdkr&dS|jdkr9dS|jdkrLdS|jdkr_dSdS(sN
        Microsoft Windows SDK versions for specified MSVC++ version.
        g"@s7.0s6.1s6.0ag$@s7.1s7.0ag&@s8.0s8.0ag(@s8.1s8.1ag,@s10.0N(s7.0s6.1s6.0a(s7.1s7.0a(s8.0s8.0a(s8.1s8.1a(s10.0s8.1(R|(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytWindowsSdkVersionGscCs|jtjj|jd��S(s4
        Microsoft Windows SDK last version
        tlib(t_use_last_dir_nameRRRt
WindowsSdkDir(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytWindowsSdkLastVersionWscCs�d}xO|jD]D}tjj|jjd|�}|jj|d�}|rPqqW|srtjj|�r�tjj|jjd|j	�}|jj|d�}|r�tjj|d�}q�n|s�tjj|�rKxd|jD]V}||j
d� }d|}tjj|j|�}tjj|�r�|}q�q�Wn|setjj|�r�xQ|jD]C}d	|}tjj|j|�}tjj|�ro|}qoqoWn|s�tjj|jd
�}n|S(s2
        Microsoft Windows SDK directory.
        R
sv%stinstallationfolders%0.1fRtWinSDKt.sMicrosoft SDKs\Windows Kits\%ssMicrosoft SDKs\Windows\v%stPlatformSDK(
R�RRRRzRaRvR�R_R|trfindRyR�(RBtsdkdirR$tlocRtinstall_basetintvertd((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR�_s6"

c	Cs8|jdkrd}d}n<d}|jdkr9tnt}|jjdtd|�}d||jd	d
�f}g}|jdkr�x9|jD]+}|tjj	|j
j||�g7}q�Wnx:|jD]/}|tjj	|j
j
d||�g7}q�Wx-|D]%}|j
j|d
�}|rPqqW|S(s=
        Microsoft Windows SDK executable directory.
        g&@i#R
i(g(@R?RIsWinSDK-NetFx%dTools%ss\t-g,@sv%sAR�(R|RoRSRURJRAtNetFxSdkVersionRRRRzRcR�RaRv(	RBtnetfxverR%RItfxtregpathsR$Rtexecpath((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytWindowsSDKExecutablePath�s$	,-
cCsAd|j}tjj|jj|�}|jj|d�p@dS(s0
        Microsoft Visual F# directory.
        s%0.1f\Setup\F#RR
(R|RRRRzRXRv(RBR((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytFSharpInstallDir�s
cCsb|jdkrd}nd}x7|D]/}|jj|jjd|�}|r%Pq%q%W|padS(s8
        Microsoft Universal CRT SDK directory.
        g,@t10t81s
kitsroot%sR
(R�R�((R|RzRvRd(RBtversR$R�((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytUniversalCRTSdkDir�s	

cCs|jtjj|jd��S(s@
        Microsoft Universal C Runtime SDK last version
        R�(R�RRRR�(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytUniversalCRTSdkLastVersion�scCs|jdkrdSdSdS(s8
        Microsoft .NET Framework SDK versions.
        g,@s4.6.1s4.6N(s4.6.1s4.6((R|(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR��scCsXxK|jD]@}tjj|jj|�}|jj|d�}|r
Pq
q
W|pWdS(s9
        Microsoft .NET Framework SDK directory.
        tkitsinstallationfolderR
(R�RRRRzRcRv(RBR$R�R�((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytNetFxSdkDir�scCs7tjj|jd�}|jj|jjd�p6|S(s;
        Microsoft .NET Framework 32bit directory.
        sMicrosoft.NET\Frameworktframeworkdir32(RRRRxRzRvR\(RBtguess_fw((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytFrameworkDir32�scCs7tjj|jd�}|jj|jjd�p6|S(s;
        Microsoft .NET Framework 64bit directory.
        sMicrosoft.NET\Framework64tframeworkdir64(RRRRxRzRvR\(RBR�((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytFrameworkDir64�scCs
|jd�S(s:
        Microsoft .NET Framework 32bit versions.
        i (t_find_dot_net_versions(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytFrameworkVersion32�scCs
|jd�S(s:
        Microsoft .NET Framework 64bit versions.
        i@(R�(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytFrameworkVersion64�scCs�|jj|jjd|�}t|d|�}|pM|j|d�pMd}|jdkrn|df}nR|jdkr�|j�d d	kr�d
n|df}n|jdkr�d}n|jdkr�d}n|S(s�
        Find Microsoft .NET Framework versions.

        Parameters
        ----------
        bits: int
            Platform number of bits: 32 or 64.
        sframeworkver%dsFrameworkDir%dtvR
g(@sv4.0g$@itv4s
v4.0.30319sv3.5g"@s
v2.0.50727g @sv3.0(sv3.5s
v2.0.50727(sv3.0s
v2.0.50727(RzRvR\tgetattrR�R|R6(RBtbitstreg_vertdot_net_dirR$tframeworkver((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR�s
		cs;��fd�ttj���D�}t|d�p:dS(s�
        Return name of the last dir in path or '' if no dir found.

        Parameters
        ----------
        path: str
            Use dirs in this path
        prefix: str
            Use only dirs startings by this prefix
        c3sE|];}tjjtjj�|��r|j��r|VqdS(N(RRR�Rt
startswith(t.0tdir_name(Rtprefix(s3/usr/lib/python2.7/site-packages/setuptools/msvc.pys	<genexpr>)s!R
N(treversedRR�tnextR(RBRR�t
matching_dirs((RR�s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR�sN( RRRORPRQRxRyR�RRCR{R~RRR�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�(((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRw�s4
				&		R!cBs�eZdZddd�Zed��Zed��Zed��Zed��Z	ed��Z
ed��Zed	��Zed
��Z
ed��Zed��Zd
�Zed��Zed��Zed��Zed��Zed��Zed��Zed��Zed��Zed��Zed��Zed��Zed��Zed��Zed�Zd�Z dd�Z!RS(sY
    Return environment variables for specified Microsoft Visual C++ version
    and platform : Lib, Include, Path and libpath.

    This function is compatible with Microsoft Visual C++ 9.0 to 14.0.

    Script created by analysing Microsoft environment configuration files like
    "vcvars[...].bat", "SetEnv.Cmd", "vcbuildtools.bat", ...

    Parameters
    ----------
    arch: str
        Target architecture.
    vc_ver: float
        Required Microsoft Visual C++ version. If not set, autodetect the last
        version.
    vc_min_ver: float
        Minimum Microsoft Visual C++ version.
    icCsdt|�|_t|j�|_t|j|�|_|j|kr`d}tjj	|��ndS(Ns.No suitable Microsoft Visual C++ version found(
R=RURTRzRwtsiR|RRR(RBR%R|R*R�((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRCIscCs
|jjS(s/
        Microsoft Visual C++ version.
        (R�R|(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR|RscCs�ddg}|jdkrd|jjdtdt�}|dg7}|dg7}|d|g7}ng|D]!}tjj|jj|�^qkS(	s/
        Microsoft Visual Studio Tools
        sCommon7\IDEs
Common7\Toolsg,@RIR?s1Common7\IDE\CommonExtensions\Microsoft\TestWindowsTeam Tools\Performance ToolssTeam Tools\Performance Tools%s(	R|RURJRoRRRR�R�(RBtpathstarch_subdirR((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytVSToolsYs

cCs4tjj|jjd�tjj|jjd�gS(sL
        Microsoft Visual C++ & Microsoft Foundation Class Includes
        tIncludesATLMFC\Include(RRRR�R�(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt
VCIncludeshscCs�|jdkr'|jjdt�}n|jjdt�}d|d|g}|jdkrs|d|g7}ng|D]!}tjj|jj|�^qzS(sM
        Microsoft Visual C++ & Microsoft Foundation Class Libraries
        g.@R?RIsLib%ssATLMFC\Lib%sg,@sLib\store%s(	R|RURKRoRRRR�R�(RBR�R�R((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytVCLibrariespscCs/|jdkrgStjj|jjd�gS(sA
        Microsoft Visual C++ store references Libraries
        g,@sLib\store\references(R|RRRR�R�(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytVCStoreRefs�scCs�|j}tjj|jd�g}|jdkr9tnt}|jj	|�}|r}|tjj|jd|�g7}n|jdkr�d|jj
dt�}|tjj|j|�g7}n�|jdkrs|jj�r�dnd}|tjj|j||jjd	t��g7}|jj
|jjkr�|tjj|j||jj
d	t��g7}q�n|tjj|jd
�g7}|S(s,
        Microsoft Visual C++ Tools
        t
VCPackagesg$@sBin%sg,@RIg.@s
bin\HostX86%ss
bin\HostX64%sR?tBin(R�RRRR�R|RoRSRURNRJRHRKRGRE(RBR�ttoolsRLR�Rthost_dir((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytVCTools�s&	&"&,cCs�|jdkrJ|jjdtdt�}tjj|jjd|�gS|jjdt�}tjj|jjd�}|j	}tjj|d||f�gSdS(s1
        Microsoft Windows SDK Libraries
        g$@RIR?sLib%sR�s%sum%sN(
R|RURKRoRRRR�R�t_sdk_subdir(RBR�R�tlibver((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytOSLibraries�s 	cCs�tjj|jjd�}|jdkrC|tjj|d�gS|jdkr^|j}nd}tjj|d|�tjj|d|�tjj|d|�gSd	S(
s/
        Microsoft Windows SDK Include
        tincludeg$@tglg,@R
s%sshareds%sums%swinrtN(RRRR�R�R|R�(RBR�tsdkver((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt
OSIncludes�scCstjj|jjd�}g}|jdkr@||j7}n|jdkrn|tjj|d�g7}n|jdkr||tjj|jjd�tjj|dd�tjj|d	d�tjj|d
d�tjj|jjddd
|jddd�g7}n|S(s7
        Microsoft Windows SDK Libraries Paths
        t
Referencesg"@g&@sCommonConfiguration\Neutralg,@t
UnionMetadatas'Windows.Foundation.UniversalApiContracts1.0.0.0s%Windows.Foundation.FoundationContracts,Windows.Networking.Connectivity.WwanContractt
ExtensionSDKssMicrosoft.VCLibss%0.1ftCommonConfigurationtneutral(RRRR�R�R|R�(RBtreftlibpath((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt	OSLibpath�s>					
cCst|j��S(s-
        Microsoft Windows SDK Tools
        (tlistt
_sdk_tools(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytSdkTools�sccs�|jdkrG|jdkr$dnd}tjj|jj|�Vn|jj�s�|jjdt	�}d|}tjj|jj|�Vn|jdks�|jdkr
|jj
�r�d}n|jjd	t	dt	�}d
|}tjj|jj|�Vnl|jdkrvtjj|jjd�}|jjdt	�}|jj}tjj|d||f�Vn|jjr�|jjVndS(
s=
        Microsoft Windows SDK Tools paths generator
        g.@g&@R�sBin\x86R?sBin%sg$@R
RIsBin\NETFX 4.0 Tools%ss%s%sN(
R|RRRR�R�RURHRJRoRFR�R�(RBtbin_dirR�RR�((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR��s(
	
!cCs|jj}|rd|SdS(s6
        Microsoft Windows SDK version subdir
        s%s\R
(R�R�(RBtucrtver((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR�scCs/|jdkrgStjj|jjd�gS(s-
        Microsoft Windows SDK Setup
        g"@tSetup(R|RRRR�R�(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytSdkSetup%scCs�|j}|j}|jdkrDt}|j�o>|j�}n6|j�pY|j�}|jdkpw|jdk}g}|r�|g|jD]}t	j
j|j|�^q�7}n|r�|g|j
D]}t	j
j|j|�^q�7}n|S(s0
        Microsoft .NET Framework Tools
        g$@R@(RUR�R|RoRFRHRGRER�RRRR�R�R�(RBRUR�t	include32t	include64R�R$((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytFxTools/s		//cCsU|jdks|jjr gS|jjdt�}tjj|jjd|�gS(s8
        Microsoft .Net Framework SDK Libraries
        g,@R?slib\um%s(	R|R�R�RURKRoRRR(RBR�((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytNetFxSDKLibrariesGscCs<|jdks|jjr gStjj|jjd�gS(s7
        Microsoft .Net Framework SDK Includes
        g,@s
include\um(R|R�R�RRR(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytNetFxSDKIncludesRscCstjj|jjd�gS(s>
        Microsoft Visual Studio Team System Database
        s
VSTSDB\Deploy(RRRR�R�(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytVsTDb\scCs�|jdkrgS|jdkrF|jj}|jjdt�}n|jj}d}d|j|f}tjj	||�g}|jdkr�|tjj	||d�g7}n|S(s(
        Microsoft Build Engine
        g(@g.@RIR
sMSBuild\%0.1f\bin%stRoslyn(
R|R�R�RURJRoR�RRR(RBt	base_pathR�Rtbuild((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytMSBuildcs"cCs/|jdkrgStjj|jjd�gS(s.
        Microsoft HTML Help Workshop
        g&@sHTML Help Workshop(R|RRRR�R�(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytHTMLHelpWorkshopzscCsl|jdkrgS|jjdt�}tjj|jjd�}|j	}tjj|d||f�gS(s=
        Microsoft Universal C Runtime SDK Libraries
        g,@R?R�s%sucrt%s(
R|RURKRoRRRR�R�t_ucrt_subdir(RBR�R�R�((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt
UCRTLibraries�s	cCsK|jdkrgStjj|jjd�}tjj|d|j�gS(s;
        Microsoft Universal C Runtime SDK Include
        g,@R�s%sucrt(R|RRRR�R�R�(RBR�((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytUCRTIncludes�scCs|jj}|rd|SdS(sB
        Microsoft Universal C Runtime SDK version subdir
        s%s\R
(R�R�(RBR�((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR��scCs,|jdkr"|jdkr"gS|jjS(s%
        Microsoft Visual F#
        g&@g(@(R|R�R�(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytFSharp�scCs�|jjdt�}|jdkr9|jj}d}n|jjjdd�}d}|jdkrldn|j}|||j|f}tjj	||�S(sA
        Microsoft Visual C++ runtime redistribuable dll
        R?is-redist%s\Microsoft.VC%d0.CRT\vcruntime%d0.dlls\Toolss\Redists.onecore%s\Microsoft.VC%d0.CRT\vcruntime%d0.dllg,@(
RURKRoR|R�R�RARRR(RBR�tredist_patht	vcruntimetdll_ver((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytVCRuntimeRedist�s	cCstd|jd|j|j|j|jg|�d|jd|j|j|j|j	|j
g|�d|jd|j|j|j|jg|�d|jd|j
|j|j|j|j|j|j|j|jg	|��}|jdkrtjj|j�r|j|d<n|S(s�
        Return environment dict.

        Parameters
        ----------
        exists: bool
            It True, only return existing paths.
        R�R�R�Ritpy_vcruntime_redist(tdictt_build_pathsR�R�RR�R�R�R�R�R�R�R�R�R�R�R�R�R�R�RR|RRRR(RBtexiststenv((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR"�sD												$c
Cs�tjj|�}tj|d�jtj�}tj||�}|rctt	tj
j|��n|}|s�d|j�}t
jj|��n|j|�}	tjj|	�S(s
        Given an environment variable name and specified paths,
        return a pathsep-separated string of paths containing
        unique, extant, directories from those paths and from
        the environment variable. Raise an error if no paths
        are resolved.
        R
s %s environment variable is empty(t	itertoolstchaint
from_iterableRPRQtsplitRtpathsepR�tfilterRR�tupperRRRt_unique_everseenR(
RBRqtspec_path_listsR	t
spec_pathst	env_pathsR�textant_pathsR�tunique_paths((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR�s	'ccs�t�}|j}|dkrMxgt|j|�D]}||�|Vq1Wn;x8|D]0}||�}||krT||�|VqTqTWdS(s�
        List unique elements, preserving order.
        Remember all elements ever seen.

        _unique_everseen('AAAABBBCCDAABBB') --> A B C D

        _unique_everseen('ABBCcAD', str.lower) --> A B C D
        N(tsettaddRRt__contains__(RBtiterableRtseentseen_addtelementtk((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRs			


N("RRRORRCRRR|R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�RR�RRRoR"RR(((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR!1s:		 -	




-	(!RORR-tplatformRtdistutils.errorsRt#setuptools.extern.packaging.versionRtsetuptools.extern.six.movesRtmonkeyRtsystemRtenvironRPRtImportErrorRRt_msvc9_suppress_errorstdistutils.msvc9compilerRRRR+R3R#R=RTRwR!(((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt<module>s:	
	+/	&	
%[��adep_util.py000064400000001647151733473730006750 0ustar00from distutils.dep_util import newer_group

# yes, this is was almost entirely copy-pasted from
# 'newer_pairwise()', this is just another convenience
# function.
def newer_pairwise_group(sources_groups, targets):
    """Walk both arguments in parallel, testing if each source group is newer
    than its corresponding target. Returns a pair of lists (sources_groups,
    targets) where sources is newer than target, according to the semantics
    of 'newer_group()'.
    """
    if len(sources_groups) != len(targets):
        raise ValueError("'sources_group' and 'targets' must be the same length")

    # build a pair of lists (sources_groups, targets) where source is newer
    n_sources = []
    n_targets = []
    for i in range(len(sources_groups)):
        if newer_group(sources_groups[i], targets[i]):
            n_sources.append(sources_groups[i])
            n_targets.append(targets[i])

    return n_sources, n_targets
script.tmpl000064400000000212151733473730006756 0ustar00# EASY-INSTALL-SCRIPT: %(spec)r,%(script_name)r
__requires__ = %(spec)r
__import__('pkg_resources').run_script(%(spec)r, %(script_name)r)
msvc.py000064400000117655151733473730006122 0ustar00"""
Improved support for Microsoft Visual C++ compilers.

Known supported compilers:
--------------------------
Microsoft Visual C++ 9.0:
    Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64)
    Microsoft Windows SDK 6.1 (x86, x64, ia64)
    Microsoft Windows SDK 7.0 (x86, x64, ia64)

Microsoft Visual C++ 10.0:
    Microsoft Windows SDK 7.1 (x86, x64, ia64)

Microsoft Visual C++ 14.0:
    Microsoft Visual C++ Build Tools 2015 (x86, x64, arm)
    Microsoft Visual Studio 2017 (x86, x64, arm, arm64)
    Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64)
"""

import os
import sys
import platform
import itertools
import distutils.errors
from setuptools.extern.packaging.version import LegacyVersion

from setuptools.extern.six.moves import filterfalse

from .monkey import get_unpatched

if platform.system() == 'Windows':
    from setuptools.extern.six.moves import winreg
    safe_env = os.environ
else:
    """
    Mock winreg and environ so the module can be imported
    on this platform.
    """

    class winreg:
        HKEY_USERS = None
        HKEY_CURRENT_USER = None
        HKEY_LOCAL_MACHINE = None
        HKEY_CLASSES_ROOT = None

    safe_env = dict()

_msvc9_suppress_errors = (
    # msvc9compiler isn't available on some platforms
    ImportError,

    # msvc9compiler raises DistutilsPlatformError in some
    # environments. See #1118.
    distutils.errors.DistutilsPlatformError,
)

try:
    from distutils.msvc9compiler import Reg
except _msvc9_suppress_errors:
    pass


def msvc9_find_vcvarsall(version):
    """
    Patched "distutils.msvc9compiler.find_vcvarsall" to use the standalone
    compiler build for Python (VCForPython). Fall back to original behavior
    when the standalone compiler is not available.

    Redirect the path of "vcvarsall.bat".

    Known supported compilers
    -------------------------
    Microsoft Visual C++ 9.0:
        Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64)

    Parameters
    ----------
    version: float
        Required Microsoft Visual C++ version.

    Return
    ------
    vcvarsall.bat path: str
    """
    VC_BASE = r'Software\%sMicrosoft\DevDiv\VCForPython\%0.1f'
    key = VC_BASE % ('', version)
    try:
        # Per-user installs register the compiler path here
        productdir = Reg.get_value(key, "installdir")
    except KeyError:
        try:
            # All-user installs on a 64-bit system register here
            key = VC_BASE % ('Wow6432Node\\', version)
            productdir = Reg.get_value(key, "installdir")
        except KeyError:
            productdir = None

    if productdir:
        vcvarsall = os.path.os.path.join(productdir, "vcvarsall.bat")
        if os.path.isfile(vcvarsall):
            return vcvarsall

    return get_unpatched(msvc9_find_vcvarsall)(version)


def msvc9_query_vcvarsall(ver, arch='x86', *args, **kwargs):
    """
    Patched "distutils.msvc9compiler.query_vcvarsall" for support extra
    compilers.

    Set environment without use of "vcvarsall.bat".

    Known supported compilers
    -------------------------
    Microsoft Visual C++ 9.0:
        Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64)
        Microsoft Windows SDK 6.1 (x86, x64, ia64)
        Microsoft Windows SDK 7.0 (x86, x64, ia64)

    Microsoft Visual C++ 10.0:
        Microsoft Windows SDK 7.1 (x86, x64, ia64)

    Parameters
    ----------
    ver: float
        Required Microsoft Visual C++ version.
    arch: str
        Target architecture.

    Return
    ------
    environment: dict
    """
    # Try to get environement from vcvarsall.bat (Classical way)
    try:
        orig = get_unpatched(msvc9_query_vcvarsall)
        return orig(ver, arch, *args, **kwargs)
    except distutils.errors.DistutilsPlatformError:
        # Pass error if Vcvarsall.bat is missing
        pass
    except ValueError:
        # Pass error if environment not set after executing vcvarsall.bat
        pass

    # If error, try to set environment directly
    try:
        return EnvironmentInfo(arch, ver).return_env()
    except distutils.errors.DistutilsPlatformError as exc:
        _augment_exception(exc, ver, arch)
        raise


def msvc14_get_vc_env(plat_spec):
    """
    Patched "distutils._msvccompiler._get_vc_env" for support extra
    compilers.

    Set environment without use of "vcvarsall.bat".

    Known supported compilers
    -------------------------
    Microsoft Visual C++ 14.0:
        Microsoft Visual C++ Build Tools 2015 (x86, x64, arm)
        Microsoft Visual Studio 2017 (x86, x64, arm, arm64)
        Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64)

    Parameters
    ----------
    plat_spec: str
        Target architecture.

    Return
    ------
    environment: dict
    """
    # Try to get environment from vcvarsall.bat (Classical way)
    try:
        return get_unpatched(msvc14_get_vc_env)(plat_spec)
    except distutils.errors.DistutilsPlatformError:
        # Pass error Vcvarsall.bat is missing
        pass

    # If error, try to set environment directly
    try:
        return EnvironmentInfo(plat_spec, vc_min_ver=14.0).return_env()
    except distutils.errors.DistutilsPlatformError as exc:
        _augment_exception(exc, 14.0)
        raise


def msvc14_gen_lib_options(*args, **kwargs):
    """
    Patched "distutils._msvccompiler.gen_lib_options" for fix
    compatibility between "numpy.distutils" and "distutils._msvccompiler"
    (for Numpy < 1.11.2)
    """
    if "numpy.distutils" in sys.modules:
        import numpy as np
        if LegacyVersion(np.__version__) < LegacyVersion('1.11.2'):
            return np.distutils.ccompiler.gen_lib_options(*args, **kwargs)
    return get_unpatched(msvc14_gen_lib_options)(*args, **kwargs)


def _augment_exception(exc, version, arch=''):
    """
    Add details to the exception message to help guide the user
    as to what action will resolve it.
    """
    # Error if MSVC++ directory not found or environment not set
    message = exc.args[0]

    if "vcvarsall" in message.lower() or "visual c" in message.lower():
        # Special error message if MSVC++ not installed
        tmpl = 'Microsoft Visual C++ {version:0.1f} is required.'
        message = tmpl.format(**locals())
        msdownload = 'www.microsoft.com/download/details.aspx?id=%d'
        if version == 9.0:
            if arch.lower().find('ia64') > -1:
                # For VC++ 9.0, if IA64 support is needed, redirect user
                # to Windows SDK 7.0
                message += ' Get it with "Microsoft Windows SDK 7.0": '
                message += msdownload % 3138
            else:
                # For VC++ 9.0 redirect user to Vc++ for Python 2.7 :
                # This redirection link is maintained by Microsoft.
                # Contact vspython@microsoft.com if it needs updating.
                message += ' Get it from http://aka.ms/vcpython27'
        elif version == 10.0:
            # For VC++ 10.0 Redirect user to Windows SDK 7.1
            message += ' Get it with "Microsoft Windows SDK 7.1": '
            message += msdownload % 8279
        elif version >= 14.0:
            # For VC++ 14.0 Redirect user to Visual C++ Build Tools
            message += (' Get it with "Microsoft Visual C++ Build Tools": '
                        r'http://landinghub.visualstudio.com/'
                        'visual-cpp-build-tools')

    exc.args = (message, )


class PlatformInfo:
    """
    Current and Target Architectures informations.

    Parameters
    ----------
    arch: str
        Target architecture.
    """
    current_cpu = safe_env.get('processor_architecture', '').lower()

    def __init__(self, arch):
        self.arch = arch.lower().replace('x64', 'amd64')

    @property
    def target_cpu(self):
        return self.arch[self.arch.find('_') + 1:]

    def target_is_x86(self):
        return self.target_cpu == 'x86'

    def current_is_x86(self):
        return self.current_cpu == 'x86'

    def current_dir(self, hidex86=False, x64=False):
        """
        Current platform specific subfolder.

        Parameters
        ----------
        hidex86: bool
            return '' and not '\x86' if architecture is x86.
        x64: bool
            return '\x64' and not '\amd64' if architecture is amd64.

        Return
        ------
        subfolder: str
            '\target', or '' (see hidex86 parameter)
        """
        return (
            '' if (self.current_cpu == 'x86' and hidex86) else
            r'\x64' if (self.current_cpu == 'amd64' and x64) else
            r'\%s' % self.current_cpu
        )

    def target_dir(self, hidex86=False, x64=False):
        r"""
        Target platform specific subfolder.

        Parameters
        ----------
        hidex86: bool
            return '' and not '\x86' if architecture is x86.
        x64: bool
            return '\x64' and not '\amd64' if architecture is amd64.

        Return
        ------
        subfolder: str
            '\current', or '' (see hidex86 parameter)
        """
        return (
            '' if (self.target_cpu == 'x86' and hidex86) else
            r'\x64' if (self.target_cpu == 'amd64' and x64) else
            r'\%s' % self.target_cpu
        )

    def cross_dir(self, forcex86=False):
        r"""
        Cross platform specific subfolder.

        Parameters
        ----------
        forcex86: bool
            Use 'x86' as current architecture even if current acritecture is
            not x86.

        Return
        ------
        subfolder: str
            '' if target architecture is current architecture,
            '\current_target' if not.
        """
        current = 'x86' if forcex86 else self.current_cpu
        return (
            '' if self.target_cpu == current else
            self.target_dir().replace('\\', '\\%s_' % current)
        )


class RegistryInfo:
    """
    Microsoft Visual Studio related registry informations.

    Parameters
    ----------
    platform_info: PlatformInfo
        "PlatformInfo" instance.
    """
    HKEYS = (winreg.HKEY_USERS,
             winreg.HKEY_CURRENT_USER,
             winreg.HKEY_LOCAL_MACHINE,
             winreg.HKEY_CLASSES_ROOT)

    def __init__(self, platform_info):
        self.pi = platform_info

    @property
    def visualstudio(self):
        """
        Microsoft Visual Studio root registry key.
        """
        return 'VisualStudio'

    @property
    def sxs(self):
        """
        Microsoft Visual Studio SxS registry key.
        """
        return os.path.join(self.visualstudio, 'SxS')

    @property
    def vc(self):
        """
        Microsoft Visual C++ VC7 registry key.
        """
        return os.path.join(self.sxs, 'VC7')

    @property
    def vs(self):
        """
        Microsoft Visual Studio VS7 registry key.
        """
        return os.path.join(self.sxs, 'VS7')

    @property
    def vc_for_python(self):
        """
        Microsoft Visual C++ for Python registry key.
        """
        return r'DevDiv\VCForPython'

    @property
    def microsoft_sdk(self):
        """
        Microsoft SDK registry key.
        """
        return 'Microsoft SDKs'

    @property
    def windows_sdk(self):
        """
        Microsoft Windows/Platform SDK registry key.
        """
        return os.path.join(self.microsoft_sdk, 'Windows')

    @property
    def netfx_sdk(self):
        """
        Microsoft .NET Framework SDK registry key.
        """
        return os.path.join(self.microsoft_sdk, 'NETFXSDK')

    @property
    def windows_kits_roots(self):
        """
        Microsoft Windows Kits Roots registry key.
        """
        return r'Windows Kits\Installed Roots'

    def microsoft(self, key, x86=False):
        """
        Return key in Microsoft software registry.

        Parameters
        ----------
        key: str
            Registry key path where look.
        x86: str
            Force x86 software registry.

        Return
        ------
        str: value
        """
        node64 = '' if self.pi.current_is_x86() or x86 else 'Wow6432Node'
        return os.path.join('Software', node64, 'Microsoft', key)

    def lookup(self, key, name):
        """
        Look for values in registry in Microsoft software registry.

        Parameters
        ----------
        key: str
            Registry key path where look.
        name: str
            Value name to find.

        Return
        ------
        str: value
        """
        KEY_READ = winreg.KEY_READ
        openkey = winreg.OpenKey
        ms = self.microsoft
        for hkey in self.HKEYS:
            try:
                bkey = openkey(hkey, ms(key), 0, KEY_READ)
            except (OSError, IOError):
                if not self.pi.current_is_x86():
                    try:
                        bkey = openkey(hkey, ms(key, True), 0, KEY_READ)
                    except (OSError, IOError):
                        continue
                else:
                    continue
            try:
                return winreg.QueryValueEx(bkey, name)[0]
            except (OSError, IOError):
                pass


class SystemInfo:
    """
    Microsoft Windows and Visual Studio related system inormations.

    Parameters
    ----------
    registry_info: RegistryInfo
        "RegistryInfo" instance.
    vc_ver: float
        Required Microsoft Visual C++ version.
    """

    # Variables and properties in this class use originals CamelCase variables
    # names from Microsoft source files for more easy comparaison.
    WinDir = safe_env.get('WinDir', '')
    ProgramFiles = safe_env.get('ProgramFiles', '')
    ProgramFilesx86 = safe_env.get('ProgramFiles(x86)', ProgramFiles)

    def __init__(self, registry_info, vc_ver=None):
        self.ri = registry_info
        self.pi = self.ri.pi
        self.vc_ver = vc_ver or self._find_latest_available_vc_ver()

    def _find_latest_available_vc_ver(self):
        try:
            return self.find_available_vc_vers()[-1]
        except IndexError:
            err = 'No Microsoft Visual C++ version found'
            raise distutils.errors.DistutilsPlatformError(err)

    def find_available_vc_vers(self):
        """
        Find all available Microsoft Visual C++ versions.
        """
        ms = self.ri.microsoft
        vckeys = (self.ri.vc, self.ri.vc_for_python, self.ri.vs)
        vc_vers = []
        for hkey in self.ri.HKEYS:
            for key in vckeys:
                try:
                    bkey = winreg.OpenKey(hkey, ms(key), 0, winreg.KEY_READ)
                except (OSError, IOError):
                    continue
                subkeys, values, _ = winreg.QueryInfoKey(bkey)
                for i in range(values):
                    try:
                        ver = float(winreg.EnumValue(bkey, i)[0])
                        if ver not in vc_vers:
                            vc_vers.append(ver)
                    except ValueError:
                        pass
                for i in range(subkeys):
                    try:
                        ver = float(winreg.EnumKey(bkey, i))
                        if ver not in vc_vers:
                            vc_vers.append(ver)
                    except ValueError:
                        pass
        return sorted(vc_vers)

    @property
    def VSInstallDir(self):
        """
        Microsoft Visual Studio directory.
        """
        # Default path
        name = 'Microsoft Visual Studio %0.1f' % self.vc_ver
        default = os.path.join(self.ProgramFilesx86, name)

        # Try to get path from registry, if fail use default path
        return self.ri.lookup(self.ri.vs, '%0.1f' % self.vc_ver) or default

    @property
    def VCInstallDir(self):
        """
        Microsoft Visual C++ directory.
        """
        self.VSInstallDir

        guess_vc = self._guess_vc() or self._guess_vc_legacy()

        # Try to get "VC++ for Python" path from registry as default path
        reg_path = os.path.join(self.ri.vc_for_python, '%0.1f' % self.vc_ver)
        python_vc = self.ri.lookup(reg_path, 'installdir')
        default_vc = os.path.join(python_vc, 'VC') if python_vc else guess_vc

        # Try to get path from registry, if fail use default path
        path = self.ri.lookup(self.ri.vc, '%0.1f' % self.vc_ver) or default_vc

        if not os.path.isdir(path):
            msg = 'Microsoft Visual C++ directory not found'
            raise distutils.errors.DistutilsPlatformError(msg)

        return path

    def _guess_vc(self):
        """
        Locate Visual C for 2017
        """
        if self.vc_ver <= 14.0:
            return

        default = r'VC\Tools\MSVC'
        guess_vc = os.path.join(self.VSInstallDir, default)
        # Subdir with VC exact version as name
        try:
            vc_exact_ver = os.listdir(guess_vc)[-1]
            return os.path.join(guess_vc, vc_exact_ver)
        except (OSError, IOError, IndexError):
            pass

    def _guess_vc_legacy(self):
        """
        Locate Visual C for versions prior to 2017
        """
        default = r'Microsoft Visual Studio %0.1f\VC' % self.vc_ver
        return os.path.join(self.ProgramFilesx86, default)

    @property
    def WindowsSdkVersion(self):
        """
        Microsoft Windows SDK versions for specified MSVC++ version.
        """
        if self.vc_ver <= 9.0:
            return ('7.0', '6.1', '6.0a')
        elif self.vc_ver == 10.0:
            return ('7.1', '7.0a')
        elif self.vc_ver == 11.0:
            return ('8.0', '8.0a')
        elif self.vc_ver == 12.0:
            return ('8.1', '8.1a')
        elif self.vc_ver >= 14.0:
            return ('10.0', '8.1')

    @property
    def WindowsSdkLastVersion(self):
        """
        Microsoft Windows SDK last version
        """
        return self._use_last_dir_name(os.path.join(
            self.WindowsSdkDir, 'lib'))

    @property
    def WindowsSdkDir(self):
        """
        Microsoft Windows SDK directory.
        """
        sdkdir = ''
        for ver in self.WindowsSdkVersion:
            # Try to get it from registry
            loc = os.path.join(self.ri.windows_sdk, 'v%s' % ver)
            sdkdir = self.ri.lookup(loc, 'installationfolder')
            if sdkdir:
                break
        if not sdkdir or not os.path.isdir(sdkdir):
            # Try to get "VC++ for Python" version from registry
            path = os.path.join(self.ri.vc_for_python, '%0.1f' % self.vc_ver)
            install_base = self.ri.lookup(path, 'installdir')
            if install_base:
                sdkdir = os.path.join(install_base, 'WinSDK')
        if not sdkdir or not os.path.isdir(sdkdir):
            # If fail, use default new path
            for ver in self.WindowsSdkVersion:
                intver = ver[:ver.rfind('.')]
                path = r'Microsoft SDKs\Windows Kits\%s' % (intver)
                d = os.path.join(self.ProgramFiles, path)
                if os.path.isdir(d):
                    sdkdir = d
        if not sdkdir or not os.path.isdir(sdkdir):
            # If fail, use default old path
            for ver in self.WindowsSdkVersion:
                path = r'Microsoft SDKs\Windows\v%s' % ver
                d = os.path.join(self.ProgramFiles, path)
                if os.path.isdir(d):
                    sdkdir = d
        if not sdkdir:
            # If fail, use Platform SDK
            sdkdir = os.path.join(self.VCInstallDir, 'PlatformSDK')
        return sdkdir

    @property
    def WindowsSDKExecutablePath(self):
        """
        Microsoft Windows SDK executable directory.
        """
        # Find WinSDK NetFx Tools registry dir name
        if self.vc_ver <= 11.0:
            netfxver = 35
            arch = ''
        else:
            netfxver = 40
            hidex86 = True if self.vc_ver <= 12.0 else False
            arch = self.pi.current_dir(x64=True, hidex86=hidex86)
        fx = 'WinSDK-NetFx%dTools%s' % (netfxver, arch.replace('\\', '-'))

        # liste all possibles registry paths
        regpaths = []
        if self.vc_ver >= 14.0:
            for ver in self.NetFxSdkVersion:
                regpaths += [os.path.join(self.ri.netfx_sdk, ver, fx)]

        for ver in self.WindowsSdkVersion:
            regpaths += [os.path.join(self.ri.windows_sdk, 'v%sA' % ver, fx)]

        # Return installation folder from the more recent path
        for path in regpaths:
            execpath = self.ri.lookup(path, 'installationfolder')
            if execpath:
                break
        return execpath

    @property
    def FSharpInstallDir(self):
        """
        Microsoft Visual F# directory.
        """
        path = r'%0.1f\Setup\F#' % self.vc_ver
        path = os.path.join(self.ri.visualstudio, path)
        return self.ri.lookup(path, 'productdir') or ''

    @property
    def UniversalCRTSdkDir(self):
        """
        Microsoft Universal CRT SDK directory.
        """
        # Set Kit Roots versions for specified MSVC++ version
        if self.vc_ver >= 14.0:
            vers = ('10', '81')
        else:
            vers = ()

        # Find path of the more recent Kit
        for ver in vers:
            sdkdir = self.ri.lookup(self.ri.windows_kits_roots,
                                    'kitsroot%s' % ver)
            if sdkdir:
                break
        return sdkdir or ''

    @property
    def UniversalCRTSdkLastVersion(self):
        """
        Microsoft Universal C Runtime SDK last version
        """
        return self._use_last_dir_name(os.path.join(
            self.UniversalCRTSdkDir, 'lib'))

    @property
    def NetFxSdkVersion(self):
        """
        Microsoft .NET Framework SDK versions.
        """
        # Set FxSdk versions for specified MSVC++ version
        if self.vc_ver >= 14.0:
            return ('4.6.1', '4.6')
        else:
            return ()

    @property
    def NetFxSdkDir(self):
        """
        Microsoft .NET Framework SDK directory.
        """
        for ver in self.NetFxSdkVersion:
            loc = os.path.join(self.ri.netfx_sdk, ver)
            sdkdir = self.ri.lookup(loc, 'kitsinstallationfolder')
            if sdkdir:
                break
        return sdkdir or ''

    @property
    def FrameworkDir32(self):
        """
        Microsoft .NET Framework 32bit directory.
        """
        # Default path
        guess_fw = os.path.join(self.WinDir, r'Microsoft.NET\Framework')

        # Try to get path from registry, if fail use default path
        return self.ri.lookup(self.ri.vc, 'frameworkdir32') or guess_fw

    @property
    def FrameworkDir64(self):
        """
        Microsoft .NET Framework 64bit directory.
        """
        # Default path
        guess_fw = os.path.join(self.WinDir, r'Microsoft.NET\Framework64')

        # Try to get path from registry, if fail use default path
        return self.ri.lookup(self.ri.vc, 'frameworkdir64') or guess_fw

    @property
    def FrameworkVersion32(self):
        """
        Microsoft .NET Framework 32bit versions.
        """
        return self._find_dot_net_versions(32)

    @property
    def FrameworkVersion64(self):
        """
        Microsoft .NET Framework 64bit versions.
        """
        return self._find_dot_net_versions(64)

    def _find_dot_net_versions(self, bits):
        """
        Find Microsoft .NET Framework versions.

        Parameters
        ----------
        bits: int
            Platform number of bits: 32 or 64.
        """
        # Find actual .NET version in registry
        reg_ver = self.ri.lookup(self.ri.vc, 'frameworkver%d' % bits)
        dot_net_dir = getattr(self, 'FrameworkDir%d' % bits)
        ver = reg_ver or self._use_last_dir_name(dot_net_dir, 'v') or ''

        # Set .NET versions for specified MSVC++ version
        if self.vc_ver >= 12.0:
            frameworkver = (ver, 'v4.0')
        elif self.vc_ver >= 10.0:
            frameworkver = ('v4.0.30319' if ver.lower()[:2] != 'v4' else ver,
                            'v3.5')
        elif self.vc_ver == 9.0:
            frameworkver = ('v3.5', 'v2.0.50727')
        if self.vc_ver == 8.0:
            frameworkver = ('v3.0', 'v2.0.50727')
        return frameworkver

    def _use_last_dir_name(self, path, prefix=''):
        """
        Return name of the last dir in path or '' if no dir found.

        Parameters
        ----------
        path: str
            Use dirs in this path
        prefix: str
            Use only dirs startings by this prefix
        """
        matching_dirs = (
            dir_name
            for dir_name in reversed(os.listdir(path))
            if os.path.isdir(os.path.join(path, dir_name)) and
            dir_name.startswith(prefix)
        )
        return next(matching_dirs, None) or ''


class EnvironmentInfo:
    """
    Return environment variables for specified Microsoft Visual C++ version
    and platform : Lib, Include, Path and libpath.

    This function is compatible with Microsoft Visual C++ 9.0 to 14.0.

    Script created by analysing Microsoft environment configuration files like
    "vcvars[...].bat", "SetEnv.Cmd", "vcbuildtools.bat", ...

    Parameters
    ----------
    arch: str
        Target architecture.
    vc_ver: float
        Required Microsoft Visual C++ version. If not set, autodetect the last
        version.
    vc_min_ver: float
        Minimum Microsoft Visual C++ version.
    """

    # Variables and properties in this class use originals CamelCase variables
    # names from Microsoft source files for more easy comparaison.

    def __init__(self, arch, vc_ver=None, vc_min_ver=0):
        self.pi = PlatformInfo(arch)
        self.ri = RegistryInfo(self.pi)
        self.si = SystemInfo(self.ri, vc_ver)

        if self.vc_ver < vc_min_ver:
            err = 'No suitable Microsoft Visual C++ version found'
            raise distutils.errors.DistutilsPlatformError(err)

    @property
    def vc_ver(self):
        """
        Microsoft Visual C++ version.
        """
        return self.si.vc_ver

    @property
    def VSTools(self):
        """
        Microsoft Visual Studio Tools
        """
        paths = [r'Common7\IDE', r'Common7\Tools']

        if self.vc_ver >= 14.0:
            arch_subdir = self.pi.current_dir(hidex86=True, x64=True)
            paths += [r'Common7\IDE\CommonExtensions\Microsoft\TestWindow']
            paths += [r'Team Tools\Performance Tools']
            paths += [r'Team Tools\Performance Tools%s' % arch_subdir]

        return [os.path.join(self.si.VSInstallDir, path) for path in paths]

    @property
    def VCIncludes(self):
        """
        Microsoft Visual C++ & Microsoft Foundation Class Includes
        """
        return [os.path.join(self.si.VCInstallDir, 'Include'),
                os.path.join(self.si.VCInstallDir, r'ATLMFC\Include')]

    @property
    def VCLibraries(self):
        """
        Microsoft Visual C++ & Microsoft Foundation Class Libraries
        """
        if self.vc_ver >= 15.0:
            arch_subdir = self.pi.target_dir(x64=True)
        else:
            arch_subdir = self.pi.target_dir(hidex86=True)
        paths = ['Lib%s' % arch_subdir, r'ATLMFC\Lib%s' % arch_subdir]

        if self.vc_ver >= 14.0:
            paths += [r'Lib\store%s' % arch_subdir]

        return [os.path.join(self.si.VCInstallDir, path) for path in paths]

    @property
    def VCStoreRefs(self):
        """
        Microsoft Visual C++ store references Libraries
        """
        if self.vc_ver < 14.0:
            return []
        return [os.path.join(self.si.VCInstallDir, r'Lib\store\references')]

    @property
    def VCTools(self):
        """
        Microsoft Visual C++ Tools
        """
        si = self.si
        tools = [os.path.join(si.VCInstallDir, 'VCPackages')]

        forcex86 = True if self.vc_ver <= 10.0 else False
        arch_subdir = self.pi.cross_dir(forcex86)
        if arch_subdir:
            tools += [os.path.join(si.VCInstallDir, 'Bin%s' % arch_subdir)]

        if self.vc_ver == 14.0:
            path = 'Bin%s' % self.pi.current_dir(hidex86=True)
            tools += [os.path.join(si.VCInstallDir, path)]

        elif self.vc_ver >= 15.0:
            host_dir = (r'bin\HostX86%s' if self.pi.current_is_x86() else
                        r'bin\HostX64%s')
            tools += [os.path.join(
                si.VCInstallDir, host_dir % self.pi.target_dir(x64=True))]

            if self.pi.current_cpu != self.pi.target_cpu:
                tools += [os.path.join(
                    si.VCInstallDir, host_dir % self.pi.current_dir(x64=True))]

        else:
            tools += [os.path.join(si.VCInstallDir, 'Bin')]

        return tools

    @property
    def OSLibraries(self):
        """
        Microsoft Windows SDK Libraries
        """
        if self.vc_ver <= 10.0:
            arch_subdir = self.pi.target_dir(hidex86=True, x64=True)
            return [os.path.join(self.si.WindowsSdkDir, 'Lib%s' % arch_subdir)]

        else:
            arch_subdir = self.pi.target_dir(x64=True)
            lib = os.path.join(self.si.WindowsSdkDir, 'lib')
            libver = self._sdk_subdir
            return [os.path.join(lib, '%sum%s' % (libver , arch_subdir))]

    @property
    def OSIncludes(self):
        """
        Microsoft Windows SDK Include
        """
        include = os.path.join(self.si.WindowsSdkDir, 'include')

        if self.vc_ver <= 10.0:
            return [include, os.path.join(include, 'gl')]

        else:
            if self.vc_ver >= 14.0:
                sdkver = self._sdk_subdir
            else:
                sdkver = ''
            return [os.path.join(include, '%sshared' % sdkver),
                    os.path.join(include, '%sum' % sdkver),
                    os.path.join(include, '%swinrt' % sdkver)]

    @property
    def OSLibpath(self):
        """
        Microsoft Windows SDK Libraries Paths
        """
        ref = os.path.join(self.si.WindowsSdkDir, 'References')
        libpath = []

        if self.vc_ver <= 9.0:
            libpath += self.OSLibraries

        if self.vc_ver >= 11.0:
            libpath += [os.path.join(ref, r'CommonConfiguration\Neutral')]

        if self.vc_ver >= 14.0:
            libpath += [
                ref,
                os.path.join(self.si.WindowsSdkDir, 'UnionMetadata'),
                os.path.join(
                    ref,
                    'Windows.Foundation.UniversalApiContract',
                    '1.0.0.0',
                ),
                os.path.join(
                    ref,
                    'Windows.Foundation.FoundationContract',
                    '1.0.0.0',
                ),
                os.path.join(
                    ref,
                    'Windows.Networking.Connectivity.WwanContract',
                    '1.0.0.0',
                ),
                os.path.join(
                    self.si.WindowsSdkDir,
                    'ExtensionSDKs',
                    'Microsoft.VCLibs',
                    '%0.1f' % self.vc_ver,
                    'References',
                    'CommonConfiguration',
                    'neutral',
                ),
            ]
        return libpath

    @property
    def SdkTools(self):
        """
        Microsoft Windows SDK Tools
        """
        return list(self._sdk_tools())

    def _sdk_tools(self):
        """
        Microsoft Windows SDK Tools paths generator
        """
        if self.vc_ver < 15.0:
            bin_dir = 'Bin' if self.vc_ver <= 11.0 else r'Bin\x86'
            yield os.path.join(self.si.WindowsSdkDir, bin_dir)

        if not self.pi.current_is_x86():
            arch_subdir = self.pi.current_dir(x64=True)
            path = 'Bin%s' % arch_subdir
            yield os.path.join(self.si.WindowsSdkDir, path)

        if self.vc_ver == 10.0 or self.vc_ver == 11.0:
            if self.pi.target_is_x86():
                arch_subdir = ''
            else:
                arch_subdir = self.pi.current_dir(hidex86=True, x64=True)
            path = r'Bin\NETFX 4.0 Tools%s' % arch_subdir
            yield os.path.join(self.si.WindowsSdkDir, path)

        elif self.vc_ver >= 15.0:
            path = os.path.join(self.si.WindowsSdkDir, 'Bin')
            arch_subdir = self.pi.current_dir(x64=True)
            sdkver = self.si.WindowsSdkLastVersion
            yield os.path.join(path, '%s%s' % (sdkver, arch_subdir))

        if self.si.WindowsSDKExecutablePath:
            yield self.si.WindowsSDKExecutablePath

    @property
    def _sdk_subdir(self):
        """
        Microsoft Windows SDK version subdir
        """
        ucrtver = self.si.WindowsSdkLastVersion
        return ('%s\\' % ucrtver) if ucrtver else ''

    @property
    def SdkSetup(self):
        """
        Microsoft Windows SDK Setup
        """
        if self.vc_ver > 9.0:
            return []

        return [os.path.join(self.si.WindowsSdkDir, 'Setup')]

    @property
    def FxTools(self):
        """
        Microsoft .NET Framework Tools
        """
        pi = self.pi
        si = self.si

        if self.vc_ver <= 10.0:
            include32 = True
            include64 = not pi.target_is_x86() and not pi.current_is_x86()
        else:
            include32 = pi.target_is_x86() or pi.current_is_x86()
            include64 = pi.current_cpu == 'amd64' or pi.target_cpu == 'amd64'

        tools = []
        if include32:
            tools += [os.path.join(si.FrameworkDir32, ver)
                      for ver in si.FrameworkVersion32]
        if include64:
            tools += [os.path.join(si.FrameworkDir64, ver)
                      for ver in si.FrameworkVersion64]
        return tools

    @property
    def NetFxSDKLibraries(self):
        """
        Microsoft .Net Framework SDK Libraries
        """
        if self.vc_ver < 14.0 or not self.si.NetFxSdkDir:
            return []

        arch_subdir = self.pi.target_dir(x64=True)
        return [os.path.join(self.si.NetFxSdkDir, r'lib\um%s' % arch_subdir)]

    @property
    def NetFxSDKIncludes(self):
        """
        Microsoft .Net Framework SDK Includes
        """
        if self.vc_ver < 14.0 or not self.si.NetFxSdkDir:
            return []

        return [os.path.join(self.si.NetFxSdkDir, r'include\um')]

    @property
    def VsTDb(self):
        """
        Microsoft Visual Studio Team System Database
        """
        return [os.path.join(self.si.VSInstallDir, r'VSTSDB\Deploy')]

    @property
    def MSBuild(self):
        """
        Microsoft Build Engine
        """
        if self.vc_ver < 12.0:
            return []
        elif self.vc_ver < 15.0:
            base_path = self.si.ProgramFilesx86
            arch_subdir = self.pi.current_dir(hidex86=True)
        else:
            base_path = self.si.VSInstallDir
            arch_subdir = ''

        path = r'MSBuild\%0.1f\bin%s' % (self.vc_ver, arch_subdir)
        build = [os.path.join(base_path, path)]

        if self.vc_ver >= 15.0:
            # Add Roslyn C# & Visual Basic Compiler
            build += [os.path.join(base_path, path, 'Roslyn')]

        return build

    @property
    def HTMLHelpWorkshop(self):
        """
        Microsoft HTML Help Workshop
        """
        if self.vc_ver < 11.0:
            return []

        return [os.path.join(self.si.ProgramFilesx86, 'HTML Help Workshop')]

    @property
    def UCRTLibraries(self):
        """
        Microsoft Universal C Runtime SDK Libraries
        """
        if self.vc_ver < 14.0:
            return []

        arch_subdir = self.pi.target_dir(x64=True)
        lib = os.path.join(self.si.UniversalCRTSdkDir, 'lib')
        ucrtver = self._ucrt_subdir
        return [os.path.join(lib, '%sucrt%s' % (ucrtver, arch_subdir))]

    @property
    def UCRTIncludes(self):
        """
        Microsoft Universal C Runtime SDK Include
        """
        if self.vc_ver < 14.0:
            return []

        include = os.path.join(self.si.UniversalCRTSdkDir, 'include')
        return [os.path.join(include, '%sucrt' % self._ucrt_subdir)]

    @property
    def _ucrt_subdir(self):
        """
        Microsoft Universal C Runtime SDK version subdir
        """
        ucrtver = self.si.UniversalCRTSdkLastVersion
        return ('%s\\' % ucrtver) if ucrtver else ''

    @property
    def FSharp(self):
        """
        Microsoft Visual F#
        """
        if self.vc_ver < 11.0 and self.vc_ver > 12.0:
            return []

        return self.si.FSharpInstallDir

    @property
    def VCRuntimeRedist(self):
        """
        Microsoft Visual C++ runtime redistribuable dll
        """
        arch_subdir = self.pi.target_dir(x64=True)
        if self.vc_ver < 15:
            redist_path = self.si.VCInstallDir
            vcruntime = 'redist%s\\Microsoft.VC%d0.CRT\\vcruntime%d0.dll'
        else:
            redist_path = self.si.VCInstallDir.replace('\\Tools', '\\Redist')
            vcruntime = 'onecore%s\\Microsoft.VC%d0.CRT\\vcruntime%d0.dll'

        # Visual Studio 2017  is still Visual C++ 14.0
        dll_ver = 14.0 if self.vc_ver == 15 else self.vc_ver

        vcruntime = vcruntime % (arch_subdir, self.vc_ver, dll_ver)
        return os.path.join(redist_path, vcruntime)

    def return_env(self, exists=True):
        """
        Return environment dict.

        Parameters
        ----------
        exists: bool
            It True, only return existing paths.
        """
        env = dict(
            include=self._build_paths('include',
                                      [self.VCIncludes,
                                       self.OSIncludes,
                                       self.UCRTIncludes,
                                       self.NetFxSDKIncludes],
                                      exists),
            lib=self._build_paths('lib',
                                  [self.VCLibraries,
                                   self.OSLibraries,
                                   self.FxTools,
                                   self.UCRTLibraries,
                                   self.NetFxSDKLibraries],
                                  exists),
            libpath=self._build_paths('libpath',
                                      [self.VCLibraries,
                                       self.FxTools,
                                       self.VCStoreRefs,
                                       self.OSLibpath],
                                      exists),
            path=self._build_paths('path',
                                   [self.VCTools,
                                    self.VSTools,
                                    self.VsTDb,
                                    self.SdkTools,
                                    self.SdkSetup,
                                    self.FxTools,
                                    self.MSBuild,
                                    self.HTMLHelpWorkshop,
                                    self.FSharp],
                                   exists),
        )
        if self.vc_ver >= 14 and os.path.isfile(self.VCRuntimeRedist):
            env['py_vcruntime_redist'] = self.VCRuntimeRedist
        return env

    def _build_paths(self, name, spec_path_lists, exists):
        """
        Given an environment variable name and specified paths,
        return a pathsep-separated string of paths containing
        unique, extant, directories from those paths and from
        the environment variable. Raise an error if no paths
        are resolved.
        """
        # flatten spec_path_lists
        spec_paths = itertools.chain.from_iterable(spec_path_lists)
        env_paths = safe_env.get(name, '').split(os.pathsep)
        paths = itertools.chain(spec_paths, env_paths)
        extant_paths = list(filter(os.path.isdir, paths)) if exists else paths
        if not extant_paths:
            msg = "%s environment variable is empty" % name.upper()
            raise distutils.errors.DistutilsPlatformError(msg)
        unique_paths = self._unique_everseen(extant_paths)
        return os.pathsep.join(unique_paths)

    # from Python docs
    def _unique_everseen(self, iterable, key=None):
        """
        List unique elements, preserving order.
        Remember all elements ever seen.

        _unique_everseen('AAAABBBCCDAABBB') --> A B C D

        _unique_everseen('ABBCcAD', str.lower) --> A B C D
        """
        seen = set()
        seen_add = seen.add
        if key is None:
            for element in filterfalse(seen.__contains__, iterable):
                seen_add(element)
                yield element
        else:
            for element in iterable:
                k = key(element)
                if k not in seen:
                    seen_add(k)
                    yield element
build_meta.pyc000064400000014757151733473730007421 0ustar00�
�fc@s�dZddlZddlZddlZddlZddlZddlZddlZdefd��YZ	dej
jfd��YZdd�Zd	�Z
d
�Zd�Zdd�Zdd
�Zdd�Zddd�Zdd�ZdS(s-A PEP 517 interface to setuptools

Previously, when a user or a command line tool (let's call it a "frontend")
needed to make a request of setuptools to take a certain action, for
example, generating a list of installation requirements, the frontend would
would call "setup.py egg_info" or "setup.py bdist_wheel" on the command line.

PEP 517 defines a different method of interfacing with setuptools. Rather
than calling "setup.py" directly, the frontend should:

  1. Set the current directory to the directory with a setup.py file
  2. Import this module into a safe python interpreter (one in which
     setuptools can potentially set global variables or crash hard).
  3. Call one of the functions defined in PEP 517.

What each function does is defined in PEP 517. However, here is a "casual"
definition of the functions (this definition should not be relied on for
bug reports or API stability):

  - `build_wheel`: build a wheel in the folder and return the basename
  - `get_requires_for_build_wheel`: get the `setup_requires` to build
  - `prepare_metadata_for_build_wheel`: get the `install_requires`
  - `build_sdist`: build an sdist in the folder and return the basename
  - `get_requires_for_build_sdist`: get the `setup_requires` to build

Again, this is not a formal definition! Just a "taste" of the module.
i����NtSetupRequirementsErrorcBseZd�ZRS(cCs
||_dS(N(t
specifiers(tselfR((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyt__init__(s(t__name__t
__module__R(((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyR'stDistributioncBs)eZd�Zeejd���ZRS(cCst|��dS(N(R(RR((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pytfetch_build_eggs-sccs5tjj}|tj_z	dVWd|tj_XdS(sw
        Replace
        distutils.dist.Distribution with this class
        for the duration of this context.
        N(t	distutilstcoreR(tclstorig((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pytpatch0s
	(RRRtclassmethodt
contextlibtcontextmanagerR(((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyR,s	ssetup.pycBsa|}d}eede�|�}|j�jdd�}|j�e||d�e�UdS(Nt__main__topens\r\ns\ntexec(tgetattrttokenizeRtreadtreplacetclosetcompiletlocals(tsetup_scriptt__file__Rtftcode((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyt
_run_setup@s
cCs |p	i}|jdg�|S(Ns--global-option(t
setdefault(tconfig_settings((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyt_fix_configKscCs|t|�}ddg}tjd dg|dt_ytj��t�WdQXWn tk
rw}||j7}nX|S(Nt
setuptoolstwheelitegg_infos--global-option(R!tsystargvRRRRR(R trequirementste((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyt_get_build_requiresQs
cCsAgtj|�D]-}tjjtjj||��r|^qS(N(tostlistdirtpathtisdirtjoin(ta_dirtname((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyt_get_immediate_subdirectories`scCst|�}t|�S(N(R!R)(R ((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pytget_requires_for_build_wheelescCst|�}t|�S(N(R!R)(R ((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pytget_requires_for_build_sdistjscCs tjd dd|gt_t�|}x�tr�gtj|�D]}|jd�rC|^qC}t|�dkr�tt|��dkr�tj	j
|tj|�d�}q-nt|�dks�t�Pq-W||krtj
tj	j
||d�|�tj|dt�n|dS(Nit	dist_infos
--egg-bases
.dist-infoit
ignore_errors(R%R&RtTrueR*R+tendswithtlenR1R,R.tAssertionErrortshutiltmovetrmtree(tmetadata_directoryR tdist_info_directoryRt
dist_infos((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyt prepare_metadata_for_build_wheelos&		cCs�t|�}tjj|�}tjd dg|dt_t�|dkrptj|�tj	d|�ngtj
|�D]}|jd�r�|^q�}t|�dks�t
�|dS(Nitbdist_wheels--global-optiontdists.whli(R!R*R,tabspathR%R&RR:R<tcopytreeR+R7R8R9(twheel_directoryR R=Rtwheels((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pytbuild_wheel�s
cCs�t|�}tjj|�}tjd dg|dt_t�|dkrptj|�tj	d|�ngtj
|�D]}|jd�r�|^q�}t|�dks�t
�|dS(Nitsdists--global-optionRBs.tar.gzi(R!R*R,RCR%R&RR:R<RDR+R7R8R9(tsdist_directoryR Rtsdists((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pytbuild_sdist�s
(t__doc__R*R%RR:RR"Rt
BaseExceptionRRBRRR!R)R1tNoneR2R3R@RGRK(((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyt<module>s&			sandbox.pyc000064400000044724151733473730006747 0ustar00�
�fc@s�ddlZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZddlm
Z
mZddlZejjd�r�ddljjjjZnejejZy
eZWnek
r
dZnXeZddl m!Z!ddlm"Z"ddd	d
gZ#dd�Z$ej%dd��Z&ej%d
��Z'ej%d��Z(ej%d��Z)de*fd��YZ+dd!d��YZ,ej%d��Z-d�Z.ej%d��Z/ej%d��Z0d�Z1d�Z2d�Z3dd"d��YZ4e5ed�rNej6gZ7ngZ7de4fd��YZ8ej9ej:gdj;�D]Z<e=ee<d�^q��Z>d	e!fd ��YZ?dS(#i����N(tsix(tbuiltinstmaptjava(tDistutilsError(tworking_settAbstractSandboxtDirectorySandboxtSandboxViolationt	run_setupcBs_d}e||��}|j�}WdQX|dkr?|}ne||d�}|||UdS(s.
    Python 3 implementation of execfile.
    trbNtexec(topentreadtNonetcompile(tfilenametglobalstlocalstmodetstreamtscripttcode((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt	_execfile#s	ccs>tj}|dk	r#|tj(nz	|VWd|tj(XdS(N(tsystargvR(trepltsaved((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt	save_argv0s

	ccs%tj}z	|VWd|tj(XdS(N(Rtpath(R((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt	save_path;s
	ccsBtjj|dt�tj}|t_z	dVWd|t_XdS(sL
    Monkey-patch tempfile.tempdir with replacement, ensuring it exists
    texist_okN(t
pkg_resourcest
py31compattmakedirstTruettempfilettempdir(treplacementR((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt
override_tempDs			ccs7tj�}tj|�z	|VWdtj|�XdS(N(tostgetcwdtchdir(ttargetR((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pytpushdUs

	tUnpickleableExceptioncBseZdZed��ZRS(sP
    An exception representing another Exception that could not be pickled.
    cCsay tj|�tj|�fSWn:tk
r\ddlm}|j||t|���SXdS(s�
        Always return a dumped (pickled) type and exc. If exc can't be pickled,
        wrap it in UnpickleableException first.
        i����(R-N(tpickletdumpst	Exceptiontsetuptools.sandboxR-tdumptrepr(ttypetexctcls((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR2ds
 
(t__name__t
__module__t__doc__tstaticmethodR2(((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR-_stExceptionSavercBs)eZdZd�Zd�Zd�ZRS(s^
    A Context Manager that will save an exception, serialized, and restore it
    later.
    cCs|S(N((tself((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt	__enter__xscCs,|s
dStj||�|_||_tS(N(R-R2t_savedt_tbR#(R<R4R5ttb((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt__exit__{s
	cCsKdt|�krdSttj|j�\}}tj|||j�dS(s"restore and re-raise any exceptionR>N(tvarsRR.tloadsR>RtreraiseR?(R<R4R5((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pytresume�s(R7R8R9R=RARE(((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR;rs		c#sgtjj��t��}�VWdQXtjj���fd�tjD�}t|�|j�dS(s�
    Context in which imported modules are saved.

    Translates exceptions internal to the context into the equivalent exception
    outside the context.
    Nc3s1|]'}|�kr|jd�r|VqdS(s
encodings.N(t
startswith(t.0tmod_name(R(s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pys	<genexpr>�s(RtmodulestcopyR;tupdatet_clear_modulesRE(t	saved_exctdel_modules((Rs6/usr/lib/python2.7/site-packages/setuptools/sandbox.pytsave_modules�s
cCs%xt|�D]}tj|=q
WdS(N(tlistRRI(tmodule_namesRH((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyRL�sccs*tj�}z	|VWdtj|�XdS(N(R t__getstate__t__setstate__(R((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pytsave_pkg_resources_state�s	ccs�tjj|d�}t��qt��at�t��Jt��:t|��'t	|��t
d�dVWdQXWdQXWdQXWdQXWdQXWdQXdS(Nttempt
setuptools(R(RtjoinRTROthide_setuptoolsRRR'R,t
__import__(t	setup_dirttemp_dir((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt
setup_context�s






cCs"tjd�}t|j|��S(sH
    >>> _needs_hiding('setuptools')
    True
    >>> _needs_hiding('pkg_resources')
    True
    >>> _needs_hiding('setuptools_plugin')
    False
    >>> _needs_hiding('setuptools.__init__')
    True
    >>> _needs_hiding('distutils')
    True
    >>> _needs_hiding('os')
    False
    >>> _needs_hiding('Cython')
    True
    s1(setuptools|pkg_resources|distutils|Cython)(\.|$)(treRtbooltmatch(RHtpattern((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt
_needs_hiding�scCs tttj�}t|�dS(s%
    Remove references to setuptools' modules from sys.modules to allow the
    invocation to import the most appropriate setuptools. This technique is
    necessary to avoid issues such as #315 where setuptools upgrading itself
    would fail to find a function declared in the metadata.
    N(tfilterRaRRIRL(RI((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyRX�sc
Cstjjtjj|��}t|���y�|gt|�tj(tjjd|�t	j
�t	jjd��t
|t�r�|n|jtj��}t|��'td|dd�}t||�WdQXWn/tk
r}|jr|jdr�qnXWdQXdS(s8Run a distutils setup script, sandboxed in its directoryicSs
|j�S(N(tactivate(tdist((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt<lambda>�tt__file__R7t__main__N(R(RtabspathtdirnameR\RPRRtinsertRt__init__t	callbackstappendt
isinstancetstrtencodetgetfilesystemencodingRtdictRt
SystemExittargs(tsetup_scriptRuRZtdunder_filetnstv((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR	�s


cBs�eZdZeZd�Zd�Zd�Zd�Zd�Z	d�Z
x<ddd	gD]+Zee
e�rXe
e�e�e<qXqXWd)d
�Zer�ede�Znede�Zxld
ddddddddddddddddddgD]+Zee
e�r�ee�e�e<q�q�Wd�Zx9d d!gD]+Zee
e�r?ee�e�e<q?q?Wd"�Zx9d#d$gD]+Zee
e�r�ee�e�e<q�q�Wd%�Zd&�Zd'�Zd(�ZRS(*sDWrap 'os' module and 'open()' builtin for virtualizing setup scriptscCsEgtt�D]+}|jd�r
t||�r
|^q
|_dS(Nt_(tdirt_osRFthasattrt_attrs(R<tname((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyRlscCs1x*|jD]}tt|t||��q
WdS(N(R~tsetattrR(tgetattr(R<tsourceR((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt_copyscCs;|j|�tr"|jt_n|jt_t|_dS(N(R�t_fileRtfilet_openRR#t_active(R<((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR=s

cCs5t|_trtt_ntt_|jt�dS(N(	tFalseR�R�RR�R�RR�R|(R<texc_typet	exc_valuet	traceback((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyRAs
		cCs|�|�SWdQXdS(sRun 'func' under os sandboxingN((R<tfunc((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pytrunscs%tt�����fd�}|S(Ncs@|jr-|j�||||�\}}n�||||�S(N(R�t_remap_pair(R<tsrctdstRutkw(Rtoriginal(s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pytwrap&s	$(R�R|(RR�((RR�s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt_mk_dual_path_wrapper#strenametlinktsymlinkcs+�ptt�����fd�}|S(Ncs4|jr$|j�|||�}n�|||�S(N(R�t_remap_input(R<RRuR�(RR�(s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR�4s	(R�R|(RR�R�((RR�s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt_mk_single_path_wrapper1sR�RtstattlistdirR*tchmodtchowntmkdirtremovetunlinktrmdirtutimetlchowntchroottlstatt	startfiletmkfifotmknodtpathconftaccesscs%tt�����fd�}|S(NcsM|jr=|j�|||�}|j��|||��S�|||�S(N(R�R�t
_remap_output(R<RRuR�(RR�(s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR�Is	(R�R|(RR�((RR�s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt_mk_single_with_returnFstreadlinkttempnamcs%tt�����fd�}|S(Ncs,�||�}|jr(|j�|�S|S(N(R�R�(R<RuR�tretval(RR�(s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR�Xs	(R�R|(RR�((RR�s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt	_mk_queryUsR)ttmpnamcCs|S(s=Called to remap or validate any path, whether input or output((R<R((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt_validate_pathdscOs
|j|�S(sCalled for path inputs(R�(R<t	operationRRuR�((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR�hscCs
|j|�S(sCalled for path outputs(R�(R<R�R((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR�lscOs6|j|d|||�|j|d|||�fS(s?Called for path pairs like rename, link, and symlink operationss-froms-to(R�(R<R�R�R�RuR�((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR�psN(R7R8R9R�R�RlR�R=RAR�R�RR}R|RRR�R�R�R�R�R�R�R�R�(((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyRsB						

					tdevnullcBs�eZdZejddddddddd	d
ddd
g
�ZdgZed�Zd�Z	e
rudd�Z
ndd�Zd�Zd�Z
d�Zd�Zd�Zdd�ZRS(s<Restrict operations to a single subdirectory - pseudo-chrootRR�R�R�R�R�R�R�R�R�R�R�R�s.*lib2to3.*\.pickle$cCs�tjjtjj|��|_tjj|jd�|_g|D]$}tjjtjj|��^qC|_tj	|�dS(NRf(
R(Rtnormcasetrealpatht_sandboxRWt_prefixt_exceptionsRRl(R<tsandboxt
exceptionsR((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyRl�s
!1cOs&ddlm}||||��dS(Ni����(R(R1R(R<R�RuR�R((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt
_violation�strcOsK|dkr8|j|�r8|jd||||�nt||||�S(NR�trtR
trUtUR�(R�R�R
R�R�(t_okR�R�(R<RRRuR�((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR��scOsK|dkr8|j|�r8|jd||||�nt||||�S(NR�R�R
R�R�R(R�R�R
R�R�(R�R�R�(R<RRRuR�((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR��scCs|jd�dS(NR�(R�(R<((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR��scCss|j}zYt|_tjjtjj|��}|j|�p`||jkp`|j|j	�SWd||_XdS(N(
R�R�R(RR�R�t	_exemptedR�RFR�(R<RtactiveR�((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR��s		csN�fd�|jD�}�fd�|jD�}tj||�}t|�S(Nc3s|]}�j|�VqdS(N(RF(RGt	exception(tfilepath(s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pys	<genexpr>�sc3s!|]}tj|��VqdS(N(R]R_(RGR`(R�(s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pys	<genexpr>�s(R�t_exception_patternst	itertoolstchaintany(R<R�t
start_matchestpattern_matchest
candidates((R�s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR��s

cOsH||jkrD|j|�rD|j|tjj|�||�n|S(sCalled for path inputs(t	write_opsR�R�R(RR�(R<R�RRuR�((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR��s%cOsF|j|�s |j|�r<|j|||||�n||fS(s?Called for path pairs like rename, link, and symlink operations(R�R�(R<R�R�R�RuR�((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR��s i�cOsR|t@r9|j|�r9|jd|||||�ntj|||||�S(sCalled for low-level os.open()sos.open(tWRITE_FLAGSR�R�R|R(R<R�tflagsRRuR�((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR�s(R7R8R9RstfromkeysR�R�t_EXCEPTIONSRlR�R�R�R�R�R�R�R�R(((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR~s 					
			s4O_WRONLY O_RDWR O_APPEND O_CREAT O_TRUNC O_TEMPORARYicBs,eZdZejd�j�Zd�ZRS(sEA setup script attempted to modify the filesystem outside the sandboxs
        SandboxViolation: {cmd}{args!r} {kwargs}

        The package setup script has attempted to modify files on your system
        that are not within the EasyInstall build area, and has been aborted.

        This package cannot be safely installed by EasyInstall, and may not
        support alternate installation locations even if you run its setup
        script by hand.  Please inform the package's author and the EasyInstall
        maintainers to find out if a fix or workaround is available.
        cCs%|j\}}}|jjt��S(N(RuttmpltformatR(R<tcmdRutkwargs((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt__str__�s(R7R8R9ttextwraptdedenttlstripR�R�(((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR�s
(((@R(RR$toperatort	functoolsR�R]t
contextlibR.R�tsetuptools.externRtsetuptools.extern.six.movesRRtpkg_resources.py31compatR tplatformRFt$org.python.modules.posix.PosixModuletpythonRItposixtPosixModuleR|RR�R�t	NameErrorRRR�tdistutils.errorsRRt__all__RtcontextmanagerRRR'R,R0R-R;RORLRTR\RaRXR	RR}R�R�Rtreducetor_tsplittaR�R�R(((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt<module>s^




	
					wV	+ssl_support.pyc000064400000020504151733473730007674 0ustar00�
�fc@s/ddlZddlZddlZddlZddlZddlmZmZmZm	Z	ddl
mZmZyddl
Z
Wnek
r�dZ
nXdddddgZd	j�j�ZyejjZejZWnek
r�eZZnXe
dk	oeeefkZydd
l
mZmZWnUek
r�y$ddlmZddlmZWq�ek
r�dZdZq�XnXes�d
efd��YZnes�dd�Zd�Zndefd��YZdefd��YZ dd�Z!d�Z"e"d��Z#d�Z$d�Z%dS(i����N(turllibthttp_clienttmaptfilter(tResolutionErrortExtractionErrortVerifyingHTTPSHandlertfind_ca_bundletis_availablet
cert_pathst
opener_fors
/etc/pki/tls/certs/ca-bundle.crt
/etc/ssl/certs/ca-certificates.crt
/usr/share/ssl/certs/ca-bundle.crt
/usr/local/share/certs/ca-root.crt
/etc/ssl/cert.pem
/System/Library/OpenSSL/certs/cert.pem
/usr/local/share/certs/ca-root-nss.crt
/etc/ssl/ca-bundle.pem
(tCertificateErrortmatch_hostname(R(RRcBseZRS((t__name__t
__module__(((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyR5sic
CsRg}|stS|jd�}|d}|d}|jd�}||krgtdt|���n|s�|j�|j�kS|dkr�|jd�nY|jd�s�|jd�r�|jtj	|��n"|jtj	|�j
dd	��x$|D]}|jtj	|��q�Wtjd
dj|�dtj
�}	|	j|�S(
spMatching according to RFC 6125, section 6.4.3

        http://tools.ietf.org/html/rfc6125#section-6.4.3
        t.iit*s,too many wildcards in certificate DNS name: s[^.]+sxn--s\*s[^.]*s\As\.s\Z(tFalsetsplittcountRtreprtlowertappendt
startswithtretescapetreplacetcompiletjoint
IGNORECASEtmatch(
tdnthostnamet
max_wildcardstpatstpartstleftmostt	remaindert	wildcardstfragtpat((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyt_dnsname_match;s*

"
&cCs[|std��ng}|jdd
�}xC|D];\}}|dkr4t||�r_dS|j|�q4q4W|s�xc|jdd�D]L}xC|D];\}}|dkr�t||�r�dS|j|�q�q�Wq�Wnt|�dkrtd|d	jtt|��f��n;t|�dkrKtd
||df��ntd��dS(s=Verify that *cert* (in decoded format as returned by
        SSLSocket.getpeercert()) matches the *hostname*.  RFC 2818 and RFC 6125
        rules are followed, but IP addresses are not accepted for *hostname*.

        CertificateError is raised on failure. On success, the function
        returns nothing.
        sempty or no certificatetsubjectAltNametDNSNtsubjectt
commonNameis&hostname %r doesn't match either of %ss, shostname %r doesn't match %ris=no appropriate commonName or subjectAltName fields were found(((	t
ValueErrortgetR)RtlenRRRR(tcertR tdnsnamestsantkeytvaluetsub((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyRos.%cBs eZdZd�Zd�ZRS(s=Simple verifying handler: no auth, subclasses, timeouts, etc.cCs||_tj|�dS(N(t	ca_bundletHTTPSHandlert__init__(tselfR7((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyR9�s	cs�j�fd�|�S(Ncst|�j|�S(N(tVerifyingHTTPSConnR7(thosttkw(R:(s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyt<lambda>�t(tdo_open(R:treq((R:s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyt
https_open�s(R
Rt__doc__R9RB(((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyR�s	R;cBs eZdZd�Zd�ZRS(s@Simple verifying connection: no auth, subclasses, timeouts, etc.cKs tj|||�||_dS(N(tHTTPSConnectionR9R7(R:R<R7R=((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyR9�scCs+tj|j|jft|dd��}t|d�rjt|dd�rj||_|j�|j	}n	|j}tt
d�r�t
jd|j�}|j
|d|�|_n$t
j
|dt
jd|j�|_yt|jj�|�Wn4tk
r&|jjtj�|jj��nXdS(	Ntsource_addresst_tunnelt_tunnel_hosttcreate_default_contexttcafiletserver_hostnamet	cert_reqstca_certs(tsockettcreate_connectionR<tporttgetattrtNonethasattrtsockRFRGtsslRHR7twrap_sockett
CERT_REQUIREDRtgetpeercertRtshutdownt	SHUT_RDWRtclose(R:RStactual_hosttctx((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pytconnect�s$$!	
	

(R
RRCR9R](((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyR;�s	cCs"tjjt|pt���jS(s@Get a urlopen() replacement that uses ca_bundle for verification(Rtrequesttbuild_openerRRtopen(R7((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyR
�s	cs"tj���fd��}|S(Ncs+t�d�s$�||��_n�jS(Ntalways_returns(RRRa(targstkwargs(tfunc(s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pytwrapper�s(t	functoolstwraps(RdRe((Rds:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pytonce�scsnyddl}Wntk
r$dSXd|jf�fd��Y���}|jd�|jd�|jS(Ni����tCertFilecs&eZ�fd�Z�fd�ZRS(cs't�|�j�tj|j�dS(N(tsuperR9tatexittregisterRZ(R:(Ri(s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyR9�scs/yt�|�j�Wntk
r*nXdS(N(RjRZtOSError(R:(Ri(s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyRZ�s
(R
RR9RZ((Ri(s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyRi�stCAtROOT(twincertstoretImportErrorRQRitaddstoretname(Rpt	_wincerts((Ris:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pytget_win_certfile�s
	

cCs4ttjjt�}t�p3t|d�p3t�S(s*Return an existing CA bundle path, or NoneN(	RtostpathtisfileR	RutnextRQt_certifi_where(textant_cert_paths((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyR�s	cCs5ytd�j�SWntttfk
r0nXdS(Ntcertifi(t
__import__twhereRqRR(((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyRzs(&RvRMRkRRftsetuptools.extern.six.movesRRRRt
pkg_resourcesRRRTRqRQt__all__tstripRR	R^R8RDtAttributeErrortobjectRRRtbackports.ssl_match_hostnameR.R)RR;R
RhRuRRz(((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyt<module>sP"

	



4)
(			
site-patch.pyc000064400000003313151733473730007337 0ustar00�
�fc@s&d�Zedkr"e�[ndS(cCs�ddl}ddl}|jjd�}|dksL|jdkrU|rUg}n|j|j�}t|di�}|j	t
|�}|j	jt�}x�|D]�}||ks�|r�q�n|j|�}|dk	r|j
d�}|dk	r�|jd�Pq�q�y.ddl}	|	j
d|g�\}
}}Wntk
rRq�nX|
dkreq�nz|	jd|
||�Wd|
j�XPq�Wtd��tg|j	D]}t|�ddf^q��}
t|dd	�}d	|_x|D]}t|�q�W|j|7_t|d	�\}}d}g}x�|j	D]�}t|�\}}||kr�|dkr�t
|�}n||
ks�|dkr�|j|�qA|j||�|d7}qAW||j	(dS(
Ni����t
PYTHONPATHtwin32tpath_importer_cachetsites$Couldn't find the real 'site' moduleit__egginserti(tsystostenvirontgettNonetplatformtsplittpathseptgetattrtpathtlentdirnamet__file__tfind_moduletload_moduletimptImportErrortclosetdicttmakepathRt
addsitedirtappendtinsert(RRRtpictstdpathtmydirtitemtimportertloaderRtstreamRtdescrtknown_pathstoldpostdtndt	insert_attnew_pathtptnp((s9/usr/lib/python2.7/site-packages/setuptools/site-patch.pyt__boots`"	

"
2	
RN(R,t__name__(((s9/usr/lib/python2.7/site-packages/setuptools/site-patch.pyt<module>s	Gmonkey.pyo000064400000014307151733473740006622 0ustar00�
�fc@s�dZddlZddlZddlZddlZddlZddlmZddl	Z	ddl
mZddlZgZ
d�Zd�Zd�Zd�Zd	�Zd
�Zd�Zd�Zd
�ZdS(s
Monkey patching of distutils.
i����N(t
import_module(tsixcCs-tj�dkr |f|jStj|�S(sm
    Returns the bases classes for cls sorted by the MRO.

    Works around an issue on Jython where inspect.getmro will not return all
    base classes if multiple classes share the same name. Instead, this
    function will return a tuple containing the class itself, and the contents
    of cls.__bases__. See https://github.com/pypa/setuptools/issues/1024.
    tJython(tplatformtpython_implementationt	__bases__tinspecttgetmro(tcls((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyt_get_mros	cCsCt|tj�rtnt|tj�r0tnd�}||�S(NcSsdS(N(tNone(titem((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyt<lambda>*t(t
isinstanceRtclass_typestget_unpatched_classttypestFunctionTypetget_unpatched_function(Rtlookup((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyt
get_unpatched&s	cCsQd�t|�D�}t|�}|jjd�sMd|}t|��n|S(s�Protect against re-patching the distutils if reloaded

    Also ensures that no other distutils extension monkeypatched the distutils
    first.
    css'|]}|jjd�s|VqdS(t
setuptoolsN(t
__module__t
startswith(t.0R((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pys	<genexpr>6st	distutilss(distutils has already been patched by %r(R	tnextRRtAssertionError(Rtexternal_basestbasetmsg((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyR/s
cCsWtjtj_tjdk}|r6tjtj_ntjdkp�d
tjko_dknp�dtjko~dknp�dtjko�dkn}|r�d	}|tjj	_
nt�t�x/tj
tjtjfD]}tj
j|_q�Wtjjtj_tjjtj_d
tjkrLtjjtjd
_nt�dS(Niiiii
iiishttps://upload.pypi.org/legacy/sdistutils.command.build_ext(iii(iii
(ii(iii(ii(iii(ii(iii(RtCommandRtcoretsystversion_infotfindalltfilelisttconfigt
PyPIRCCommandtDEFAULT_REPOSITORYt+_patch_distribution_metadata_write_pkg_filet+_patch_distribution_metadata_write_pkg_infotdisttcmdtDistributiont	extensiont	Extensiontmodulest#patch_for_msvc_specialized_compiler(thas_issue_12885tneeds_warehouset	warehousetmodule((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyt	patch_allAs(cCstjjtjj_dS(sDPatch write_pkg_file to also write Requires-Python/Requires-ExternalN(RR+twrite_pkg_fileRtDistributionMetadata(((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyR)kscCsFdtjd kodkn}|s-dStjjtjj_dS(s�
    Workaround issue #197 - Python 3 prior to 3.2.2 uses an environment-local
    encoding to save the pkg_info. Monkey-patch its write_pkg_info method to
    correct this undesirable behavior.
    iiN(i(iii(R"R#RR+twrite_pkg_infoRR8(tenvironment_local((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyR*rs#cCs9t||�}t|�jd|�t|||�dS(s�
    Patch func_name in target_mod with replacement

    Important - original must be resolved by name to avoid
    patching an already patched function.
    t	unpatchedN(tgetattrtvarst
setdefaulttsetattr(treplacementt
target_modt	func_nametoriginal((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyt
patch_func�scCs
t|d�S(NR;(R<(t	candidate((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyR�scs�td��tj�dkr"dS�fd�}tj|d�}tj|d�}y$t|d��t|d��Wntk
r�nXyt|d	��Wntk
r�nXyt|d
��Wntk
r�nXdS(s\
    Patch functions in distutils to use standalone Microsoft Visual C++
    compilers.
    ssetuptools.msvctWindowsNcsqd|krdnd}||jd�}t�|�}t|�}t||�sdt|��n|||fS(sT
        Prepare the parameters for patch_func to patch indicated function.
        tmsvc9tmsvc9_tmsvc14_t_(tlstripR<RthasattrtImportError(tmod_nameRBtrepl_prefixt	repl_nametrepltmod(tmsvc(s5/usr/lib/python2.7/site-packages/setuptools/monkey.pytpatch_params�ssdistutils.msvc9compilersdistutils._msvccompilertfind_vcvarsalltquery_vcvarsallt_get_vc_envtgen_lib_options(RRtsystemt	functoolstpartialRDRM(RTRGtmsvc14((RSs5/usr/lib/python2.7/site-packages/setuptools/monkey.pyR1�s&



(t__doc__R"tdistutils.filelistRRRRZt	importlibRRtsetuptools.externRRt__all__R	RRR6R)R*RDRR1(((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyt<module>s&					*				monkey.py000064400000013235151733473740006442 0ustar00"""
Monkey patching of distutils.
"""

import sys
import distutils.filelist
import platform
import types
import functools
from importlib import import_module
import inspect

from setuptools.extern import six

import setuptools

__all__ = []
"""
Everything is private. Contact the project team
if you think you need this functionality.
"""


def _get_mro(cls):
    """
    Returns the bases classes for cls sorted by the MRO.

    Works around an issue on Jython where inspect.getmro will not return all
    base classes if multiple classes share the same name. Instead, this
    function will return a tuple containing the class itself, and the contents
    of cls.__bases__. See https://github.com/pypa/setuptools/issues/1024.
    """
    if platform.python_implementation() == "Jython":
        return (cls,) + cls.__bases__
    return inspect.getmro(cls)


def get_unpatched(item):
    lookup = (
        get_unpatched_class if isinstance(item, six.class_types) else
        get_unpatched_function if isinstance(item, types.FunctionType) else
        lambda item: None
    )
    return lookup(item)


def get_unpatched_class(cls):
    """Protect against re-patching the distutils if reloaded

    Also ensures that no other distutils extension monkeypatched the distutils
    first.
    """
    external_bases = (
        cls
        for cls in _get_mro(cls)
        if not cls.__module__.startswith('setuptools')
    )
    base = next(external_bases)
    if not base.__module__.startswith('distutils'):
        msg = "distutils has already been patched by %r" % cls
        raise AssertionError(msg)
    return base


def patch_all():
    # we can't patch distutils.cmd, alas
    distutils.core.Command = setuptools.Command

    has_issue_12885 = sys.version_info <= (3, 5, 3)

    if has_issue_12885:
        # fix findall bug in distutils (http://bugs.python.org/issue12885)
        distutils.filelist.findall = setuptools.findall

    needs_warehouse = (
        sys.version_info < (2, 7, 13)
        or
        (3, 0) < sys.version_info < (3, 3, 7)
        or
        (3, 4) < sys.version_info < (3, 4, 6)
        or
        (3, 5) < sys.version_info <= (3, 5, 3)
    )

    if needs_warehouse:
        warehouse = 'https://upload.pypi.org/legacy/'
        distutils.config.PyPIRCCommand.DEFAULT_REPOSITORY = warehouse

    _patch_distribution_metadata_write_pkg_file()
    _patch_distribution_metadata_write_pkg_info()

    # Install Distribution throughout the distutils
    for module in distutils.dist, distutils.core, distutils.cmd:
        module.Distribution = setuptools.dist.Distribution

    # Install the patched Extension
    distutils.core.Extension = setuptools.extension.Extension
    distutils.extension.Extension = setuptools.extension.Extension
    if 'distutils.command.build_ext' in sys.modules:
        sys.modules['distutils.command.build_ext'].Extension = (
            setuptools.extension.Extension
        )

    patch_for_msvc_specialized_compiler()


def _patch_distribution_metadata_write_pkg_file():
    """Patch write_pkg_file to also write Requires-Python/Requires-External"""
    distutils.dist.DistributionMetadata.write_pkg_file = (
        setuptools.dist.write_pkg_file
    )


def _patch_distribution_metadata_write_pkg_info():
    """
    Workaround issue #197 - Python 3 prior to 3.2.2 uses an environment-local
    encoding to save the pkg_info. Monkey-patch its write_pkg_info method to
    correct this undesirable behavior.
    """
    environment_local = (3,) <= sys.version_info[:3] < (3, 2, 2)
    if not environment_local:
        return

    distutils.dist.DistributionMetadata.write_pkg_info = (
        setuptools.dist.write_pkg_info
    )


def patch_func(replacement, target_mod, func_name):
    """
    Patch func_name in target_mod with replacement

    Important - original must be resolved by name to avoid
    patching an already patched function.
    """
    original = getattr(target_mod, func_name)

    # set the 'unpatched' attribute on the replacement to
    # point to the original.
    vars(replacement).setdefault('unpatched', original)

    # replace the function in the original module
    setattr(target_mod, func_name, replacement)


def get_unpatched_function(candidate):
    return getattr(candidate, 'unpatched')


def patch_for_msvc_specialized_compiler():
    """
    Patch functions in distutils to use standalone Microsoft Visual C++
    compilers.
    """
    # import late to avoid circular imports on Python < 3.5
    msvc = import_module('setuptools.msvc')

    if platform.system() != 'Windows':
        # Compilers only availables on Microsoft Windows
        return

    def patch_params(mod_name, func_name):
        """
        Prepare the parameters for patch_func to patch indicated function.
        """
        repl_prefix = 'msvc9_' if 'msvc9' in mod_name else 'msvc14_'
        repl_name = repl_prefix + func_name.lstrip('_')
        repl = getattr(msvc, repl_name)
        mod = import_module(mod_name)
        if not hasattr(mod, func_name):
            raise ImportError(func_name)
        return repl, mod, func_name

    # Python 2.7 to 3.4
    msvc9 = functools.partial(patch_params, 'distutils.msvc9compiler')

    # Python 3.5+
    msvc14 = functools.partial(patch_params, 'distutils._msvccompiler')

    try:
        # Patch distutils.msvc9compiler
        patch_func(*msvc9('find_vcvarsall'))
        patch_func(*msvc9('query_vcvarsall'))
    except ImportError:
        pass

    try:
        # Patch distutils._msvccompiler._get_vc_env
        patch_func(*msvc14('_get_vc_env'))
    except ImportError:
        pass

    try:
        # Patch distutils._msvccompiler.gen_lib_options for Numpy
        patch_func(*msvc14('gen_lib_options'))
    except ImportError:
        pass
windows_support.py000064400000001312151733473740010417 0ustar00import platform
import ctypes


def windows_only(func):
    if platform.system() != 'Windows':
        return lambda *args, **kwargs: None
    return func


@windows_only
def hide_file(path):
    """
    Set the hidden attribute on a file or directory.

    From http://stackoverflow.com/questions/19622133/

    `path` must be text.
    """
    __import__('ctypes.wintypes')
    SetFileAttributes = ctypes.windll.kernel32.SetFileAttributesW
    SetFileAttributes.argtypes = ctypes.wintypes.LPWSTR, ctypes.wintypes.DWORD
    SetFileAttributes.restype = ctypes.wintypes.BOOL

    FILE_ATTRIBUTE_HIDDEN = 0x02

    ret = SetFileAttributes(path, FILE_ATTRIBUTE_HIDDEN)
    if not ret:
        raise ctypes.WinError()
build_meta.pyo000064400000014572151733473740007431 0ustar00�
�fc@s�dZddlZddlZddlZddlZddlZddlZddlZdefd��YZ	dej
jfd��YZdd�Zd	�Z
d
�Zd�Zdd�Zdd
�Zdd�Zddd�Zdd�ZdS(s-A PEP 517 interface to setuptools

Previously, when a user or a command line tool (let's call it a "frontend")
needed to make a request of setuptools to take a certain action, for
example, generating a list of installation requirements, the frontend would
would call "setup.py egg_info" or "setup.py bdist_wheel" on the command line.

PEP 517 defines a different method of interfacing with setuptools. Rather
than calling "setup.py" directly, the frontend should:

  1. Set the current directory to the directory with a setup.py file
  2. Import this module into a safe python interpreter (one in which
     setuptools can potentially set global variables or crash hard).
  3. Call one of the functions defined in PEP 517.

What each function does is defined in PEP 517. However, here is a "casual"
definition of the functions (this definition should not be relied on for
bug reports or API stability):

  - `build_wheel`: build a wheel in the folder and return the basename
  - `get_requires_for_build_wheel`: get the `setup_requires` to build
  - `prepare_metadata_for_build_wheel`: get the `install_requires`
  - `build_sdist`: build an sdist in the folder and return the basename
  - `get_requires_for_build_sdist`: get the `setup_requires` to build

Again, this is not a formal definition! Just a "taste" of the module.
i����NtSetupRequirementsErrorcBseZd�ZRS(cCs
||_dS(N(t
specifiers(tselfR((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyt__init__(s(t__name__t
__module__R(((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyR'stDistributioncBs)eZd�Zeejd���ZRS(cCst|��dS(N(R(RR((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pytfetch_build_eggs-sccs5tjj}|tj_z	dVWd|tj_XdS(sw
        Replace
        distutils.dist.Distribution with this class
        for the duration of this context.
        N(t	distutilstcoreR(tclstorig((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pytpatch0s
	(RRRtclassmethodt
contextlibtcontextmanagerR(((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyR,s	ssetup.pycBsa|}d}eede�|�}|j�jdd�}|j�e||d�e�UdS(Nt__main__topens\r\ns\ntexec(tgetattrttokenizeRtreadtreplacetclosetcompiletlocals(tsetup_scriptt__file__Rtftcode((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyt
_run_setup@s
cCs |p	i}|jdg�|S(Ns--global-option(t
setdefault(tconfig_settings((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyt_fix_configKscCs|t|�}ddg}tjd dg|dt_ytj��t�WdQXWn tk
rw}||j7}nX|S(Nt
setuptoolstwheelitegg_infos--global-option(R!tsystargvRRRRR(R trequirementste((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyt_get_build_requiresQs
cCsAgtj|�D]-}tjjtjj||��r|^qS(N(tostlistdirtpathtisdirtjoin(ta_dirtname((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyt_get_immediate_subdirectories`scCst|�}t|�S(N(R!R)(R ((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pytget_requires_for_build_wheelescCst|�}t|�S(N(R!R)(R ((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pytget_requires_for_build_sdistjscCstjd dd|gt_t�|}x�tr�gtj|�D]}|jd�rC|^qC}t|�dkr�tt|��dkr�tj	j
|tj|�d�}q-nPq-W||krtjtj	j
||d�|�tj
|dt�n|dS(Nit	dist_infos
--egg-bases
.dist-infoit
ignore_errors(R%R&RtTrueR*R+tendswithtlenR1R,R.tshutiltmovetrmtree(tmetadata_directoryR tdist_info_directoryRt
dist_infos((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyt prepare_metadata_for_build_wheelos$		cCs�t|�}tjj|�}tjd dg|dt_t�|dkrptj|�tj	d|�ngtj
|�D]}|jd�r�|^q�}|dS(Nitbdist_wheels--global-optiontdists.whli(R!R*R,tabspathR%R&RR9R;tcopytreeR+R7(twheel_directoryR R<Rtwheels((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pytbuild_wheel�s
cCs�t|�}tjj|�}tjd dg|dt_t�|dkrptj|�tj	d|�ngtj
|�D]}|jd�r�|^q�}|dS(Nitsdists--global-optionRAs.tar.gzi(R!R*R,RBR%R&RR9R;RCR+R7(tsdist_directoryR Rtsdists((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pytbuild_sdist�s
(t__doc__R*R%RR9RR"Rt
BaseExceptionRRARRR!R)R1tNoneR2R3R?RFRJ(((s9/usr/lib/python2.7/site-packages/setuptools/build_meta.pyt<module>s&			build_meta.py000064400000013047151733473740007246 0ustar00"""A PEP 517 interface to setuptools

Previously, when a user or a command line tool (let's call it a "frontend")
needed to make a request of setuptools to take a certain action, for
example, generating a list of installation requirements, the frontend would
would call "setup.py egg_info" or "setup.py bdist_wheel" on the command line.

PEP 517 defines a different method of interfacing with setuptools. Rather
than calling "setup.py" directly, the frontend should:

  1. Set the current directory to the directory with a setup.py file
  2. Import this module into a safe python interpreter (one in which
     setuptools can potentially set global variables or crash hard).
  3. Call one of the functions defined in PEP 517.

What each function does is defined in PEP 517. However, here is a "casual"
definition of the functions (this definition should not be relied on for
bug reports or API stability):

  - `build_wheel`: build a wheel in the folder and return the basename
  - `get_requires_for_build_wheel`: get the `setup_requires` to build
  - `prepare_metadata_for_build_wheel`: get the `install_requires`
  - `build_sdist`: build an sdist in the folder and return the basename
  - `get_requires_for_build_sdist`: get the `setup_requires` to build

Again, this is not a formal definition! Just a "taste" of the module.
"""

import os
import sys
import tokenize
import shutil
import contextlib

import setuptools
import distutils


class SetupRequirementsError(BaseException):
    def __init__(self, specifiers):
        self.specifiers = specifiers


class Distribution(setuptools.dist.Distribution):
    def fetch_build_eggs(self, specifiers):
        raise SetupRequirementsError(specifiers)

    @classmethod
    @contextlib.contextmanager
    def patch(cls):
        """
        Replace
        distutils.dist.Distribution with this class
        for the duration of this context.
        """
        orig = distutils.core.Distribution
        distutils.core.Distribution = cls
        try:
            yield
        finally:
            distutils.core.Distribution = orig


def _run_setup(setup_script='setup.py'):
    # Note that we can reuse our build directory between calls
    # Correctness comes first, then optimization later
    __file__ = setup_script
    __name__ = '__main__'
    f = getattr(tokenize, 'open', open)(__file__)
    code = f.read().replace('\\r\\n', '\\n')
    f.close()
    exec(compile(code, __file__, 'exec'), locals())


def _fix_config(config_settings):
    config_settings = config_settings or {}
    config_settings.setdefault('--global-option', [])
    return config_settings


def _get_build_requires(config_settings):
    config_settings = _fix_config(config_settings)
    requirements = ['setuptools', 'wheel']

    sys.argv = sys.argv[:1] + ['egg_info'] + \
        config_settings["--global-option"]
    try:
        with Distribution.patch():
            _run_setup()
    except SetupRequirementsError as e:
        requirements += e.specifiers

    return requirements


def _get_immediate_subdirectories(a_dir):
    return [name for name in os.listdir(a_dir)
            if os.path.isdir(os.path.join(a_dir, name))]


def get_requires_for_build_wheel(config_settings=None):
    config_settings = _fix_config(config_settings)
    return _get_build_requires(config_settings)


def get_requires_for_build_sdist(config_settings=None):
    config_settings = _fix_config(config_settings)
    return _get_build_requires(config_settings)


def prepare_metadata_for_build_wheel(metadata_directory, config_settings=None):
    sys.argv = sys.argv[:1] + ['dist_info', '--egg-base', metadata_directory]
    _run_setup()
    
    dist_info_directory = metadata_directory
    while True:    
        dist_infos = [f for f in os.listdir(dist_info_directory)
                      if f.endswith('.dist-info')]

        if len(dist_infos) == 0 and \
                len(_get_immediate_subdirectories(dist_info_directory)) == 1:
            dist_info_directory = os.path.join(
                dist_info_directory, os.listdir(dist_info_directory)[0])
            continue

        assert len(dist_infos) == 1
        break

    # PEP 517 requires that the .dist-info directory be placed in the
    # metadata_directory. To comply, we MUST copy the directory to the root
    if dist_info_directory != metadata_directory:
        shutil.move(
            os.path.join(dist_info_directory, dist_infos[0]),
            metadata_directory)
        shutil.rmtree(dist_info_directory, ignore_errors=True)

    return dist_infos[0]


def build_wheel(wheel_directory, config_settings=None,
                metadata_directory=None):
    config_settings = _fix_config(config_settings)
    wheel_directory = os.path.abspath(wheel_directory)
    sys.argv = sys.argv[:1] + ['bdist_wheel'] + \
        config_settings["--global-option"]
    _run_setup()
    if wheel_directory != 'dist':
        shutil.rmtree(wheel_directory)
        shutil.copytree('dist', wheel_directory)

    wheels = [f for f in os.listdir(wheel_directory)
              if f.endswith('.whl')]

    assert len(wheels) == 1
    return wheels[0]


def build_sdist(sdist_directory, config_settings=None):
    config_settings = _fix_config(config_settings)
    sdist_directory = os.path.abspath(sdist_directory)
    sys.argv = sys.argv[:1] + ['sdist'] + \
        config_settings["--global-option"]
    _run_setup()
    if sdist_directory != 'dist':
        shutil.rmtree(sdist_directory)
        shutil.copytree('dist', sdist_directory)

    sdists = [f for f in os.listdir(sdist_directory)
              if f.endswith('.tar.gz')]

    assert len(sdists) == 1
    return sdists[0]
extension.pyc000064400000004562151733473740007322 0ustar00�
�fc@s�ddlZddlZddlZddlZddlZddlmZddlm	Z	d�Z
e
Ze	ejj
�Zdefd��YZ
de
fd	��YZdS(
i����N(tmapi(t
get_unpatchedcCs<d}yt|ddg�jtSWntk
r7nXtS(s0
    Return True if Cython can be imported.
    sCython.Distutils.build_exttfromlistt	build_ext(t
__import__RtTruet	ExceptiontFalse(tcython_impl((s8/usr/lib/python2.7/site-packages/setuptools/extension.pyt_have_cythons
t	ExtensioncBs eZdZd�Zd�ZRS(s7Extension that uses '.c' files in place of '.pyx' filescOs2|jdt�|_tj|||||�dS(Ntpy_limited_api(tpopRRt
_Extensiont__init__(tselftnametsourcestargstkw((s8/usr/lib/python2.7/site-packages/setuptools/extension.pyR#scCsqt�r
dS|jpd}|j�dkr4dnd}tjtjd|�}tt||j	��|_	dS(s�
        Replace sources with .pyx extensions to sources with the target
        language extension. This mechanism allows language authors to supply
        pre-converted sources but to prefer the .pyx sources.
        Ntsc++s.cpps.cs.pyx$(
R	tlanguagetlowert	functoolstpartialtretsubtlistRR(Rtlangt
target_extR((s8/usr/lib/python2.7/site-packages/setuptools/extension.pyt_convert_pyx_sources_to_lang)s	(t__name__t
__module__t__doc__RR(((s8/usr/lib/python2.7/site-packages/setuptools/extension.pyR
 s	tLibrarycBseZdZRS(s=Just like a regular Extension, but built as a library instead(RR R!(((s8/usr/lib/python2.7/site-packages/setuptools/extension.pyR"8s(RRtdistutils.coret	distutilstdistutils.errorstdistutils.extensiontsetuptools.extern.six.movesRtmonkeyRR	t
have_pyrextcoreR
R
R"(((s8/usr/lib/python2.7/site-packages/setuptools/extension.pyt<module>s	windows_support.pyo000064400000002372151733473740010605 0ustar00�
�fc@s4ddlZddlZd�Zed��ZdS(i����NcCstj�dkrd�S|S(NtWindowsc_sdS(N(tNone(targstkwargs((s>/usr/lib/python2.7/site-packages/setuptools/windows_support.pyt<lambda>t(tplatformtsystem(tfunc((s>/usr/lib/python2.7/site-packages/setuptools/windows_support.pytwindows_onlyscCsqtd�tjjj}tjjtjjf|_tjj	|_
d}|||�}|smtj��ndS(s�
    Set the hidden attribute on a file or directory.

    From http://stackoverflow.com/questions/19622133/

    `path` must be text.
    sctypes.wintypesiN(t
__import__tctypestwindlltkernel32tSetFileAttributesWtwintypestLPWSTRtDWORDtargtypestBOOLtrestypetWinError(tpathtSetFileAttributestFILE_ATTRIBUTE_HIDDENtret((s>/usr/lib/python2.7/site-packages/setuptools/windows_support.pyt	hide_files	
(RRR	R(((s>/usr/lib/python2.7/site-packages/setuptools/windows_support.pyt<module>s	extension.pyo000064400000004562151733473750007337 0ustar00�
�fc@s�ddlZddlZddlZddlZddlZddlmZddlm	Z	d�Z
e
Ze	ejj
�Zdefd��YZ
de
fd	��YZdS(
i����N(tmapi(t
get_unpatchedcCs<d}yt|ddg�jtSWntk
r7nXtS(s0
    Return True if Cython can be imported.
    sCython.Distutils.build_exttfromlistt	build_ext(t
__import__RtTruet	ExceptiontFalse(tcython_impl((s8/usr/lib/python2.7/site-packages/setuptools/extension.pyt_have_cythons
t	ExtensioncBs eZdZd�Zd�ZRS(s7Extension that uses '.c' files in place of '.pyx' filescOs2|jdt�|_tj|||||�dS(Ntpy_limited_api(tpopRRt
_Extensiont__init__(tselftnametsourcestargstkw((s8/usr/lib/python2.7/site-packages/setuptools/extension.pyR#scCsqt�r
dS|jpd}|j�dkr4dnd}tjtjd|�}tt||j	��|_	dS(s�
        Replace sources with .pyx extensions to sources with the target
        language extension. This mechanism allows language authors to supply
        pre-converted sources but to prefer the .pyx sources.
        Ntsc++s.cpps.cs.pyx$(
R	tlanguagetlowert	functoolstpartialtretsubtlistRR(Rtlangt
target_extR((s8/usr/lib/python2.7/site-packages/setuptools/extension.pyt_convert_pyx_sources_to_lang)s	(t__name__t
__module__t__doc__RR(((s8/usr/lib/python2.7/site-packages/setuptools/extension.pyR
 s	tLibrarycBseZdZRS(s=Just like a regular Extension, but built as a library instead(RR R!(((s8/usr/lib/python2.7/site-packages/setuptools/extension.pyR"8s(RRtdistutils.coret	distutilstdistutils.errorstdistutils.extensiontsetuptools.extern.six.movesRtmonkeyRR	t
have_pyrextcoreR
R
R"(((s8/usr/lib/python2.7/site-packages/setuptools/extension.pyt<module>s	package_index.pyc000064400000115477151733473750010101 0ustar00�
�fc@s~dZddlZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
ddlmZddl
mZmZmZmZddlZddlmZmZmZmZmZmZmZmZmZmZmZmZm Z ddlm!Z!ddl"m#Z#dd	l$m%Z%dd
l&m'Z'ddl(m)Z)ddl*m+Z+dd
l,m-Z-ej.d�Z/ej.dej0�Z1ej.d�Z2ej.dej0�j3Z4dj5�Z6ddddgZ7dZ8dZ9e9j:dej;d de�Z<d�Z=d�Z>d�Z?e@d�ZAe@d �ZBe@d!�ZCe@ee@d"�ZDe@d#�ZEd$�ZFej.d%ej0�ZGeFd&��ZHd'eIfd(��YZJd)eJfd*��YZKdefd+��YZLej.d,�jMZNd-�ZOd.�ZPdd/�ZQd0�ZRd1eIfd2��YZSd3ejTfd4��YZUejVjWd5�ZXeQe8�eX�ZXd6�ZYd7�ZZdS(8s#PyPI and direct package downloadingi����N(twraps(tsix(turllibthttp_clienttconfigparsertmap(
t
CHECKOUT_DISTtDistributiontBINARY_DISTtnormalize_pathtSOURCE_DISTtEnvironmenttfind_distributionst	safe_nametsafe_versiontto_filenametRequirementtDEVELOP_DISTtEGG_DIST(tssl_support(tlog(tDistutilsError(t	translate(tget_all_headers(tunescape(tWheels^egg=([-A-Za-z0-9_.+!]+)$shref\s*=\s*['"]?([^'"> ]+)s�<a href="([^"#]+)">([^<]+)</a>
\s+\(<a (?:title="MD5 hash"
\s+)href="[^?]+\?:action=show_md5&amp;digest=([0-9a-f]{32})">md5</a>\)s([-+.a-z0-9]{2,}):s.tar.gz .tar.bz2 .tar .zip .tgztPackageIndextdistros_for_urltparse_bdist_wininsttinterpret_distro_nameis<setuptools/{setuptools.__version__} Python-urllib/{py_major}tpy_majorit
setuptoolscCs<ytj|�SWn$tk
r7td|f��nXdS(Ns1Not a URL, existing file, or requirement spec: %r(Rtparset
ValueErrorR(tspec((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytparse_requirement_arg2s

cCs�|j�}d\}}}|jd�r�|jd�rL|d }d}q�|jdd�r~|dd!}|d }d}q�|jd	�r�|d
 }d}q�|jdd
�r�|dd!}|d
 }d}q�n|||fS(s=Return (base,pyversion) or (None,None) for possible .exe names.exes
.win32.exei����twin32s	.win32-pyi�i����i����s.win-amd64.exei�s	win-amd64s
.win-amd64-pyi��N(NNN(tlowertNonetendswitht
startswith(tnameR%tbasetpy_vertplat((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR;s$
	

	
	

c	Cs�tjj|�}|\}}}}}}tjj|jd�d�}|dkr�|dkr�tjj|jd�d�}nd|kr�|jdd�\}}n||fS(Nt/i����ssourceforge.nettdownloadi����t#i(RR turlparsetunquotetsplit(	turltpartstschemetservertpatht
parameterstquerytfragmentR*((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytegg_info_for_urlSs"ccs�t|�\}}xt|||�D]}|Vq%W|r�tj|�}|r�x1t||jd�|dt�D]}|VqqWq�ndS(sEYield egg or source distribution objects that might be found at a URLit
precedenceN(R;tdistros_for_locationtEGG_FRAGMENTtmatchRtgroupR(R3tmetadataR*R:tdistR?((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR^s	"c
CsA|jd�r|d }n|jd�rMd|krMtj|||�gS|jd�r�d|kr�t|�}|j�s�gStd|d|jd|jd	td
�gS|jd�r�t|�\}}}|dk	r�t
||||t|�Snx>tD]6}|j|�r|t
|� }t
|||�SqWgS(
s:Yield egg or source distribution objects based on basenames.egg.zipi����s.eggt-s.whltlocationtproject_nametversionR<is.exeN(R'Rt
from_locationRt
is_compatibleRERFRRR&RRt
EXTENSIONStlen(RDtbasenameRAtwheeltwin_baseR+tplatformtext((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR=ls.
		
cCs"tt|�tjj|�|�S(sEYield possible egg or source distribution objects based on a filename(R=R	tosR7RK(tfilenameRA((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytdistros_for_filename�sccs�|jd�}|r4td�|dD��r4dSxatdt|�d�D]F}t||dj|| �dj||�d|d|d|�VqNWdS(	s�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!
    RCcss!|]}tjd|�VqdS(s	py\d\.\d$N(treR?(t.0tp((s</usr/lib/python2.7/site-packages/setuptools/package_index.pys	<genexpr>�siNit
py_versionR<RN(R2tanytrangeRJRtjoin(RDRKRARVR<RNR4RU((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR�s! )ccs�t�}|j}|dkrSxmtjj|j|�D]}||�|Vq7Wn;x8|D]0}||�}||krZ||�|VqZqZWdS(sHList unique elements, preserving order. Remember all elements ever seen.N(tsettaddR&Rtmovestfilterfalset__contains__(titerabletkeytseentseen_addtelementtk((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytunique_everseen�s		


cst���fd��}|S(ss
    Wrap a function returning an iterable such that the resulting iterable
    only ever yields unique items.
    cst�||��S(N(Re(targstkwargs(tfunc(s</usr/lib/python2.7/site-packages/setuptools/package_index.pytwrapper�s(R(RhRi((Rhs</usr/lib/python2.7/site-packages/setuptools/package_index.pyt
unique_values�ss3<([^>]*\srel\s{0,10}=\s{0,10}['"]?([^'" >]+)[^>]*)>ccsx�tj|�D]�}|j�\}}tttj|j�jd���}d|ksgd|krx=t	j|�D])}t
jj|t
|jd���VqwWqqWxjd	D]b}|j|�}|dkr�t	j||�}|rt
jj|t
|jd���Vqq�q�WdS(
sEFind rel="homepage" and rel="download" links in `page`, yielding URLst,thomepageR.is
<th>Home Pages<th>Download URLi����N(s
<th>Home Pages<th>Download URL(tRELtfinditertgroupsRZRtstrtstripR%R2tHREFRR turljoint
htmldecodeR@tfindtsearch(R3tpageR?ttagtreltrelstpos((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytfind_external_links�s'.
tContentCheckercBs)eZdZd�Zd�Zd�ZRS(sP
    A null content checker that defines the interface for checking content
    cCsdS(s3
        Feed a block of data to the hash.
        N((tselftblock((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytfeed�scCstS(sC
        Check the hash. Return False if validation fails.
        (tTrue(R~((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytis_valid�scCsdS(su
        Call reporter with information about the checker (hash name)
        substituted into the template.
        N((R~treporterttemplate((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytreport�s(t__name__t
__module__t__doc__R�R�R�(((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR}�s		tHashCheckercBsJeZejd�Zd�Zed��Zd�Zd�Z	d�Z
RS(sK(?P<hash_name>sha1|sha224|sha384|sha256|sha512|md5)=(?P<expected>[a-f0-9]+)cCs(||_tj|�|_||_dS(N(t	hash_namethashlibtnewthashtexpected(R~R�R�((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt__init__
s	cCsRtjj|�d}|s#t�S|jj|�}|sBt�S||j��S(s5Construct a (possibly null) ContentChecker from a URLi����(RR R0R}tpatternRvt	groupdict(tclsR3R:R?((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytfrom_urlscCs|jj|�dS(N(R�tupdate(R~R((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR�scCs|jj�|jkS(N(R�t	hexdigestR�(R~((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR� scCs||j}||�S(N(R�(R~R�R�tmsg((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR�#s
(R�R�RStcompileR�R�tclassmethodR�R�R�R�(((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR�s				cBsveZdZdd%d&ed�Zed�Zed�Zed�Z	d�Z
d�Zd	�Zd
�Z
d&d�Zd�Zd&d
�Zd�Zd�Zd�Zd�Zd�Zeeed&d�Zeed�Zd�ZdZd�Zd�Zd&d�Zd�Zd�Zd�Zd�Z d�Z!e"ed��Z#d �Z$d!�Z%d"�Z&d#�Z'd$�Z(RS('s;A distribution index that scans web pages for download URLsshttps://pypi.python.org/simplet*cOs�tj|||�|d|jd� |_i|_i|_i|_tjdj	t
t|���j|_
g|_|o�tjo�|p�tj�}|r�tj|�|_ntjj|_dS(NR-t|(RR�R't	index_urltscanned_urlstfetched_urlst
package_pagesRSR�RYRRR?tallowstto_scanRtis_availabletfind_ca_bundlet
opener_fortopenerRtrequestturlopen(R~R�thostst	ca_bundlet
verify_sslRftkwtuse_ssl((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR�+s			'		cCsg||jkr|rdSt|j|<t|�sD|j|�dStt|��}|r�|j|�sodS|jd|�n|s�|s�||jkr�tt	|j
|��dS|j|�s�t|j|<dS|jd|�t|j|<d}|j|||�}|dkr!dSt|j|j<d|jjdd�j�kr`|j�dS|j}|j�}t|t�s�t|tjj�r�d}n|jjd	�p�d}|j|d
�}n|j�xHtj|�D]7}	tjj|t|	j d���}
|j!|
�q�W|j"|j#�rct$|dd�d
krc|j%||�}ndS(s<Evaluate a URL as a possible download, and maybe retrieve itNsFound link: %ss
Reading %ss<Download error on %s: %%s -- Some packages may not be found!thtmlscontent-typetslatin-1tcharsettignoreitcodei�(&R�R�t
URL_SCHEMEtprocess_filenametlistRturl_oktdebugR�RR[tinfotopen_urlR&R3theaderstgetR%tclosetreadt
isinstanceRpRterrort	HTTPErrort	get_paramtdecodeRrRnR RsRtR@tprocess_urlR(R�tgetattrt
process_index(R~R3tretrievetdiststtmpltfR*RwR�R?tlink((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR�@sP



!
		
$*cCs�tjj|�s&|jd|�dStjj|�r�|r�tjj|�}x9tj|�D]%}|jtjj||�t	�qaWnt
|�}|r�|jd|�tt
|j|��ndS(Ns
Not found: %ss	Found: %s(RPR7texiststwarntisdirtrealpathtlistdirR�RYR�RRR�R�RR[(R~tfntnestedR7titemR�((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR�ss&cCs�t|�}|o*|jd�j�dk}|sR|jtjj|�d�rVtSd}|rut||��n|j	||�dS(NitfilesN
Note: Bypassing %s (disallowed host; see http://bit.ly/2hrImnY for details).
(
R�R@R%R�RR R0R�RR�(R~R3tfataltstis_fileR�((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR��s!%cCsBttjj|�}d�|D�}ttj|j|��dS(Ncss@|]6}tj|�D] }|jd�r||fVqqdS(s	.egg-linkN(RPR�R'(RTR7tentry((s</usr/lib/python2.7/site-packages/setuptools/package_index.pys	<genexpr>�s(tfilterRPR7R�R�t	itertoolststarmapt
scan_egg_link(R~tsearch_pathtdirst	egg_links((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytscan_egg_links�s
c
Cs�ttjj||���(}ttdttj	|���}WdQXt
|�dkr[dS|\}}xQttjj||��D]4}tjj||�|_t
|_|j|�q�WdS(Ni(topenRPR7RYR�R�R&RRpRqRJRRDR
R<R[(R~R7R�t	raw_linestlinestegg_patht
setup_pathRB((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR��s'"	c
s�fd�}xWtj|�D]F}y,|tjj|t|jd����Wqtk
rdqXqW||�\}}|rxyt||�D]h}t	|�\}}	|j
d�r�|	r�|r�|d||f7}q��j|�n�j|�q�Wt
jd�|�SdSdS(s#Process the contents of a PyPI pagecs�|j�j�r�tttjj|t�j�jd���}t|�dkr�d|dkr�t	|d�}t
|d�}t�jj
|j�i�|<t|�t|�fSndS(NR-iR/ii(NN(R(R�R�RRR R1RJR2R
RR�R�t
setdefaultR%RR&(R�R4tpkgtver(R~(s</usr/lib/python2.7/site-packages/setuptools/package_index.pytscan�s+"is.pys
#egg=%s-%scSsd|jddd�S(Ns<a href="%s#md5=%s">%s</a>iii(R@(tm((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt<lambda>�R�R�N(RrRnRR RsRtR@R!R|R;R'tneed_version_infotscan_urltPYPI_MD5tsub(
R~R3RwR�R?R�R�tnew_urlR*tfrag((R~s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR��s$,

cCs|jd|�dS(NsPPage at %s links to .py file(s) without version info; an index scan is required.(tscan_all(R~R3((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR��scGsO|j|jkr;|r+|j||�n|jd�n|j|j�dS(Ns6Scanning index of all packages (this may take a while)(R�R�R�R�R�(R~R�Rf((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR��s
cCs�|j|j|jd�|jj|j�sN|j|j|jd�n|jj|j�ss|j|�nx3t|jj|jd��D]}|j|�q�WdS(NR-((	R�R�tunsafe_nameR�R�R`REtnot_found_in_indexR�(R~trequirementR3((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt
find_packages�s%cCsk|j�|j|�x8||jD])}||kr;|S|jd||�q%Wtt|�j||�S(Ns%s does not match %s(tprescanR�R`R�tsuperRtobtain(R~R�t	installerRB((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR��s

cCsi|j|jd|�|j�se|j�tj|�td|jjtj	j
|�f��ndS(s-
        checker is a ContentChecker
        sValidating %%s checksum for %ss7%s validation failed for %s; possible download problem?N(R�R�R�R�RPtunlinkRR�R)R7RK(R~tcheckerRQttfp((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt
check_hash�s

cCsrxk|D]c}|jdksJt|�sJ|jd�sJtt|��rZ|j|�q|jj|�qWdS(s;Add `urls` to the list that will be prescanned for searchessfile:N(R�R&R�R(R�RR�tappend(R~turlsR3((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytadd_find_linkss

cCs2|jr%tt|j|j��nd|_dS(s7Scan urls scheduled for prescanning (e.g. --find-links)N(R�R�RR�R&(R~((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR�s	cCsN||jr |jd}}n|jd}}|||j�|j�dS(Ns#Couldn't retrieve index page for %rs3Couldn't find index page for %r (maybe misspelled?)(R`R�R�R�R�(R~R�tmethR�((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR�!s

cCs�t|t�s�t|�}|r||j|jd�||�}t|�\}}|jd�rx|j|||�}n|Stj	j
|�r�|St|�}nt|j
||�dd�S(sLocate 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.
        is.pyRDN(R�RR�t
_download_urlR@R;R't	gen_setupRPR7R�R#R�tfetch_distributionR&(R~R"ttmpdirR5tfoundR*R:((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR.+sc	sF�jd|�i�d}d�����fd�}|rf�j��j|�||�}n|r�|dk	r�|||�}n|dkr��jdk	r��j�n||�}n|dkr�|r��j|�||�}n|dkr�jd�rdpd|�n#�jd|�|jd|j�SdS(	s|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.
        sSearching for %scs�|dkr�}nx�||jD]�}|jtkrn�rn|�kr#�jd|�d�|<q#q#n||ko�|jtkp��}|r#�j|j��}||_t	j
j|j�r�|Sq#q#WdS(Ns&Skipping development or system egg: %si(R&R`R<RR�R
R.RDtdownload_locationRPR7R�(treqtenvRBttesttloc(t
develop_okR~tskippedtsourceR(s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRues 	

	s:No local packages or working download links found for %s%ssa source distribution of R�sBest match: %sRDN(R�R&R�R�R�R�tcloneR(	R~R�Rt
force_scanRR
tlocal_indexRBRu((R
R~RRRs</usr/lib/python2.7/site-packages/setuptools/package_index.pyRMs0




cCs/|j||||�}|dk	r+|jSdS(s3Obtain 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(RR&RD(R~R�RRRRB((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytfetch�sc
Csptj|�}|rLgt||jd�d�D]}|jr1|^q1pOg}t|�dkrAtjj	|�}tjj
|�|kr�tjj||�}ddlm
}	|	||�s�tj||�|}q�nttjj|d�d��?}
|
jd|dj|djtjj|�df�WdQX|S|r`td||f��ntd	��dS(
Nii����(tsamefilessetup.pytwsIfrom setuptools import setup
setup(name=%r, version=%r, py_modules=[%r])
is�Can't unambiguously interpret project/version identifier %r; any dashes in the name or version should be escaped using underscores. %rspCan't process plain .py files without an '#egg=name-version' suffix to enable automatic setup script generation.(R>R?RR@R&RFRJRPR7RKtdirnameRYtsetuptools.command.easy_installRtshutiltcopy2R�twriteREtsplitextR(R~RQR:RR?tdR�RKtdstRR�((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR�s24!!i c
Cs�|jd|�d}zXtj|�}|j|�}t|tjj�rnt	d||j
|jf��n|j�}d}|j}d}d|kr�t
|d�}	ttt|	��}|j|||||�nt|d��}}
x`trO|j|�}|rK|j|�|
j|�|d7}|j|||||�q�Pq�W|j|||
�WdQX|SWd|r�|j�nXdS(	NsDownloading %ssCan't download %s: %s %sii����scontent-lengthsContent-Lengthtwbi(R�R&R�R�R�R�RR�R�RR�R�tdl_blocksizeRtmaxRtintt
reporthookR�R�R�R�RR�R�(R~R3RQtfpR�R�tblocknumtbstsizetsizesR�R((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt_download_to�s:		


cCsdS(N((R~R3RQR!tblksizeR#((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR�scCs�|jd�rt|�Syt||j�SWnsttjfk
r�}djg|jD]}t	|�^qX�}|r�|j
||�q�td||f��n�tj
jk
r�}|Stj
jk
r}|r�|j
||j�q�td||jf��n�tjk
rU}|r9|j
||j�q�td||jf��nNtjtj
fk
r�}|r�|j
||�q�td||f��nXdS(Nsfile:t s%s %ssDownload error for %s: %ss;%s returned a bad status line. The server might be down, %s(R(t
local_opentopen_with_authR�R!Rt
InvalidURLRYRfRpR�RRR�R�tURLErrortreasont
BadStatusLinetlinet
HTTPExceptiontsocket(R~R3twarningtvtargR�((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR��s6
+cCsHt|�\}}|rLx7d|krH|jdd�jdd�}qWnd}|jd�rn|d }ntjj||�}|dks�|jd	�r�|j||�S|d
ks�|jd�r�|j||�S|jd�r�|j	||�S|d
kr$t
jjt
j
j|�d�S|j|t�|j||�SdS(Ns..t.s\t_t__downloaded__s.egg.zipi����tsvnssvn+tgitsgit+shg+R�i(R;treplaceR'RPR7RYR(t
_download_svnt
_download_gitt_download_hgRR�turl2pathnameR R0R�R�t_attempt_download(R~R5R3RR)R:RQ((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRs$%
 cCs|j|t�dS(N(R�R�(R~R3((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR�8scCsK|j||�}d|jdd�j�krC|j|||�S|SdS(NR�scontent-typeR�(R%R�R%t_download_html(R~R3RQR�((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR>;scCs�t|�}xW|D]O}|j�rtjd|�r^|j�tj|�|j||�SPqqW|j�tj|�td|��dS(Ns <title>([^- ]+ - )?Revision \d+:sUnexpected HTML page found at (	R�RqRSRvR�RPR�R:R(R~R3R�RQR�R.((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR?Bs




cCsl|jdd�d}d}|j�jd�r;d|kr;tjj|�\}}}}}}	|r;|jd�r;d|d	kr;|d	jdd�\}}tjj|�\}
}|
r8d
|
kr�|
jd
d�\}}
d||
f}n
d|
}|}||||||	f}tjj|�}q8q;n|jd
||�t	j
d|||f�|S(NR/iiR�ssvn:t@s//R-it:s --username=%s --password=%ss --username=s'Doing subversion checkout from %s to %sssvn checkout%s -q %s %s(R2R%R(RR R0t	splitusert
urlunparseR�RPtsystem(R~R3RQtcredsR5tnetlocR7RUtqR�tauththosttusertpwR4((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR:Qs$!$&
cCs�tjj|�\}}}}}|jdd�d}|jdd�d}d}d|krz|jdd�\}}ntjj||||df�}||fS(Nt+ii����R/iR@R�(RR turlsplitR2R&trsplitt
urlunsplit(R3t
pop_prefixR5RFR7R9R�trev((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt_vcs_split_rev_from_urlfs!!cCs�|jdd�d}|j|dt�\}}|jd||�tjd||f�|dk	r�|jd|�tjd||f�n|S(	NR/iiRPsDoing git clone from %s to %ssgit clone --quiet %s %ssChecking out %ss"(cd %s && git checkout --quiet %s)(R2RRR�R�RPRDR&(R~R3RQRQ((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR;xs	cCs�|jdd�d}|j|dt�\}}|jd||�tjd||f�|dk	r�|jd|�tjd||f�n|S(	NR/iiRPsDoing hg clone from %s to %sshg clone --quiet %s %ssUpdating to %ss(cd %s && hg up -C -r %s -q)(R2RRR�R�RPRDR&(R~R3RQRQ((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR<�s	cGstj||�dS(N(RR�(R~R�Rf((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR��scGstj||�dS(N(RR�(R~R�Rf((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR��scGstj||�dS(N(RR�(R~R�Rf((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR��s(R�N()R�R�R�R&R�R�tFalseR�R�R�R�R�R�R�R�R�R�R�R�R�R�R.RRRRR%RR�RR�R>R?R:tstaticmethodRRR;R<R�R�R�(((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR(sL3
	
		+								
	#J
	)	$	#									s!&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?cCs|jd�}t|�S(Ni(R@R(R?twhat((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt
decode_entity�scCs
tt|�S(s'Decode HTML entities in the given text.(t
entity_subRV(ttext((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRt�scs�fd�}|S(Ncs��fd�}|S(Ncs?tj�}tj��z�||�SWdtj|�XdS(N(R0tgetdefaulttimeouttsetdefaulttimeout(RfRgtold_timeout(Rhttimeout(s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt_socket_timeout�s

((RhR](R\(Rhs</usr/lib/python2.7/site-packages/setuptools/package_index.pyR]�s((R\R]((R\s</usr/lib/python2.7/site-packages/setuptools/package_index.pytsocket_timeout�scCsItjj|�}|j�}tj|�}|j�}|jdd�S(sq
    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
    s
R�(RR R1tencodetbase64tencodestringR�R9(RHtauth_st
auth_bytest
encoded_bytestencoded((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt_encode_auth�s
t
CredentialcBs)eZdZd�Zd�Zd�ZRS(s:
    A username/password pair. Use like a namedtuple.
    cCs||_||_dS(N(tusernametpassword(R~RhRi((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR��s	ccs|jV|jVdS(N(RhRi(R~((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt__iter__�scCsdt|�S(Ns%(username)s:%(password)s(tvars(R~((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt__str__�s(R�R�R�R�RjRl(((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRg�s		t
PyPIConfigcBs2eZd�Zed��Zd�Zd�ZRS(cCsutjdddgd�}tjj||�tjjtjjd�d�}tjj	|�rq|j
|�ndS(s%
        Load from ~/.pypirc
        RhRit
repositoryR�t~s.pypircN(tdicttfromkeysRtRawConfigParserR�RPR7RYt
expanduserR�R�(R~tdefaultstrc((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR��s
!cCsMg|j�D]$}|j|d�j�r
|^q
}tt|j|��S(NRn(tsectionsR�RqRpRt_get_repo_cred(R~tsectiontsections_with_repositories((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytcreds_by_repository�s$cCsO|j|d�j�}|t|j|d�j�|j|d�j��fS(NRnRhRi(R�RqRg(R~Rxtrepo((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRw�scCs7x0|jj�D]\}}|j|�r|SqWdS(s�
        If the URL indicated appears to be a repository defined in this
        config, return the credential for that repository.
        N(RztitemsR((R~R3Rntcred((s</usr/lib/python2.7/site-packages/setuptools/package_index.pytfind_credentials(R�R�R�tpropertyRzRwR~(((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyRm�s			cCs�tjj|�\}}}}}}|jd�rEtjd��n|d	krltjj|�\}}	nd
}|s�t�j	|�}
|
r�t
|
�}|
j|f}tj
d|�q�n|r&dt|�}||	||||f}tjj|�}
tjj|
�}|jd|�ntjj|�}|jdt�||�}|r�tjj|j�\}}}}}}||kr�||	kr�||||||f}tjj|�|_q�n|S(s4Open a urllib2 request, handling HTTP authenticationRAsnonnumeric port: ''thttpthttpss*Authenticating as %s for %s (from .pypirc)sBasic t
Authorizations
User-Agent(R�R�N(RR R0R'RR*RBR&RmR~RpRhRR�RfRCR�tRequestt
add_headert
user_agentR3(R3R�R5RFR7tparamsR9R�RHRIR}R�R4R�R�R ts2th2tpath2tparam2tquery2tfrag2((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR)s6$'cCs|S(N((R3((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt
fix_sf_url?scCs�tjj|�\}}}}}}tjj|�}tjj|�rXtjj|�S|j	d�rPtjj
|�rPg}x�tj|�D]�}	tjj||	�}
|	dkr�t
|
d��}|j�}WdQXPntjj
|
�r�|	d7}	n|jdjd|	��q�Wd}
|
jd|d	d
j|��}d\}}nd\}}}idd6}tj|�}tjj|||||�S(s7Read a local path, with special support for directoriesR-s
index.htmltrNs<a href="{name}">{name}</a>R)sB<html><head><title>{url}</title></head><body>{files}</body></html>R3tfiless
i�tOKi�sPath not founds	Not founds	text/htmlscontent-type(i�R�(i�sPath not founds	Not found(RR R0R�R=RPR7tisfileR�R'R�R�RYR�R�R�tformatRtStringIOR�R�(R3R5R6R7tparamR9R�RQR�R�tfilepathR tbodyR�tstatustmessageR�tbody_stream((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyR(Cs,$!
!
([R�tsysRPRSRR0R`R�R�t	functoolsRtsetuptools.externRtsetuptools.extern.six.movesRRRRRt
pkg_resourcesRRRR	R
RRR
RRRRRRt	distutilsRtdistutils.errorsRtfnmatchRtsetuptools.py27compatRtsetuptools.py33compatRtsetuptools.wheelRR�R>tIRrR�R?R�R2RIt__all__t_SOCKET_TIMEOUTt_tmplR�RFR�R#RR;R&RR=RRRReRjRmR|tobjectR}R�RR�RWRVRtR^RfRgRrRmR�R�R)R�R((((s</usr/lib/python2.7/site-packages/setuptools/package_index.pyt<module>sv"X							!"	
!��~			&.	wheel.pyo000064400000016215151733473750006425 0ustar00�
�fc@s�dZddlmZddlZddlZddlZddlZddlZddlm	Z	m
Z
mZddlm
Z
ddlm	ZddlmZddlmZejd	ej�jZd
Zd�Zdefd
��YZdS(sWheels support.i����(tget_platformN(tDistributiontPathMetadatat
parse_version(tPY3(R(t
pep425tags(twrite_requirementss�^(?P<project_name>.+?)-(?P<version>\d.*?)
    ((-(?P<build>\d.*?))?-(?P<py_version>.+?)-(?P<abi>.+?)-(?P<platform>.+?)
    )\.whl$s�try:
    __import__('pkg_resources').declare_namespace(__name__)
except ImportError:
    __path__ = __import__('pkgutil').extend_path(__path__, __name__)
cCsBxtj|�D]�\}}}tjj||�}xK|D]C}tjj||�}tjj|||�}tj||�q;Wxttt|���D]e\}	}
tjj||
�}tjj|||
�}tjj	|�s�tj||�||	=q�q�WqWx3tj|dt
�D]\}}}tj|�qWdS(sDMove everything under `src_dir` to `dst_dir`, and delete the former.ttopdownN(tostwalktpathtrelpathtjointrenamestreversedtlistt	enumeratetexiststTruetrmdir(tsrc_dirtdst_dirtdirpathtdirnamest	filenamestsubdirtftsrctdsttntd((s4/usr/lib/python2.7/site-packages/setuptools/wheel.pytunpacks
%%tWheelcBs5eZd�Zd�Zd�Zd�Zd�ZRS(cCswttjj|��}|dkr7td|��n||_x0|j�j�D]\}}t	|||�qSWdS(Nsinvalid wheel name: %r(
t
WHEEL_NAMERR
tbasenametNonet
ValueErrortfilenamet	groupdicttitemstsetattr(tselfR%tmatchtktv((s4/usr/lib/python2.7/site-packages/setuptools/wheel.pyt__init__7s	cCs7tj|jjd�|jjd�|jjd��S(s>List tags (py_version, abi, platform) supported by this wheel.t.(t	itertoolstproductt
py_versiontsplittabitplatform(R)((s4/usr/lib/python2.7/site-packages/setuptools/wheel.pyttags?scs/tj��t�fd�|j�D�t�S(s5Is the wheel is compatible with the current platform?c3s!|]}|�krtVqdS(N(R(t.0tt(tsupported_tags(s4/usr/lib/python2.7/site-packages/setuptools/wheel.pys	<genexpr>Hs(Rt
get_supportedtnextR5tFalse(R)((R8s4/usr/lib/python2.7/site-packages/setuptools/wheel.pyt
is_compatibleEscCsAtd|jd|jd|jdkr-dnt��j�dS(Ntproject_nametversionR4tanys.egg(RR=R>R4R#Rtegg_name(R)((s4/usr/lib/python2.7/site-packages/setuptools/wheel.pyR@Js$cstj|j���d|j|jf}d|�d|���fd�}|d�}|d�}t|jd��}td�|ko�td	�kns�td
|��ntj	|��j
|�tjj|���t
j|�dt|����d��ttt��j��������fd
��jD�}tjj|d�}tj�|�tjtjj|d�tjj|d��tdtd�d|��}	t|	jd�dtjj|d��tjj|���tjj�d�}
tjj|
�r�tjj|dd�}tj	|�xstj|
�D]b}|jd�r�tjtjj|
|��q\tjtjj|
|�tjj||��q\Wtj|
�nx:t tjj�fd�d!D��D]}
t!|
|�q�Wtjj��r1tj��ntjj|d�}tjj|�rt"|��}|j#�j$�}WdQXx�|D]�}tjj||j$d��}tjj|d�}tjj|�r�tjj|�r�t"|d ��}|j%t&�WdQXq�q�WnWdQXdS("s"Install wheel as an egg directory.s%s-%ss%s.dist-infos%s.datacsc�jd�|f��D}tr7|j�jd�n	|j�}tjj�j|�SWdQXdS(Ns%s/%ssutf-8(topenRtreadtdecodetemailtparsertParsertparsestr(tnametfptvalue(t	dist_infotzf(s4/usr/lib/python2.7/site-packages/setuptools/wheel.pytget_metadataVs'tWHEELtMETADATAs
Wheel-Versions1.0s2.0dev0s$unsupported wheel format version: %stmetadatacSsd|_t|�S(N(R#tmarkertstr(treq((s4/usr/lib/python2.7/site-packages/setuptools/wheel.pytraw_reqls	c	sJi|]@}tt�fd�t��j|f��D���|�qS(c3s!|]}|�kr|VqdS(N((R6RS(tinstall_requires(s4/usr/lib/python2.7/site-packages/setuptools/wheel.pys	<genexpr>rs(Rtsortedtmaptrequires(R6textra(tdistRURT(s4/usr/lib/python2.7/site-packages/setuptools/wheel.pys
<dictcomp>qs	sEGG-INFOsPKG-INFOtattrsRUtextras_requiretegg_infosrequires.txttscriptss.pycc3s$|]}tjj�|�VqdS(N(RR
R(R6R(t	dist_data(s4/usr/lib/python2.7/site-packages/setuptools/wheel.pys	<genexpr>�stdatatheaderstpurelibtplatlibsnamespace_packages.txtNR.s__init__.pytw(R`RaRbRc('tzipfiletZipFileR%R=R>RtgetR$Rtmkdirt
extractallR
RRt
from_locationRRRVRWRXtextrastrenametSetuptoolsDistributiontdictRtget_command_objR#RtlistdirtendswithtunlinkRtfilterRRARBR2twritetNAMESPACE_PACKAGE_INIT(R)tdestination_eggdirt
dist_basenameRMtwheel_metadatat
dist_metadatat
wheel_versionR\R]t
setup_disttdist_data_scriptstegg_info_scriptstentryRtnamespace_packagesRItmodtmod_dirtmod_init((RZR_RKRURTRLs4/usr/lib/python2.7/site-packages/setuptools/wheel.pytinstall_as_eggPsr

(

		!


%(t__name__t
__module__R-R5R<R@R�(((s4/usr/lib/python2.7/site-packages/setuptools/wheel.pyR 5s
				(t__doc__tdistutils.utilRRDR/RtreRet
pkg_resourcesRRRtsetuptools.extern.sixRt
setuptoolsRmRtsetuptools.command.egg_infoRtcompiletVERBOSER*R!RuRtobjectR (((s4/usr/lib/python2.7/site-packages/setuptools/wheel.pyt<module>s"	py31compat.pyo000064400000003552151733473750007321 0ustar00�
�fc@s�ddgZyddlmZmZWn0ek
rXddlmZmZd�ZnXyddlmZWn?ek
r�ddl	Z	ddlZde
fd	��YZnXdS(
tget_config_varstget_pathi����(RR(Rtget_python_libcCs+|dkrtd��nt|dk�S(NtplatlibtpurelibsName must be purelib or platlib(RR(t
ValueErrorR(tname((s9/usr/lib/python2.7/site-packages/setuptools/py31compat.pyR	s(tTemporaryDirectoryNRcBs)eZdZd�Zd�Zd�ZRS(s�
        Very simple temporary directory context manager.
        Will try to delete afterward, but will also ignore OS and similar
        errors on deletion.
        cCsd|_tj�|_dS(N(tNoneRttempfiletmkdtemp(tself((s9/usr/lib/python2.7/site-packages/setuptools/py31compat.pyt__init__s	cCs|jS(N(R(R((s9/usr/lib/python2.7/site-packages/setuptools/py31compat.pyt	__enter__!scCs8ytj|jt�Wntk
r*nXd|_dS(N(tshutiltrmtreeRtTruetOSErrorR(Rtexctypetexcvaluetexctrace((s9/usr/lib/python2.7/site-packages/setuptools/py31compat.pyt__exit__$s

(t__name__t
__module__t__doc__RR
R(((s9/usr/lib/python2.7/site-packages/setuptools/py31compat.pyRs		(t__all__t	sysconfigRRtImportErrortdistutils.sysconfigRR	RRtobject(((s9/usr/lib/python2.7/site-packages/setuptools/py31compat.pyt<module>s


pep425tags.py000064400000025202151733473750007034 0ustar00# This file originally from pip:
# https://github.com/pypa/pip/blob/8f4f15a5a95d7d5b511ceaee9ed261176c181970/src/pip/_internal/pep425tags.py
"""Generate and work with PEP 425 Compatibility Tags."""
from __future__ import absolute_import

import distutils.util
import platform
import re
import sys
import sysconfig
import warnings
from collections import OrderedDict

from . import glibc

_osx_arch_pat = re.compile(r'(.+)_(\d+)_(\d+)_(.+)')


def get_config_var(var):
    try:
        return sysconfig.get_config_var(var)
    except IOError as e:  # Issue #1074
        warnings.warn("{}".format(e), RuntimeWarning)
        return None


def get_abbr_impl():
    """Return abbreviated implementation name."""
    if hasattr(sys, 'pypy_version_info'):
        pyimpl = 'pp'
    elif sys.platform.startswith('java'):
        pyimpl = 'jy'
    elif sys.platform == 'cli':
        pyimpl = 'ip'
    else:
        pyimpl = 'cp'
    return pyimpl


def get_impl_ver():
    """Return implementation version."""
    impl_ver = get_config_var("py_version_nodot")
    if not impl_ver or get_abbr_impl() == 'pp':
        impl_ver = ''.join(map(str, get_impl_version_info()))
    return impl_ver


def get_impl_version_info():
    """Return sys.version_info-like tuple for use in decrementing the minor
    version."""
    if get_abbr_impl() == 'pp':
        # as per https://github.com/pypa/pip/issues/2882
        return (sys.version_info[0], sys.pypy_version_info.major,
                sys.pypy_version_info.minor)
    else:
        return sys.version_info[0], sys.version_info[1]


def get_impl_tag():
    """
    Returns the Tag for this specific implementation.
    """
    return "{}{}".format(get_abbr_impl(), get_impl_ver())


def get_flag(var, fallback, expected=True, warn=True):
    """Use a fallback method for determining SOABI flags if the needed config
    var is unset or unavailable."""
    val = get_config_var(var)
    if val is None:
        if warn:
            warnings.warn("Config variable '{0}' is unset, Python ABI tag may "
                          "be incorrect".format(var), RuntimeWarning, 2)
        return fallback()
    return val == expected


def get_abi_tag():
    """Return the ABI tag based on SOABI (if available) or emulate SOABI
    (CPython 2, PyPy)."""
    soabi = get_config_var('SOABI')
    impl = get_abbr_impl()
    if not soabi and impl in {'cp', 'pp'} and hasattr(sys, 'maxunicode'):
        d = ''
        m = ''
        u = ''
        if get_flag('Py_DEBUG',
                    lambda: hasattr(sys, 'gettotalrefcount'),
                    warn=(impl == 'cp')):
            d = 'd'
        if get_flag('WITH_PYMALLOC',
                    lambda: impl == 'cp',
                    warn=(impl == 'cp')):
            m = 'm'
        if get_flag('Py_UNICODE_SIZE',
                    lambda: sys.maxunicode == 0x10ffff,
                    expected=4,
                    warn=(impl == 'cp' and
                          sys.version_info < (3, 3))) \
                and sys.version_info < (3, 3):
            u = 'u'
        abi = '%s%s%s%s%s' % (impl, get_impl_ver(), d, m, u)
    elif soabi and soabi.startswith('cpython-'):
        abi = 'cp' + soabi.split('-')[1]
    elif soabi:
        abi = soabi.replace('.', '_').replace('-', '_')
    else:
        abi = None
    return abi


def _is_running_32bit():
    return sys.maxsize == 2147483647


def get_platform():
    """Return our platform name 'win32', 'linux_x86_64'"""
    if sys.platform == 'darwin':
        # distutils.util.get_platform() returns the release based on the value
        # of MACOSX_DEPLOYMENT_TARGET on which Python was built, which may
        # be significantly older than the user's current machine.
        release, _, machine = platform.mac_ver()
        split_ver = release.split('.')

        if machine == "x86_64" and _is_running_32bit():
            machine = "i386"
        elif machine == "ppc64" and _is_running_32bit():
            machine = "ppc"

        return 'macosx_{}_{}_{}'.format(split_ver[0], split_ver[1], machine)

    # XXX remove distutils dependency
    result = distutils.util.get_platform().replace('.', '_').replace('-', '_')
    if result == "linux_x86_64" and _is_running_32bit():
        # 32 bit Python program (running on a 64 bit Linux): pip should only
        # install and run 32 bit compiled extensions in that case.
        result = "linux_i686"

    return result


def is_manylinux1_compatible():
    # Only Linux, and only x86-64 / i686
    if get_platform() not in {"linux_x86_64", "linux_i686"}:
        return False

    # Check for presence of _manylinux module
    try:
        import _manylinux
        return bool(_manylinux.manylinux1_compatible)
    except (ImportError, AttributeError):
        # Fall through to heuristic check below
        pass

    # Check glibc version. CentOS 5 uses glibc 2.5.
    return glibc.have_compatible_glibc(2, 5)


def get_darwin_arches(major, minor, machine):
    """Return a list of supported arches (including group arches) for
    the given major, minor and machine architecture of an macOS machine.
    """
    arches = []

    def _supports_arch(major, minor, arch):
        # Looking at the application support for macOS versions in the chart
        # provided by https://en.wikipedia.org/wiki/OS_X#Versions it appears
        # our timeline looks roughly like:
        #
        # 10.0 - Introduces ppc support.
        # 10.4 - Introduces ppc64, i386, and x86_64 support, however the ppc64
        #        and x86_64 support is CLI only, and cannot be used for GUI
        #        applications.
        # 10.5 - Extends ppc64 and x86_64 support to cover GUI applications.
        # 10.6 - Drops support for ppc64
        # 10.7 - Drops support for ppc
        #
        # Given that we do not know if we're installing a CLI or a GUI
        # application, we must be conservative and assume it might be a GUI
        # application and behave as if ppc64 and x86_64 support did not occur
        # until 10.5.
        #
        # Note: The above information is taken from the "Application support"
        #       column in the chart not the "Processor support" since I believe
        #       that we care about what instruction sets an application can use
        #       not which processors the OS supports.
        if arch == 'ppc':
            return (major, minor) <= (10, 5)
        if arch == 'ppc64':
            return (major, minor) == (10, 5)
        if arch == 'i386':
            return (major, minor) >= (10, 4)
        if arch == 'x86_64':
            return (major, minor) >= (10, 5)
        if arch in groups:
            for garch in groups[arch]:
                if _supports_arch(major, minor, garch):
                    return True
        return False

    groups = OrderedDict([
        ("fat", ("i386", "ppc")),
        ("intel", ("x86_64", "i386")),
        ("fat64", ("x86_64", "ppc64")),
        ("fat32", ("x86_64", "i386", "ppc")),
    ])

    if _supports_arch(major, minor, machine):
        arches.append(machine)

    for garch in groups:
        if machine in groups[garch] and _supports_arch(major, minor, garch):
            arches.append(garch)

    arches.append('universal')

    return arches


def get_supported(versions=None, noarch=False, platform=None,
                  impl=None, abi=None):
    """Return a list of supported tags for each version specified in
    `versions`.

    :param versions: a list of string versions, of the form ["33", "32"],
        or None. The first version will be assumed to support our ABI.
    :param platform: specify the exact platform you want valid
        tags for, or None. If None, use the local system platform.
    :param impl: specify the exact implementation you want valid
        tags for, or None. If None, use the local interpreter impl.
    :param abi: specify the exact abi you want valid
        tags for, or None. If None, use the local interpreter abi.
    """
    supported = []

    # Versions must be given with respect to the preference
    if versions is None:
        versions = []
        version_info = get_impl_version_info()
        major = version_info[:-1]
        # Support all previous minor Python versions.
        for minor in range(version_info[-1], -1, -1):
            versions.append(''.join(map(str, major + (minor,))))

    impl = impl or get_abbr_impl()

    abis = []

    abi = abi or get_abi_tag()
    if abi:
        abis[0:0] = [abi]

    abi3s = set()
    import imp
    for suffix in imp.get_suffixes():
        if suffix[0].startswith('.abi'):
            abi3s.add(suffix[0].split('.', 2)[1])

    abis.extend(sorted(list(abi3s)))

    abis.append('none')

    if not noarch:
        arch = platform or get_platform()
        if arch.startswith('macosx'):
            # support macosx-10.6-intel on macosx-10.9-x86_64
            match = _osx_arch_pat.match(arch)
            if match:
                name, major, minor, actual_arch = match.groups()
                tpl = '{}_{}_%i_%s'.format(name, major)
                arches = []
                for m in reversed(range(int(minor) + 1)):
                    for a in get_darwin_arches(int(major), m, actual_arch):
                        arches.append(tpl % (m, a))
            else:
                # arch pattern didn't match (?!)
                arches = [arch]
        elif platform is None and is_manylinux1_compatible():
            arches = [arch.replace('linux', 'manylinux1'), arch]
        else:
            arches = [arch]

        # Current version, current API (built specifically for our Python):
        for abi in abis:
            for arch in arches:
                supported.append(('%s%s' % (impl, versions[0]), abi, arch))

        # abi3 modules compatible with older version of Python
        for version in versions[1:]:
            # abi3 was introduced in Python 3.2
            if version in {'31', '30'}:
                break
            for abi in abi3s:   # empty set if not Python 3
                for arch in arches:
                    supported.append(("%s%s" % (impl, version), abi, arch))

        # Has binaries, does not use the Python API:
        for arch in arches:
            supported.append(('py%s' % (versions[0][0]), 'none', arch))

    # No abi / arch, but requires our implementation:
    supported.append(('%s%s' % (impl, versions[0]), 'none', 'any'))
    # Tagged specifically as being cross-version compatible
    # (with just the major version specified)
    supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any'))

    # No abi / arch, generic Python
    for i, version in enumerate(versions):
        supported.append(('py%s' % (version,), 'none', 'any'))
        if i == 0:
            supported.append(('py%s' % (version[0]), 'none', 'any'))

    return supported


implementation_tag = get_impl_tag()
py31compat.pyc000064400000003552151733473750007305 0ustar00�
�fc@s�ddgZyddlmZmZWn0ek
rXddlmZmZd�ZnXyddlmZWn?ek
r�ddl	Z	ddlZde
fd	��YZnXdS(
tget_config_varstget_pathi����(RR(Rtget_python_libcCs+|dkrtd��nt|dk�S(NtplatlibtpurelibsName must be purelib or platlib(RR(t
ValueErrorR(tname((s9/usr/lib/python2.7/site-packages/setuptools/py31compat.pyR	s(tTemporaryDirectoryNRcBs)eZdZd�Zd�Zd�ZRS(s�
        Very simple temporary directory context manager.
        Will try to delete afterward, but will also ignore OS and similar
        errors on deletion.
        cCsd|_tj�|_dS(N(tNoneRttempfiletmkdtemp(tself((s9/usr/lib/python2.7/site-packages/setuptools/py31compat.pyt__init__s	cCs|jS(N(R(R((s9/usr/lib/python2.7/site-packages/setuptools/py31compat.pyt	__enter__!scCs8ytj|jt�Wntk
r*nXd|_dS(N(tshutiltrmtreeRtTruetOSErrorR(Rtexctypetexcvaluetexctrace((s9/usr/lib/python2.7/site-packages/setuptools/py31compat.pyt__exit__$s

(t__name__t
__module__t__doc__RR
R(((s9/usr/lib/python2.7/site-packages/setuptools/py31compat.pyRs		(t__all__t	sysconfigRRtImportErrortdistutils.sysconfigRR	RRtobject(((s9/usr/lib/python2.7/site-packages/setuptools/py31compat.pyt<module>s


monkey.pyc000064400000014307151733473750006607 0ustar00�
�fc@s�dZddlZddlZddlZddlZddlZddlmZddl	Z	ddl
mZddlZgZ
d�Zd�Zd�Zd�Zd	�Zd
�Zd�Zd�Zd
�ZdS(s
Monkey patching of distutils.
i����N(t
import_module(tsixcCs-tj�dkr |f|jStj|�S(sm
    Returns the bases classes for cls sorted by the MRO.

    Works around an issue on Jython where inspect.getmro will not return all
    base classes if multiple classes share the same name. Instead, this
    function will return a tuple containing the class itself, and the contents
    of cls.__bases__. See https://github.com/pypa/setuptools/issues/1024.
    tJython(tplatformtpython_implementationt	__bases__tinspecttgetmro(tcls((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyt_get_mros	cCsCt|tj�rtnt|tj�r0tnd�}||�S(NcSsdS(N(tNone(titem((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyt<lambda>*t(t
isinstanceRtclass_typestget_unpatched_classttypestFunctionTypetget_unpatched_function(Rtlookup((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyt
get_unpatched&s	cCsQd�t|�D�}t|�}|jjd�sMd|}t|��n|S(s�Protect against re-patching the distutils if reloaded

    Also ensures that no other distutils extension monkeypatched the distutils
    first.
    css'|]}|jjd�s|VqdS(t
setuptoolsN(t
__module__t
startswith(t.0R((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pys	<genexpr>6st	distutilss(distutils has already been patched by %r(R	tnextRRtAssertionError(Rtexternal_basestbasetmsg((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyR/s
cCsWtjtj_tjdk}|r6tjtj_ntjdkp�d
tjko_dknp�dtjko~dknp�dtjko�dkn}|r�d	}|tjj	_
nt�t�x/tj
tjtjfD]}tj
j|_q�Wtjjtj_tjjtj_d
tjkrLtjjtjd
_nt�dS(Niiiii
iiishttps://upload.pypi.org/legacy/sdistutils.command.build_ext(iii(iii
(ii(iii(ii(iii(ii(iii(RtCommandRtcoretsystversion_infotfindalltfilelisttconfigt
PyPIRCCommandtDEFAULT_REPOSITORYt+_patch_distribution_metadata_write_pkg_filet+_patch_distribution_metadata_write_pkg_infotdisttcmdtDistributiont	extensiont	Extensiontmodulest#patch_for_msvc_specialized_compiler(thas_issue_12885tneeds_warehouset	warehousetmodule((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyt	patch_allAs(cCstjjtjj_dS(sDPatch write_pkg_file to also write Requires-Python/Requires-ExternalN(RR+twrite_pkg_fileRtDistributionMetadata(((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyR)kscCsFdtjd kodkn}|s-dStjjtjj_dS(s�
    Workaround issue #197 - Python 3 prior to 3.2.2 uses an environment-local
    encoding to save the pkg_info. Monkey-patch its write_pkg_info method to
    correct this undesirable behavior.
    iiN(i(iii(R"R#RR+twrite_pkg_infoRR8(tenvironment_local((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyR*rs#cCs9t||�}t|�jd|�t|||�dS(s�
    Patch func_name in target_mod with replacement

    Important - original must be resolved by name to avoid
    patching an already patched function.
    t	unpatchedN(tgetattrtvarst
setdefaulttsetattr(treplacementt
target_modt	func_nametoriginal((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyt
patch_func�scCs
t|d�S(NR;(R<(t	candidate((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyR�scs�td��tj�dkr"dS�fd�}tj|d�}tj|d�}y$t|d��t|d��Wntk
r�nXyt|d	��Wntk
r�nXyt|d
��Wntk
r�nXdS(s\
    Patch functions in distutils to use standalone Microsoft Visual C++
    compilers.
    ssetuptools.msvctWindowsNcsqd|krdnd}||jd�}t�|�}t|�}t||�sdt|��n|||fS(sT
        Prepare the parameters for patch_func to patch indicated function.
        tmsvc9tmsvc9_tmsvc14_t_(tlstripR<RthasattrtImportError(tmod_nameRBtrepl_prefixt	repl_nametrepltmod(tmsvc(s5/usr/lib/python2.7/site-packages/setuptools/monkey.pytpatch_params�ssdistutils.msvc9compilersdistutils._msvccompilertfind_vcvarsalltquery_vcvarsallt_get_vc_envtgen_lib_options(RRtsystemt	functoolstpartialRDRM(RTRGtmsvc14((RSs5/usr/lib/python2.7/site-packages/setuptools/monkey.pyR1�s&



(t__doc__R"tdistutils.filelistRRRRZt	importlibRRtsetuptools.externRRt__all__R	RRR6R)R*RDRR1(((s5/usr/lib/python2.7/site-packages/setuptools/monkey.pyt<module>s&					*				windows_support.pyc000064400000002372151733473750010572 0ustar00�
�fc@s4ddlZddlZd�Zed��ZdS(i����NcCstj�dkrd�S|S(NtWindowsc_sdS(N(tNone(targstkwargs((s>/usr/lib/python2.7/site-packages/setuptools/windows_support.pyt<lambda>t(tplatformtsystem(tfunc((s>/usr/lib/python2.7/site-packages/setuptools/windows_support.pytwindows_onlyscCsqtd�tjjj}tjjtjjf|_tjj	|_
d}|||�}|smtj��ndS(s�
    Set the hidden attribute on a file or directory.

    From http://stackoverflow.com/questions/19622133/

    `path` must be text.
    sctypes.wintypesiN(t
__import__tctypestwindlltkernel32tSetFileAttributesWtwintypestLPWSTRtDWORDtargtypestBOOLtrestypetWinError(tpathtSetFileAttributestFILE_ATTRIBUTE_HIDDENtret((s>/usr/lib/python2.7/site-packages/setuptools/windows_support.pyt	hide_files	
(RRR	R(((s>/usr/lib/python2.7/site-packages/setuptools/windows_support.pyt<module>s	depends.pyo000064400000014523151733473750006743 0ustar00�
�fc@s�ddlZddlZddlZddlmZddlmZmZmZmZddl	m
Z
dddd	gZddd
��YZdd�Zddd�Zdd
�Zd�Ze�dS(i����N(t
StrictVersion(t
PKG_DIRECTORYtPY_COMPILEDt	PY_SOURCEt	PY_FROZENi(tBytecodetRequiretfind_moduletget_module_constanttextract_constantcBsYeZdZdd	d	d�Zd�Zd�Zd	dd�Zd	d�Zd	d�Z	RS(
s7A prerequisite to building or installing a distributiontcCsn|dkr!|dk	r!t}n|dk	rQ||�}|dkrQd}qQn|jjt��|`dS(Nt__version__(tNoneRt__dict__tupdatetlocalstself(Rtnametrequested_versiontmodulethomepaget	attributetformat((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyt__init__s	cCs*|jdk	r#d|j|jfS|jS(s0Return full package/distribution name, w/versions%s-%sN(RRR(R((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyt	full_name scCs=|jdkp<|jdkp<t|�dko<||jkS(s%Is 'version' sufficiently up-to-date?tunknownN(RRRtstrR(Rtversion((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyt
version_ok&sRcCs�|jdkr]y6t|j|�\}}}|r@|j�n|SWq]tk
rYdSXnt|j|j||�}|dk	r�||k	r�|jdk	r�|j|�S|S(s�Get version number of installed module, 'None', or 'default'

        Search 'paths' for module.  If not found, return 'None'.  If found,
        return the extracted version attribute, or 'default' if no version
        attribute was specified, or the value cannot be determined without
        importing the module.  The version is formatted according to the
        requirement's version format (if any), unless it is 'None' or the
        supplied 'default'.
        N(RRRRtclosetImportErrorRR(Rtpathstdefaulttftptitv((s6/usr/lib/python2.7/site-packages/setuptools/depends.pytget_version+s

'
cCs|j|�dk	S(s/Return true if dependency is present on 'paths'N(R%R(RR((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyt
is_presentFscCs,|j|�}|dkrtS|j|�S(s>Return true if dependency is present and up-to-date on 'paths'N(R%RtFalseR(RRR((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyt
is_currentJsN(
t__name__t
__module__t__doc__RRRRR%R&R((((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyRs
		c
Cs�|jd�}x�|r�|jd�}tj||�\}}\}}}}	|tkrv|pgdg}|g}q|rtd||f��qqW|	S(s7Just like 'imp.find_module()', but with package supportt.iRsCan't find %r in %s(tsplittpoptimpRRR(
RRtpartstpartR!tpathtsuffixtmodetkindtinfo((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyRRs	(c
Csy%t||�\}}\}}}Wntk
r9dSXz�|tkrh|jd�tj|�}	n�|tkr�tj	|�}	no|t
kr�t|j�|d�}	nH|tj
kr�tj||||||f�nttj
||d�SWd|r|j�nXt|	||�S(s�Find 'module' by searching 'paths', and extract 'symbol'

    Return 'None' if 'module' does not exist on 'paths', or it does not define
    'symbol'.  If the module defines 'symbol' as a constant, return the
    constant.  Otherwise, return 'default'.itexecN(RRRRtreadtmarshaltloadRR/tget_frozen_objectRtcompiletsystmodulestload_moduletgetattrRR	(
RtsymbolR RR!R2R3R4R5tcode((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyRes$%

"cCs�||jkrdSt|j�j|�}d}d}d}|}xpt|�D]b}|j}	|j}
|	|kr�|j|
}qP|
|kr�|	|ks�|	|kr�|S|}qPWdS(sExtract the constant value of 'symbol' from 'code'

    If the name 'symbol' is bound to a constant value by the Python code
    object 'code', return that value.  If 'symbol' is bound to an expression,
    return 'default'.  Otherwise, return 'None'.

    Return value is based on the first assignment to 'symbol'.  'symbol' must
    be a global, or at least a non-"fast" local in the code block.  That is,
    only 'STORE_NAME' and 'STORE_GLOBAL' opcodes are checked, and 'symbol'
    must be present in 'code.co_names'.
    iZiaidN(tco_namesRtlisttindexRtopcodetargt	co_consts(RBRAR tname_idxt
STORE_NAMEtSTORE_GLOBALt
LOAD_CONSTtconstt	byte_codetopRG((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyR	�s		$cCsXtjjd�r&tjdkr&dSd}x%|D]}t�|=tj|�q3WdS(s�
    Patch the globals to remove the objects not available on some platforms.

    XXX it'd be better to test assertions about bytecode instead.
    tjavatcliNR	R(R	R(R=tplatformt
startswithtglobalst__all__tremove(tincompatibleR((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyt_update_globals�s"

((R=R/R9tdistutils.versionRRRRRt
py33compatRRURRRRR	RX(((s6/usr/lib/python2.7/site-packages/setuptools/depends.pyt<module>s"C"$	config.py000064400000037775151733473750006425 0ustar00from __future__ import absolute_import, unicode_literals
import io
import os
import sys
from collections import defaultdict
from functools import partial
from importlib import import_module

from distutils.errors import DistutilsOptionError, DistutilsFileError
from setuptools.extern.six import string_types


def read_configuration(
        filepath, find_others=False, ignore_option_errors=False):
    """Read given configuration file and returns options from it as a dict.

    :param str|unicode filepath: Path to configuration file
        to get options from.

    :param bool find_others: Whether to search for other configuration files
        which could be on in various places.

    :param bool ignore_option_errors: Whether to silently ignore
        options, values of which could not be resolved (e.g. due to exceptions
        in directives such as file:, attr:, etc.).
        If False exceptions are propagated as expected.

    :rtype: dict
    """
    from setuptools.dist import Distribution, _Distribution

    filepath = os.path.abspath(filepath)

    if not os.path.isfile(filepath):
        raise DistutilsFileError(
            'Configuration file %s does not exist.' % filepath)

    current_directory = os.getcwd()
    os.chdir(os.path.dirname(filepath))

    try:
        dist = Distribution()

        filenames = dist.find_config_files() if find_others else []
        if filepath not in filenames:
            filenames.append(filepath)

        _Distribution.parse_config_files(dist, filenames=filenames)

        handlers = parse_configuration(
            dist, dist.command_options,
            ignore_option_errors=ignore_option_errors)

    finally:
        os.chdir(current_directory)

    return configuration_to_dict(handlers)


def configuration_to_dict(handlers):
    """Returns configuration data gathered by given handlers as a dict.

    :param list[ConfigHandler] handlers: Handlers list,
        usually from parse_configuration()

    :rtype: dict
    """
    config_dict = defaultdict(dict)

    for handler in handlers:

        obj_alias = handler.section_prefix
        target_obj = handler.target_obj

        for option in handler.set_options:
            getter = getattr(target_obj, 'get_%s' % option, None)

            if getter is None:
                value = getattr(target_obj, option)

            else:
                value = getter()

            config_dict[obj_alias][option] = value

    return config_dict


def parse_configuration(
        distribution, command_options, ignore_option_errors=False):
    """Performs additional parsing of configuration options
    for a distribution.

    Returns a list of used option handlers.

    :param Distribution distribution:
    :param dict command_options:
    :param bool ignore_option_errors: Whether to silently ignore
        options, values of which could not be resolved (e.g. due to exceptions
        in directives such as file:, attr:, etc.).
        If False exceptions are propagated as expected.
    :rtype: list
    """
    meta = ConfigMetadataHandler(
        distribution.metadata, command_options, ignore_option_errors)
    meta.parse()

    options = ConfigOptionsHandler(
        distribution, command_options, ignore_option_errors)
    options.parse()

    return meta, options


class ConfigHandler(object):
    """Handles metadata supplied in configuration files."""

    section_prefix = None
    """Prefix for config sections handled by this handler.
    Must be provided by class heirs.

    """

    aliases = {}
    """Options aliases.
    For compatibility with various packages. E.g.: d2to1 and pbr.
    Note: `-` in keys is replaced with `_` by config parser.

    """

    def __init__(self, target_obj, options, ignore_option_errors=False):
        sections = {}

        section_prefix = self.section_prefix
        for section_name, section_options in options.items():
            if not section_name.startswith(section_prefix):
                continue

            section_name = section_name.replace(section_prefix, '').strip('.')
            sections[section_name] = section_options

        self.ignore_option_errors = ignore_option_errors
        self.target_obj = target_obj
        self.sections = sections
        self.set_options = []

    @property
    def parsers(self):
        """Metadata item name to parser function mapping."""
        raise NotImplementedError(
            '%s must provide .parsers property' % self.__class__.__name__)

    def __setitem__(self, option_name, value):
        unknown = tuple()
        target_obj = self.target_obj

        # Translate alias into real name.
        option_name = self.aliases.get(option_name, option_name)

        current_value = getattr(target_obj, option_name, unknown)

        if current_value is unknown:
            raise KeyError(option_name)

        if current_value:
            # Already inhabited. Skipping.
            return

        skip_option = False
        parser = self.parsers.get(option_name)
        if parser:
            try:
                value = parser(value)

            except Exception:
                skip_option = True
                if not self.ignore_option_errors:
                    raise

        if skip_option:
            return

        setter = getattr(target_obj, 'set_%s' % option_name, None)
        if setter is None:
            setattr(target_obj, option_name, value)
        else:
            setter(value)

        self.set_options.append(option_name)

    @classmethod
    def _parse_list(cls, value, separator=','):
        """Represents value as a list.

        Value is split either by separator (defaults to comma) or by lines.

        :param value:
        :param separator: List items separator character.
        :rtype: list
        """
        if isinstance(value, list):  # _get_parser_compound case
            return value

        if '\n' in value:
            value = value.splitlines()
        else:
            value = value.split(separator)

        return [chunk.strip() for chunk in value if chunk.strip()]

    @classmethod
    def _parse_dict(cls, value):
        """Represents value as a dict.

        :param value:
        :rtype: dict
        """
        separator = '='
        result = {}
        for line in cls._parse_list(value):
            key, sep, val = line.partition(separator)
            if sep != separator:
                raise DistutilsOptionError(
                    'Unable to parse option value to dict: %s' % value)
            result[key.strip()] = val.strip()

        return result

    @classmethod
    def _parse_bool(cls, value):
        """Represents value as boolean.

        :param value:
        :rtype: bool
        """
        value = value.lower()
        return value in ('1', 'true', 'yes')

    @classmethod
    def _parse_file(cls, value):
        """Represents value as a string, allowing including text
        from nearest files using `file:` directive.

        Directive is sandboxed and won't reach anything outside
        directory with setup.py.

        Examples:
            file: LICENSE
            file: README.rst, CHANGELOG.md, src/file.txt

        :param str value:
        :rtype: str
        """
        include_directive = 'file:'

        if not isinstance(value, string_types):
            return value

        if not value.startswith(include_directive):
            return value

        spec = value[len(include_directive):]
        filepaths = (os.path.abspath(path.strip()) for path in spec.split(','))
        return '\n'.join(
            cls._read_file(path)
            for path in filepaths
            if (cls._assert_local(path) or True)
            and os.path.isfile(path)
        )

    @staticmethod
    def _assert_local(filepath):
        if not filepath.startswith(os.getcwd()):
            raise DistutilsOptionError(
                '`file:` directive can not access %s' % filepath)

    @staticmethod
    def _read_file(filepath):
        with io.open(filepath, encoding='utf-8') as f:
            return f.read()

    @classmethod
    def _parse_attr(cls, value):
        """Represents value as a module attribute.

        Examples:
            attr: package.attr
            attr: package.module.attr

        :param str value:
        :rtype: str
        """
        attr_directive = 'attr:'
        if not value.startswith(attr_directive):
            return value

        attrs_path = value.replace(attr_directive, '').strip().split('.')
        attr_name = attrs_path.pop()

        module_name = '.'.join(attrs_path)
        module_name = module_name or '__init__'

        sys.path.insert(0, os.getcwd())
        try:
            module = import_module(module_name)
            value = getattr(module, attr_name)

        finally:
            sys.path = sys.path[1:]

        return value

    @classmethod
    def _get_parser_compound(cls, *parse_methods):
        """Returns parser function to represents value as a list.

        Parses a value applying given methods one after another.

        :param parse_methods:
        :rtype: callable
        """
        def parse(value):
            parsed = value

            for method in parse_methods:
                parsed = method(parsed)

            return parsed

        return parse

    @classmethod
    def _parse_section_to_dict(cls, section_options, values_parser=None):
        """Parses section options into a dictionary.

        Optionally applies a given parser to values.

        :param dict section_options:
        :param callable values_parser:
        :rtype: dict
        """
        value = {}
        values_parser = values_parser or (lambda val: val)
        for key, (_, val) in section_options.items():
            value[key] = values_parser(val)
        return value

    def parse_section(self, section_options):
        """Parses configuration file section.

        :param dict section_options:
        """
        for (name, (_, value)) in section_options.items():
            try:
                self[name] = value

            except KeyError:
                pass  # Keep silent for a new option may appear anytime.

    def parse(self):
        """Parses configuration file items from one
        or more related sections.

        """
        for section_name, section_options in self.sections.items():

            method_postfix = ''
            if section_name:  # [section.option] variant
                method_postfix = '_%s' % section_name

            section_parser_method = getattr(
                self,
                # Dots in section names are tranlsated into dunderscores.
                ('parse_section%s' % method_postfix).replace('.', '__'),
                None)

            if section_parser_method is None:
                raise DistutilsOptionError(
                    'Unsupported distribution option section: [%s.%s]' % (
                        self.section_prefix, section_name))

            section_parser_method(section_options)


class ConfigMetadataHandler(ConfigHandler):

    section_prefix = 'metadata'

    aliases = {
        'home_page': 'url',
        'summary': 'description',
        'classifier': 'classifiers',
        'platform': 'platforms',
    }

    strict_mode = False
    """We need to keep it loose, to be partially compatible with
    `pbr` and `d2to1` packages which also uses `metadata` section.

    """

    @property
    def parsers(self):
        """Metadata item name to parser function mapping."""
        parse_list = self._parse_list
        parse_file = self._parse_file
        parse_dict = self._parse_dict

        return {
            'platforms': parse_list,
            'keywords': parse_list,
            'provides': parse_list,
            'requires': parse_list,
            'obsoletes': parse_list,
            'classifiers': self._get_parser_compound(parse_file, parse_list),
            'license': parse_file,
            'description': parse_file,
            'long_description': parse_file,
            'version': self._parse_version,
            'project_urls': parse_dict,
        }

    def _parse_version(self, value):
        """Parses `version` option value.

        :param value:
        :rtype: str

        """
        version = self._parse_attr(value)

        if callable(version):
            version = version()

        if not isinstance(version, string_types):
            if hasattr(version, '__iter__'):
                version = '.'.join(map(str, version))
            else:
                version = '%s' % version

        return version


class ConfigOptionsHandler(ConfigHandler):

    section_prefix = 'options'

    @property
    def parsers(self):
        """Metadata item name to parser function mapping."""
        parse_list = self._parse_list
        parse_list_semicolon = partial(self._parse_list, separator=';')
        parse_bool = self._parse_bool
        parse_dict = self._parse_dict

        return {
            'zip_safe': parse_bool,
            'use_2to3': parse_bool,
            'include_package_data': parse_bool,
            'package_dir': parse_dict,
            'use_2to3_fixers': parse_list,
            'use_2to3_exclude_fixers': parse_list,
            'convert_2to3_doctests': parse_list,
            'scripts': parse_list,
            'eager_resources': parse_list,
            'dependency_links': parse_list,
            'namespace_packages': parse_list,
            'install_requires': parse_list_semicolon,
            'setup_requires': parse_list_semicolon,
            'tests_require': parse_list_semicolon,
            'packages': self._parse_packages,
            'entry_points': self._parse_file,
            'py_modules': parse_list,
        }

    def _parse_packages(self, value):
        """Parses `packages` option value.

        :param value:
        :rtype: list
        """
        find_directive = 'find:'

        if not value.startswith(find_directive):
            return self._parse_list(value)

        # Read function arguments from a dedicated section.
        find_kwargs = self.parse_section_packages__find(
            self.sections.get('packages.find', {}))

        from setuptools import find_packages

        return find_packages(**find_kwargs)

    def parse_section_packages__find(self, section_options):
        """Parses `packages.find` configuration file section.

        To be used in conjunction with _parse_packages().

        :param dict section_options:
        """
        section_data = self._parse_section_to_dict(
            section_options, self._parse_list)

        valid_keys = ['where', 'include', 'exclude']

        find_kwargs = dict(
            [(k, v) for k, v in section_data.items() if k in valid_keys and v])

        where = find_kwargs.get('where')
        if where is not None:
            find_kwargs['where'] = where[0]  # cast list to single val

        return find_kwargs

    def parse_section_entry_points(self, section_options):
        """Parses `entry_points` configuration file section.

        :param dict section_options:
        """
        parsed = self._parse_section_to_dict(section_options, self._parse_list)
        self['entry_points'] = parsed

    def _parse_package_data(self, section_options):
        parsed = self._parse_section_to_dict(section_options, self._parse_list)

        root = parsed.get('*')
        if root:
            parsed[''] = root
            del parsed['*']

        return parsed

    def parse_section_package_data(self, section_options):
        """Parses `package_data` configuration file section.

        :param dict section_options:
        """
        self['package_data'] = self._parse_package_data(section_options)

    def parse_section_exclude_package_data(self, section_options):
        """Parses `exclude_package_data` configuration file section.

        :param dict section_options:
        """
        self['exclude_package_data'] = self._parse_package_data(
            section_options)

    def parse_section_extras_require(self, section_options):
        """Parses `extras_require` configuration file section.

        :param dict section_options:
        """
        parse_list = partial(self._parse_list, separator=';')
        self['extras_require'] = self._parse_section_to_dict(
            section_options, parse_list)
sandbox.py000064400000033704151733473760006603 0ustar00import os
import sys
import tempfile
import operator
import functools
import itertools
import re
import contextlib
import pickle
import textwrap

from setuptools.extern import six
from setuptools.extern.six.moves import builtins, map

import pkg_resources.py31compat

if sys.platform.startswith('java'):
    import org.python.modules.posix.PosixModule as _os
else:
    _os = sys.modules[os.name]
try:
    _file = file
except NameError:
    _file = None
_open = open
from distutils.errors import DistutilsError
from pkg_resources import working_set


__all__ = [
    "AbstractSandbox", "DirectorySandbox", "SandboxViolation", "run_setup",
]


def _execfile(filename, globals, locals=None):
    """
    Python 3 implementation of execfile.
    """
    mode = 'rb'
    with open(filename, mode) as stream:
        script = stream.read()
    if locals is None:
        locals = globals
    code = compile(script, filename, 'exec')
    exec(code, globals, locals)


@contextlib.contextmanager
def save_argv(repl=None):
    saved = sys.argv[:]
    if repl is not None:
        sys.argv[:] = repl
    try:
        yield saved
    finally:
        sys.argv[:] = saved


@contextlib.contextmanager
def save_path():
    saved = sys.path[:]
    try:
        yield saved
    finally:
        sys.path[:] = saved


@contextlib.contextmanager
def override_temp(replacement):
    """
    Monkey-patch tempfile.tempdir with replacement, ensuring it exists
    """
    pkg_resources.py31compat.makedirs(replacement, exist_ok=True)

    saved = tempfile.tempdir

    tempfile.tempdir = replacement

    try:
        yield
    finally:
        tempfile.tempdir = saved


@contextlib.contextmanager
def pushd(target):
    saved = os.getcwd()
    os.chdir(target)
    try:
        yield saved
    finally:
        os.chdir(saved)


class UnpickleableException(Exception):
    """
    An exception representing another Exception that could not be pickled.
    """

    @staticmethod
    def dump(type, exc):
        """
        Always return a dumped (pickled) type and exc. If exc can't be pickled,
        wrap it in UnpickleableException first.
        """
        try:
            return pickle.dumps(type), pickle.dumps(exc)
        except Exception:
            # get UnpickleableException inside the sandbox
            from setuptools.sandbox import UnpickleableException as cls
            return cls.dump(cls, cls(repr(exc)))


class ExceptionSaver:
    """
    A Context Manager that will save an exception, serialized, and restore it
    later.
    """

    def __enter__(self):
        return self

    def __exit__(self, type, exc, tb):
        if not exc:
            return

        # dump the exception
        self._saved = UnpickleableException.dump(type, exc)
        self._tb = tb

        # suppress the exception
        return True

    def resume(self):
        "restore and re-raise any exception"

        if '_saved' not in vars(self):
            return

        type, exc = map(pickle.loads, self._saved)
        six.reraise(type, exc, self._tb)


@contextlib.contextmanager
def save_modules():
    """
    Context in which imported modules are saved.

    Translates exceptions internal to the context into the equivalent exception
    outside the context.
    """
    saved = sys.modules.copy()
    with ExceptionSaver() as saved_exc:
        yield saved

    sys.modules.update(saved)
    # remove any modules imported since
    del_modules = (
        mod_name for mod_name in sys.modules
        if mod_name not in saved
        # exclude any encodings modules. See #285
        and not mod_name.startswith('encodings.')
    )
    _clear_modules(del_modules)

    saved_exc.resume()


def _clear_modules(module_names):
    for mod_name in list(module_names):
        del sys.modules[mod_name]


@contextlib.contextmanager
def save_pkg_resources_state():
    saved = pkg_resources.__getstate__()
    try:
        yield saved
    finally:
        pkg_resources.__setstate__(saved)


@contextlib.contextmanager
def setup_context(setup_dir):
    temp_dir = os.path.join(setup_dir, 'temp')
    with save_pkg_resources_state():
        with save_modules():
            hide_setuptools()
            with save_path():
                with save_argv():
                    with override_temp(temp_dir):
                        with pushd(setup_dir):
                            # ensure setuptools commands are available
                            __import__('setuptools')
                            yield


def _needs_hiding(mod_name):
    """
    >>> _needs_hiding('setuptools')
    True
    >>> _needs_hiding('pkg_resources')
    True
    >>> _needs_hiding('setuptools_plugin')
    False
    >>> _needs_hiding('setuptools.__init__')
    True
    >>> _needs_hiding('distutils')
    True
    >>> _needs_hiding('os')
    False
    >>> _needs_hiding('Cython')
    True
    """
    pattern = re.compile(r'(setuptools|pkg_resources|distutils|Cython)(\.|$)')
    return bool(pattern.match(mod_name))


def hide_setuptools():
    """
    Remove references to setuptools' modules from sys.modules to allow the
    invocation to import the most appropriate setuptools. This technique is
    necessary to avoid issues such as #315 where setuptools upgrading itself
    would fail to find a function declared in the metadata.
    """
    modules = filter(_needs_hiding, sys.modules)
    _clear_modules(modules)


def run_setup(setup_script, args):
    """Run a distutils setup script, sandboxed in its directory"""
    setup_dir = os.path.abspath(os.path.dirname(setup_script))
    with setup_context(setup_dir):
        try:
            sys.argv[:] = [setup_script] + list(args)
            sys.path.insert(0, setup_dir)
            # reset to include setup dir, w/clean callback list
            working_set.__init__()
            working_set.callbacks.append(lambda dist: dist.activate())

            # __file__ should be a byte string on Python 2 (#712)
            dunder_file = (
                setup_script
                if isinstance(setup_script, str) else
                setup_script.encode(sys.getfilesystemencoding())
            )

            with DirectorySandbox(setup_dir):
                ns = dict(__file__=dunder_file, __name__='__main__')
                _execfile(setup_script, ns)
        except SystemExit as v:
            if v.args and v.args[0]:
                raise
            # Normal exit, just return


class AbstractSandbox:
    """Wrap 'os' module and 'open()' builtin for virtualizing setup scripts"""

    _active = False

    def __init__(self):
        self._attrs = [
            name for name in dir(_os)
            if not name.startswith('_') and hasattr(self, name)
        ]

    def _copy(self, source):
        for name in self._attrs:
            setattr(os, name, getattr(source, name))

    def __enter__(self):
        self._copy(self)
        if _file:
            builtins.file = self._file
        builtins.open = self._open
        self._active = True

    def __exit__(self, exc_type, exc_value, traceback):
        self._active = False
        if _file:
            builtins.file = _file
        builtins.open = _open
        self._copy(_os)

    def run(self, func):
        """Run 'func' under os sandboxing"""
        with self:
            return func()

    def _mk_dual_path_wrapper(name):
        original = getattr(_os, name)

        def wrap(self, src, dst, *args, **kw):
            if self._active:
                src, dst = self._remap_pair(name, src, dst, *args, **kw)
            return original(src, dst, *args, **kw)

        return wrap

    for name in ["rename", "link", "symlink"]:
        if hasattr(_os, name):
            locals()[name] = _mk_dual_path_wrapper(name)

    def _mk_single_path_wrapper(name, original=None):
        original = original or getattr(_os, name)

        def wrap(self, path, *args, **kw):
            if self._active:
                path = self._remap_input(name, path, *args, **kw)
            return original(path, *args, **kw)

        return wrap

    if _file:
        _file = _mk_single_path_wrapper('file', _file)
    _open = _mk_single_path_wrapper('open', _open)
    for name in [
        "stat", "listdir", "chdir", "open", "chmod", "chown", "mkdir",
        "remove", "unlink", "rmdir", "utime", "lchown", "chroot", "lstat",
        "startfile", "mkfifo", "mknod", "pathconf", "access"
    ]:
        if hasattr(_os, name):
            locals()[name] = _mk_single_path_wrapper(name)

    def _mk_single_with_return(name):
        original = getattr(_os, name)

        def wrap(self, path, *args, **kw):
            if self._active:
                path = self._remap_input(name, path, *args, **kw)
                return self._remap_output(name, original(path, *args, **kw))
            return original(path, *args, **kw)

        return wrap

    for name in ['readlink', 'tempnam']:
        if hasattr(_os, name):
            locals()[name] = _mk_single_with_return(name)

    def _mk_query(name):
        original = getattr(_os, name)

        def wrap(self, *args, **kw):
            retval = original(*args, **kw)
            if self._active:
                return self._remap_output(name, retval)
            return retval

        return wrap

    for name in ['getcwd', 'tmpnam']:
        if hasattr(_os, name):
            locals()[name] = _mk_query(name)

    def _validate_path(self, path):
        """Called to remap or validate any path, whether input or output"""
        return path

    def _remap_input(self, operation, path, *args, **kw):
        """Called for path inputs"""
        return self._validate_path(path)

    def _remap_output(self, operation, path):
        """Called for path outputs"""
        return self._validate_path(path)

    def _remap_pair(self, operation, src, dst, *args, **kw):
        """Called for path pairs like rename, link, and symlink operations"""
        return (
            self._remap_input(operation + '-from', src, *args, **kw),
            self._remap_input(operation + '-to', dst, *args, **kw)
        )


if hasattr(os, 'devnull'):
    _EXCEPTIONS = [os.devnull,]
else:
    _EXCEPTIONS = []


class DirectorySandbox(AbstractSandbox):
    """Restrict operations to a single subdirectory - pseudo-chroot"""

    write_ops = dict.fromkeys([
        "open", "chmod", "chown", "mkdir", "remove", "unlink", "rmdir",
        "utime", "lchown", "chroot", "mkfifo", "mknod", "tempnam",
    ])

    _exception_patterns = [
        # Allow lib2to3 to attempt to save a pickled grammar object (#121)
        r'.*lib2to3.*\.pickle$',
    ]
    "exempt writing to paths that match the pattern"

    def __init__(self, sandbox, exceptions=_EXCEPTIONS):
        self._sandbox = os.path.normcase(os.path.realpath(sandbox))
        self._prefix = os.path.join(self._sandbox, '')
        self._exceptions = [
            os.path.normcase(os.path.realpath(path))
            for path in exceptions
        ]
        AbstractSandbox.__init__(self)

    def _violation(self, operation, *args, **kw):
        from setuptools.sandbox import SandboxViolation
        raise SandboxViolation(operation, args, kw)

    if _file:

        def _file(self, path, mode='r', *args, **kw):
            if mode not in ('r', 'rt', 'rb', 'rU', 'U') and not self._ok(path):
                self._violation("file", path, mode, *args, **kw)
            return _file(path, mode, *args, **kw)

    def _open(self, path, mode='r', *args, **kw):
        if mode not in ('r', 'rt', 'rb', 'rU', 'U') and not self._ok(path):
            self._violation("open", path, mode, *args, **kw)
        return _open(path, mode, *args, **kw)

    def tmpnam(self):
        self._violation("tmpnam")

    def _ok(self, path):
        active = self._active
        try:
            self._active = False
            realpath = os.path.normcase(os.path.realpath(path))
            return (
                self._exempted(realpath)
                or realpath == self._sandbox
                or realpath.startswith(self._prefix)
            )
        finally:
            self._active = active

    def _exempted(self, filepath):
        start_matches = (
            filepath.startswith(exception)
            for exception in self._exceptions
        )
        pattern_matches = (
            re.match(pattern, filepath)
            for pattern in self._exception_patterns
        )
        candidates = itertools.chain(start_matches, pattern_matches)
        return any(candidates)

    def _remap_input(self, operation, path, *args, **kw):
        """Called for path inputs"""
        if operation in self.write_ops and not self._ok(path):
            self._violation(operation, os.path.realpath(path), *args, **kw)
        return path

    def _remap_pair(self, operation, src, dst, *args, **kw):
        """Called for path pairs like rename, link, and symlink operations"""
        if not self._ok(src) or not self._ok(dst):
            self._violation(operation, src, dst, *args, **kw)
        return (src, dst)

    def open(self, file, flags, mode=0o777, *args, **kw):
        """Called for low-level os.open()"""
        if flags & WRITE_FLAGS and not self._ok(file):
            self._violation("os.open", file, flags, mode, *args, **kw)
        return _os.open(file, flags, mode, *args, **kw)


WRITE_FLAGS = functools.reduce(
    operator.or_, [getattr(_os, a, 0) for a in
        "O_WRONLY O_RDWR O_APPEND O_CREAT O_TRUNC O_TEMPORARY".split()]
)


class SandboxViolation(DistutilsError):
    """A setup script attempted to modify the filesystem outside the sandbox"""

    tmpl = textwrap.dedent("""
        SandboxViolation: {cmd}{args!r} {kwargs}

        The package setup script has attempted to modify files on your system
        that are not within the EasyInstall build area, and has been aborted.

        This package cannot be safely installed by EasyInstall, and may not
        support alternate installation locations even if you run its setup
        script by hand.  Please inform the package's author and the EasyInstall
        maintainers to find out if a fix or workaround is available.
        """).lstrip()

    def __str__(self):
        cmd, args, kwargs = self.args
        return self.tmpl.format(**locals())
py36compat.pyc000064400000005456151733473760007320 0ustar00�
�fc@s�ddlZddlmZddlmZddlmZdd
d��YZejdkrtddd��YZne	r�dd
d	��YZndS(i����N(tDistutilsOptionError(t	strtobool(tDEBUGtDistribution_parse_config_filescBseZdZdd�ZRS(s�
    Mix-in providing forward-compatibility for functionality to be
    included by default on Python 3.7.

    Do not edit the code in this class except to update functionality
    as implemented in distutils.
    c
CsHddlm}tjtjkrRddddddd	d
ddd
ddg
}ng}t|�}|dkr|j�}ntr�|j	d�n|dd�}x�|D]�}tr�|j	d|�n|j
|�x�|j�D]�}|j|�}|j
|�}x]|D]U}	|	dkr|	|kr|j||	�}
|	jdd�}	||
f||	<qqWq�W|j�q�Wd|jkrDx�|jdj�D]�\}	\}}
|jj|	�}yY|r�t||t|
��n5|	dkr
t||	t|
��nt||	|
�Wq�tk
r<}
t|
��q�Xq�WndS(Ni����(tConfigParsersinstall-basesinstall-platbasesinstall-libsinstall-platlibsinstall-purelibsinstall-headerssinstall-scriptssinstall-datatprefixsexec-prefixthometusertroots"Distribution.parse_config_files():t
interpolations  reading %st__name__t-t_tglobaltverbosetdry_run(RR(tconfigparserRtsysRtbase_prefixt	frozensettNonetfind_config_filesRtannouncetreadtsectionstoptionstget_option_dicttgettreplacet__init__tcommand_optionstitemstnegative_opttsetattrRt
ValueErrorR(tselft	filenamesRtignore_optionstparsertfilenametsectionRtopt_dicttopttvaltsrctaliastmsg((s9/usr/lib/python2.7/site-packages/setuptools/py36compat.pytparse_config_filessJ		


&N(R
t
__module__t__doc__RR/(((s9/usr/lib/python2.7/site-packages/setuptools/py36compat.pyRsicBseZRS((R
R0(((s9/usr/lib/python2.7/site-packages/setuptools/py36compat.pyRJscBseZRS((R
R0(((s9/usr/lib/python2.7/site-packages/setuptools/py36compat.pyRQs((i(((
Rtdistutils.errorsRtdistutils.utilRtdistutils.debugRRtversion_infotFalse(((s9/usr/lib/python2.7/site-packages/setuptools/py36compat.pyt<module>sAunicode_utils.py000064400000001744151733473760010012 0ustar00import unicodedata
import sys

from setuptools.extern import six


# HFS Plus uses decomposed UTF-8
def decompose(path):
    if isinstance(path, six.text_type):
        return unicodedata.normalize('NFD', path)
    try:
        path = path.decode('utf-8')
        path = unicodedata.normalize('NFD', path)
        path = path.encode('utf-8')
    except UnicodeError:
        pass  # Not UTF-8
    return path


def filesys_decode(path):
    """
    Ensure that the given path is decoded,
    NONE when no expected encoding works
    """

    if isinstance(path, six.text_type):
        return path

    fs_enc = sys.getfilesystemencoding() or 'utf-8'
    candidates = fs_enc, 'utf-8'

    for enc in candidates:
        try:
            return path.decode(enc)
        except UnicodeDecodeError:
            continue


def try_encode(string, enc):
    "turn unicode encoding into a functional routine"
    try:
        return string.encode(enc)
    except UnicodeEncodeError:
        return None
__init__.pyo000064400000016711151733473760007062 0ustar00�
�fc@s�dZddlZddlZddlZddlZddlmZddlm	Z	ddl
mZmZddl
ZddlmZddlmZmZddlmZd	d
lmZddd
ddddgZejjZdZeZdgZde fd��YZ!de!fd��YZ"e!j#Z$d�Z%d�Z&ej'j&je&_ej(ej'j)�Z*de*fd��YZ)d�Z+ej,d�Z-ej.�dS(s@Extensions to the 'distutils' for large or complex distributionsi����N(tconvert_path(tfnmatchcase(tfiltertmap(t	Extension(tDistributiontFeature(tRequirei(tmonkeytsetupRRtCommandRRt
find_packagess
lib2to3.fixest
PackageFindercBsSeZdZedddd��Zed��Zed��Zed��ZRS(	sI
    Generate a list of all Python packages found within a directory
    t.t*cCs7t|jt|�|jdd|�|j|���S(s	Return a list all Python packages found within directory 'where'

        'where' is the root directory which will be searched for packages.  It
        should be supplied as a "cross-platform" (i.e. URL-style) path; it will
        be converted to the appropriate local path syntax.

        'exclude' is a sequence of package names to exclude; '*' can be used
        as a wildcard in the names, such that 'foo.*' will exclude all
        subpackages of 'foo' (but not 'foo' itself).

        'include' is a sequence of package names to include.  If it's
        specified, only the named packages will be included.  If it's not
        specified, all found packages will be included.  'include' can contain
        shell style wildcard patterns just like 'exclude'.
        tez_setups*__pycache__(tlistt_find_packages_iterRt
_build_filter(tclstwheretexcludetinclude((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pytfind's		ccs�x�tj|dt�D]�\}}}|}g|(x�|D]�}tjj||�}	tjj|	|�}
|
jtjjd�}d|ks:|j|	�r�q:n||�r�||�r�|Vn|j	|�q:WqWdS(sy
        All the packages found in 'where' that pass the 'include' filter, but
        not the 'exclude' filter.
        tfollowlinksR
N(
tostwalktTruetpathtjointrelpathtreplacetsept_looks_like_packagetappend(RRRRtroottdirstfilestall_dirstdirt	full_pathtrel_pathtpackage((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyR>s%
cCstjjtjj|d��S(s%Does a directory look like a package?s__init__.py(RRtisfileR(R((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyR!Zscs
�fd�S(s�
        Given a list of patterns, return a callable that will be true only if
        the input matches at least one of the patterns.
        cst�fd��D��S(Nc3s!|]}t�d|�VqdS(tpatN(R(t.0R,(tname(s7/usr/lib/python2.7/site-packages/setuptools/__init__.pys	<genexpr>es(tany(R.(tpatterns(R.s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyt<lambda>et((R0((R0s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyR_s((R(	t__name__t
__module__t__doc__tclassmethodRRtstaticmethodR!R(((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyR"stPEP420PackageFindercBseZed��ZRS(cCstS(N(R(R((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyR!is(R3R4R7R!(((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyR8hscCsXtjjtd�|j�D���}|jdt�|jrT|j|j�ndS(Ncss-|]#\}}|dkr||fVqdS(tdependency_linkstsetup_requiresN(R9R:((R-tktv((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pys	<genexpr>us	tignore_option_errors(	t	distutilstcoreRtdicttitemstparse_config_filesRR:tfetch_build_eggs(tattrstdist((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyt_install_setup_requiresqs
	cKst|�tjj|�S(N(RFR>R?R	(RD((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyR	~s
cBs,eZejZeZd�Zdd�ZRS(cKs'tj||�t|�j|�dS(sj
        Construct the command for dist, updating
        vars(self) with any keyword parameters.
        N(t_Commandt__init__tvarstupdate(tselfREtkw((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyRH�sicKs,tj|||�}t|�j|�|S(N(RGtreinitialize_commandRIRJ(RKtcommandtreinit_subcommandsRLtcmd((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyRM�s(R3R4RGR5tFalsetcommand_consumes_argumentsRHRM(((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyR
�s		cCs2d�tj|dt�D�}ttjj|�S(s%
    Find all files under 'path'
    css:|]0\}}}|D]}tjj||�VqqdS(N(RRR(R-tbaseR$R%tfile((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pys	<genexpr>�sR(RRRRRR+(Rtresults((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyt_find_all_simple�scCsRt|�}|tjkrHtjtjjd|�}t||�}nt|�S(s�
    Find all files under 'dir' and return the list of full filenames.
    Unless dir is '.', return full filenames with dir prepended.
    tstart(	RVRtcurdirt	functoolstpartialRRRR(R'R%tmake_rel((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pytfindall�s
(/R5RRYtdistutils.coreR>tdistutils.filelisttdistutils.utilRtfnmatchRtsetuptools.extern.six.movesRRtsetuptools.versiont
setuptoolstsetuptools.extensionRtsetuptools.distRRtsetuptools.dependsRR2Rt__all__tversiont__version__tNonetbootstrap_install_fromRtrun_2to3_on_docteststlib2to3_fixer_packagestobjectRR8RRRFR	R?t
get_unpatchedR
RGRVRXR\t	patch_all(((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyt<module>s:		F		
		version.py000064400000000220151733473760006615 0ustar00import pkg_resources

try:
    __version__ = pkg_resources.get_distribution('setuptools').version
except Exception:
    __version__ = 'unknown'
sandbox.pyo000064400000044724151733473760006766 0ustar00�
�fc@s�ddlZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZddlm
Z
mZddlZejjd�r�ddljjjjZnejejZy
eZWnek
r
dZnXeZddl m!Z!ddlm"Z"ddd	d
gZ#dd�Z$ej%dd��Z&ej%d
��Z'ej%d��Z(ej%d��Z)de*fd��YZ+dd!d��YZ,ej%d��Z-d�Z.ej%d��Z/ej%d��Z0d�Z1d�Z2d�Z3dd"d��YZ4e5ed�rNej6gZ7ngZ7de4fd��YZ8ej9ej:gdj;�D]Z<e=ee<d�^q��Z>d	e!fd ��YZ?dS(#i����N(tsix(tbuiltinstmaptjava(tDistutilsError(tworking_settAbstractSandboxtDirectorySandboxtSandboxViolationt	run_setupcBs_d}e||��}|j�}WdQX|dkr?|}ne||d�}|||UdS(s.
    Python 3 implementation of execfile.
    trbNtexec(topentreadtNonetcompile(tfilenametglobalstlocalstmodetstreamtscripttcode((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt	_execfile#s	ccs>tj}|dk	r#|tj(nz	|VWd|tj(XdS(N(tsystargvR(trepltsaved((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt	save_argv0s

	ccs%tj}z	|VWd|tj(XdS(N(Rtpath(R((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt	save_path;s
	ccsBtjj|dt�tj}|t_z	dVWd|t_XdS(sL
    Monkey-patch tempfile.tempdir with replacement, ensuring it exists
    texist_okN(t
pkg_resourcest
py31compattmakedirstTruettempfilettempdir(treplacementR((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt
override_tempDs			ccs7tj�}tj|�z	|VWdtj|�XdS(N(tostgetcwdtchdir(ttargetR((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pytpushdUs

	tUnpickleableExceptioncBseZdZed��ZRS(sP
    An exception representing another Exception that could not be pickled.
    cCsay tj|�tj|�fSWn:tk
r\ddlm}|j||t|���SXdS(s�
        Always return a dumped (pickled) type and exc. If exc can't be pickled,
        wrap it in UnpickleableException first.
        i����(R-N(tpickletdumpst	Exceptiontsetuptools.sandboxR-tdumptrepr(ttypetexctcls((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR2ds
 
(t__name__t
__module__t__doc__tstaticmethodR2(((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR-_stExceptionSavercBs)eZdZd�Zd�Zd�ZRS(s^
    A Context Manager that will save an exception, serialized, and restore it
    later.
    cCs|S(N((tself((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt	__enter__xscCs,|s
dStj||�|_||_tS(N(R-R2t_savedt_tbR#(R<R4R5ttb((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt__exit__{s
	cCsKdt|�krdSttj|j�\}}tj|||j�dS(s"restore and re-raise any exceptionR>N(tvarsRR.tloadsR>RtreraiseR?(R<R4R5((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pytresume�s(R7R8R9R=RARE(((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR;rs		c#sgtjj��t��}�VWdQXtjj���fd�tjD�}t|�|j�dS(s�
    Context in which imported modules are saved.

    Translates exceptions internal to the context into the equivalent exception
    outside the context.
    Nc3s1|]'}|�kr|jd�r|VqdS(s
encodings.N(t
startswith(t.0tmod_name(R(s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pys	<genexpr>�s(RtmodulestcopyR;tupdatet_clear_modulesRE(t	saved_exctdel_modules((Rs6/usr/lib/python2.7/site-packages/setuptools/sandbox.pytsave_modules�s
cCs%xt|�D]}tj|=q
WdS(N(tlistRRI(tmodule_namesRH((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyRL�sccs*tj�}z	|VWdtj|�XdS(N(R t__getstate__t__setstate__(R((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pytsave_pkg_resources_state�s	ccs�tjj|d�}t��qt��at�t��Jt��:t|��'t	|��t
d�dVWdQXWdQXWdQXWdQXWdQXWdQXdS(Nttempt
setuptools(R(RtjoinRTROthide_setuptoolsRRR'R,t
__import__(t	setup_dirttemp_dir((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt
setup_context�s






cCs"tjd�}t|j|��S(sH
    >>> _needs_hiding('setuptools')
    True
    >>> _needs_hiding('pkg_resources')
    True
    >>> _needs_hiding('setuptools_plugin')
    False
    >>> _needs_hiding('setuptools.__init__')
    True
    >>> _needs_hiding('distutils')
    True
    >>> _needs_hiding('os')
    False
    >>> _needs_hiding('Cython')
    True
    s1(setuptools|pkg_resources|distutils|Cython)(\.|$)(treRtbooltmatch(RHtpattern((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt
_needs_hiding�scCs tttj�}t|�dS(s%
    Remove references to setuptools' modules from sys.modules to allow the
    invocation to import the most appropriate setuptools. This technique is
    necessary to avoid issues such as #315 where setuptools upgrading itself
    would fail to find a function declared in the metadata.
    N(tfilterRaRRIRL(RI((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyRX�sc
Cstjjtjj|��}t|���y�|gt|�tj(tjjd|�t	j
�t	jjd��t
|t�r�|n|jtj��}t|��'td|dd�}t||�WdQXWn/tk
r}|jr|jdr�qnXWdQXdS(s8Run a distutils setup script, sandboxed in its directoryicSs
|j�S(N(tactivate(tdist((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt<lambda>�tt__file__R7t__main__N(R(RtabspathtdirnameR\RPRRtinsertRt__init__t	callbackstappendt
isinstancetstrtencodetgetfilesystemencodingRtdictRt
SystemExittargs(tsetup_scriptRuRZtdunder_filetnstv((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR	�s


cBs�eZdZeZd�Zd�Zd�Zd�Zd�Z	d�Z
x<ddd	gD]+Zee
e�rXe
e�e�e<qXqXWd)d
�Zer�ede�Znede�Zxld
ddddddddddddddddddgD]+Zee
e�r�ee�e�e<q�q�Wd�Zx9d d!gD]+Zee
e�r?ee�e�e<q?q?Wd"�Zx9d#d$gD]+Zee
e�r�ee�e�e<q�q�Wd%�Zd&�Zd'�Zd(�ZRS(*sDWrap 'os' module and 'open()' builtin for virtualizing setup scriptscCsEgtt�D]+}|jd�r
t||�r
|^q
|_dS(Nt_(tdirt_osRFthasattrt_attrs(R<tname((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyRlscCs1x*|jD]}tt|t||��q
WdS(N(R~tsetattrR(tgetattr(R<tsourceR((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt_copyscCs;|j|�tr"|jt_n|jt_t|_dS(N(R�t_fileRtfilet_openRR#t_active(R<((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR=s

cCs5t|_trtt_ntt_|jt�dS(N(	tFalseR�R�RR�R�RR�R|(R<texc_typet	exc_valuet	traceback((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyRAs
		cCs|�|�SWdQXdS(sRun 'func' under os sandboxingN((R<tfunc((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pytrunscs%tt�����fd�}|S(Ncs@|jr-|j�||||�\}}n�||||�S(N(R�t_remap_pair(R<tsrctdstRutkw(Rtoriginal(s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pytwrap&s	$(R�R|(RR�((RR�s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt_mk_dual_path_wrapper#strenametlinktsymlinkcs+�ptt�����fd�}|S(Ncs4|jr$|j�|||�}n�|||�S(N(R�t_remap_input(R<RRuR�(RR�(s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR�4s	(R�R|(RR�R�((RR�s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt_mk_single_path_wrapper1sR�RtstattlistdirR*tchmodtchowntmkdirtremovetunlinktrmdirtutimetlchowntchroottlstatt	startfiletmkfifotmknodtpathconftaccesscs%tt�����fd�}|S(NcsM|jr=|j�|||�}|j��|||��S�|||�S(N(R�R�t
_remap_output(R<RRuR�(RR�(s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR�Is	(R�R|(RR�((RR�s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt_mk_single_with_returnFstreadlinkttempnamcs%tt�����fd�}|S(Ncs,�||�}|jr(|j�|�S|S(N(R�R�(R<RuR�tretval(RR�(s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR�Xs	(R�R|(RR�((RR�s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt	_mk_queryUsR)ttmpnamcCs|S(s=Called to remap or validate any path, whether input or output((R<R((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt_validate_pathdscOs
|j|�S(sCalled for path inputs(R�(R<t	operationRRuR�((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR�hscCs
|j|�S(sCalled for path outputs(R�(R<R�R((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR�lscOs6|j|d|||�|j|d|||�fS(s?Called for path pairs like rename, link, and symlink operationss-froms-to(R�(R<R�R�R�RuR�((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR�psN(R7R8R9R�R�RlR�R=RAR�R�RR}R|RRR�R�R�R�R�R�R�R�R�(((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyRsB						

					tdevnullcBs�eZdZejddddddddd	d
ddd
g
�ZdgZed�Zd�Z	e
rudd�Z
ndd�Zd�Zd�Z
d�Zd�Zd�Zdd�ZRS(s<Restrict operations to a single subdirectory - pseudo-chrootRR�R�R�R�R�R�R�R�R�R�R�R�s.*lib2to3.*\.pickle$cCs�tjjtjj|��|_tjj|jd�|_g|D]$}tjjtjj|��^qC|_tj	|�dS(NRf(
R(Rtnormcasetrealpatht_sandboxRWt_prefixt_exceptionsRRl(R<tsandboxt
exceptionsR((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyRl�s
!1cOs&ddlm}||||��dS(Ni����(R(R1R(R<R�RuR�R((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt
_violation�strcOsK|dkr8|j|�r8|jd||||�nt||||�S(NR�trtR
trUtUR�(R�R�R
R�R�(t_okR�R�(R<RRRuR�((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR��scOsK|dkr8|j|�r8|jd||||�nt||||�S(NR�R�R
R�R�R(R�R�R
R�R�(R�R�R�(R<RRRuR�((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR��scCs|jd�dS(NR�(R�(R<((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR��scCss|j}zYt|_tjjtjj|��}|j|�p`||jkp`|j|j	�SWd||_XdS(N(
R�R�R(RR�R�t	_exemptedR�RFR�(R<RtactiveR�((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR��s		csN�fd�|jD�}�fd�|jD�}tj||�}t|�S(Nc3s|]}�j|�VqdS(N(RF(RGt	exception(tfilepath(s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pys	<genexpr>�sc3s!|]}tj|��VqdS(N(R]R_(RGR`(R�(s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pys	<genexpr>�s(R�t_exception_patternst	itertoolstchaintany(R<R�t
start_matchestpattern_matchest
candidates((R�s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR��s

cOsH||jkrD|j|�rD|j|tjj|�||�n|S(sCalled for path inputs(t	write_opsR�R�R(RR�(R<R�RRuR�((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR��s%cOsF|j|�s |j|�r<|j|||||�n||fS(s?Called for path pairs like rename, link, and symlink operations(R�R�(R<R�R�R�RuR�((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR��s i�cOsR|t@r9|j|�r9|jd|||||�ntj|||||�S(sCalled for low-level os.open()sos.open(tWRITE_FLAGSR�R�R|R(R<R�tflagsRRuR�((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR�s(R7R8R9RstfromkeysR�R�t_EXCEPTIONSRlR�R�R�R�R�R�R�R�R(((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR~s 					
			s4O_WRONLY O_RDWR O_APPEND O_CREAT O_TRUNC O_TEMPORARYicBs,eZdZejd�j�Zd�ZRS(sEA setup script attempted to modify the filesystem outside the sandboxs
        SandboxViolation: {cmd}{args!r} {kwargs}

        The package setup script has attempted to modify files on your system
        that are not within the EasyInstall build area, and has been aborted.

        This package cannot be safely installed by EasyInstall, and may not
        support alternate installation locations even if you run its setup
        script by hand.  Please inform the package's author and the EasyInstall
        maintainers to find out if a fix or workaround is available.
        cCs%|j\}}}|jjt��S(N(RuttmpltformatR(R<tcmdRutkwargs((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt__str__�s(R7R8R9ttextwraptdedenttlstripR�R�(((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyR�s
(((@R(RR$toperatort	functoolsR�R]t
contextlibR.R�tsetuptools.externRtsetuptools.extern.six.movesRRtpkg_resources.py31compatR tplatformRFt$org.python.modules.posix.PosixModuletpythonRItposixtPosixModuleR|RR�R�t	NameErrorRRR�tdistutils.errorsRRt__all__RtcontextmanagerRRR'R,R0R-R;RORLRTR\RaRXR	RR}R�R�Rtreducetor_tsplittaR�R�R(((s6/usr/lib/python2.7/site-packages/setuptools/sandbox.pyt<module>s^




	
					wV	+wheel.py000064400000016076151733473760006254 0ustar00'''Wheels support.'''

from distutils.util import get_platform
import email
import itertools
import os
import re
import zipfile

from pkg_resources import Distribution, PathMetadata, parse_version
from setuptools.extern.six import PY3
from setuptools import Distribution as SetuptoolsDistribution
from setuptools import pep425tags
from setuptools.command.egg_info import write_requirements


WHEEL_NAME = re.compile(
    r"""^(?P<project_name>.+?)-(?P<version>\d.*?)
    ((-(?P<build>\d.*?))?-(?P<py_version>.+?)-(?P<abi>.+?)-(?P<platform>.+?)
    )\.whl$""",
re.VERBOSE).match

NAMESPACE_PACKAGE_INIT = '''\
try:
    __import__('pkg_resources').declare_namespace(__name__)
except ImportError:
    __path__ = __import__('pkgutil').extend_path(__path__, __name__)
'''


def unpack(src_dir, dst_dir):
    '''Move everything under `src_dir` to `dst_dir`, and delete the former.'''
    for dirpath, dirnames, filenames in os.walk(src_dir):
        subdir = os.path.relpath(dirpath, src_dir)
        for f in filenames:
            src = os.path.join(dirpath, f)
            dst = os.path.join(dst_dir, subdir, f)
            os.renames(src, dst)
        for n, d in reversed(list(enumerate(dirnames))):
            src = os.path.join(dirpath, d)
            dst = os.path.join(dst_dir, subdir, d)
            if not os.path.exists(dst):
                # Directory does not exist in destination,
                # rename it and prune it from os.walk list.
                os.renames(src, dst)
                del dirnames[n]
    # Cleanup.
    for dirpath, dirnames, filenames in os.walk(src_dir, topdown=True):
        assert not filenames
        os.rmdir(dirpath)


class Wheel(object):

    def __init__(self, filename):
        match = WHEEL_NAME(os.path.basename(filename))
        if match is None:
            raise ValueError('invalid wheel name: %r' % filename)
        self.filename = filename
        for k, v in match.groupdict().items():
            setattr(self, k, v)

    def tags(self):
        '''List tags (py_version, abi, platform) supported by this wheel.'''
        return itertools.product(self.py_version.split('.'),
                                 self.abi.split('.'),
                                 self.platform.split('.'))

    def is_compatible(self):
        '''Is the wheel is compatible with the current platform?'''
        supported_tags = pep425tags.get_supported()
        return next((True for t in self.tags() if t in supported_tags), False)

    def egg_name(self):
        return Distribution(
            project_name=self.project_name, version=self.version,
            platform=(None if self.platform == 'any' else get_platform()),
        ).egg_name() + '.egg'

    def install_as_egg(self, destination_eggdir):
        '''Install wheel as an egg directory.'''
        with zipfile.ZipFile(self.filename) as zf:
            dist_basename = '%s-%s' % (self.project_name, self.version)
            dist_info = '%s.dist-info' % dist_basename
            dist_data = '%s.data' % dist_basename
            def get_metadata(name):
                with zf.open('%s/%s' % (dist_info, name)) as fp:
                    value = fp.read().decode('utf-8') if PY3 else fp.read()
                    return email.parser.Parser().parsestr(value)
            wheel_metadata = get_metadata('WHEEL')
            dist_metadata = get_metadata('METADATA')
            # Check wheel format version is supported.
            wheel_version = parse_version(wheel_metadata.get('Wheel-Version'))
            if not parse_version('1.0') <= wheel_version < parse_version('2.0dev0'):
                raise ValueError('unsupported wheel format version: %s' % wheel_version)
            # Extract to target directory.
            os.mkdir(destination_eggdir)
            zf.extractall(destination_eggdir)
            # Convert metadata.
            dist_info = os.path.join(destination_eggdir, dist_info)
            dist = Distribution.from_location(
                destination_eggdir, dist_info,
                metadata=PathMetadata(destination_eggdir, dist_info)
            )
            # Note: we need to evaluate and strip markers now,
            # as we can't easily convert back from the syntax:
            # foobar; "linux" in sys_platform and extra == 'test'
            def raw_req(req):
                req.marker = None
                return str(req)
            install_requires = list(sorted(map(raw_req, dist.requires())))
            extras_require = {
                extra: list(sorted(
                    req
                    for req in map(raw_req, dist.requires((extra,)))
                    if req not in install_requires
                ))
                for extra in dist.extras
            }
            egg_info = os.path.join(destination_eggdir, 'EGG-INFO')
            os.rename(dist_info, egg_info)
            os.rename(os.path.join(egg_info, 'METADATA'),
                      os.path.join(egg_info, 'PKG-INFO'))
            setup_dist = SetuptoolsDistribution(attrs=dict(
                install_requires=install_requires,
                extras_require=extras_require,
            ))
            write_requirements(setup_dist.get_command_obj('egg_info'),
                               None, os.path.join(egg_info, 'requires.txt'))
            # Move data entries to their correct location.
            dist_data = os.path.join(destination_eggdir, dist_data)
            dist_data_scripts = os.path.join(dist_data, 'scripts')
            if os.path.exists(dist_data_scripts):
                egg_info_scripts = os.path.join(destination_eggdir,
                                                'EGG-INFO', 'scripts')
                os.mkdir(egg_info_scripts)
                for entry in os.listdir(dist_data_scripts):
                    # Remove bytecode, as it's not properly handled
                    # during easy_install scripts install phase.
                    if entry.endswith('.pyc'):
                        os.unlink(os.path.join(dist_data_scripts, entry))
                    else:
                        os.rename(os.path.join(dist_data_scripts, entry),
                                  os.path.join(egg_info_scripts, entry))
                os.rmdir(dist_data_scripts)
            for subdir in filter(os.path.exists, (
                os.path.join(dist_data, d)
                for d in ('data', 'headers', 'purelib', 'platlib')
            )):
                unpack(subdir, destination_eggdir)
            if os.path.exists(dist_data):
                os.rmdir(dist_data)
            # Fix namespace packages.
            namespace_packages = os.path.join(egg_info, 'namespace_packages.txt')
            if os.path.exists(namespace_packages):
                with open(namespace_packages) as fp:
                    namespace_packages = fp.read().split()
                for mod in namespace_packages:
                    mod_dir = os.path.join(destination_eggdir, *mod.split('.'))
                    mod_init = os.path.join(mod_dir, '__init__.py')
                    if os.path.exists(mod_dir) and not os.path.exists(mod_init):
                        with open(mod_init, 'w') as fp:
                            fp.write(NAMESPACE_PACKAGE_INIT)
wheel.pyc000064400000016257151733473760006420 0ustar00�
�fc@s�dZddlmZddlZddlZddlZddlZddlZddlm	Z	m
Z
mZddlm
Z
ddlm	ZddlmZddlmZejd	ej�jZd
Zd�Zdefd
��YZdS(sWheels support.i����(tget_platformN(tDistributiontPathMetadatat
parse_version(tPY3(R(t
pep425tags(twrite_requirementss�^(?P<project_name>.+?)-(?P<version>\d.*?)
    ((-(?P<build>\d.*?))?-(?P<py_version>.+?)-(?P<abi>.+?)-(?P<platform>.+?)
    )\.whl$s�try:
    __import__('pkg_resources').declare_namespace(__name__)
except ImportError:
    __path__ = __import__('pkgutil').extend_path(__path__, __name__)
cCsOxtj|�D]�\}}}tjj||�}xK|D]C}tjj||�}tjj|||�}tj||�q;Wxttt|���D]e\}	}
tjj||
�}tjj|||
�}tjj	|�s�tj||�||	=q�q�WqWx@tj|dt
�D])\}}}|s:t�tj|�qWdS(sDMove everything under `src_dir` to `dst_dir`, and delete the former.ttopdownN(
tostwalktpathtrelpathtjointrenamestreversedtlistt	enumeratetexiststTruetAssertionErrortrmdir(tsrc_dirtdst_dirtdirpathtdirnamest	filenamestsubdirtftsrctdsttntd((s4/usr/lib/python2.7/site-packages/setuptools/wheel.pytunpacks
%%
tWheelcBs5eZd�Zd�Zd�Zd�Zd�ZRS(cCswttjj|��}|dkr7td|��n||_x0|j�j�D]\}}t	|||�qSWdS(Nsinvalid wheel name: %r(
t
WHEEL_NAMERR
tbasenametNonet
ValueErrortfilenamet	groupdicttitemstsetattr(tselfR&tmatchtktv((s4/usr/lib/python2.7/site-packages/setuptools/wheel.pyt__init__7s	cCs7tj|jjd�|jjd�|jjd��S(s>List tags (py_version, abi, platform) supported by this wheel.t.(t	itertoolstproductt
py_versiontsplittabitplatform(R*((s4/usr/lib/python2.7/site-packages/setuptools/wheel.pyttags?scs/tj��t�fd�|j�D�t�S(s5Is the wheel is compatible with the current platform?c3s!|]}|�krtVqdS(N(R(t.0tt(tsupported_tags(s4/usr/lib/python2.7/site-packages/setuptools/wheel.pys	<genexpr>Hs(Rt
get_supportedtnextR6tFalse(R*((R9s4/usr/lib/python2.7/site-packages/setuptools/wheel.pyt
is_compatibleEscCsAtd|jd|jd|jdkr-dnt��j�dS(Ntproject_nametversionR5tanys.egg(RR>R?R5R$Rtegg_name(R*((s4/usr/lib/python2.7/site-packages/setuptools/wheel.pyRAJs$cstj|j���d|j|jf}d|�d|���fd�}|d�}|d�}t|jd��}td�|ko�td	�kns�td
|��ntj	|��j
|�tjj|���t
j|�dt|����d��ttt��j��������fd
��jD�}tjj|d�}tj�|�tjtjj|d�tjj|d��tdtd�d|��}	t|	jd�dtjj|d��tjj|���tjj�d�}
tjj|
�r�tjj|dd�}tj	|�xstj|
�D]b}|jd�r�tjtjj|
|��q\tjtjj|
|�tjj||��q\Wtj|
�nx:t tjj�fd�d!D��D]}
t!|
|�q�Wtjj��r1tj��ntjj|d�}tjj|�rt"|��}|j#�j$�}WdQXx�|D]�}tjj||j$d��}tjj|d�}tjj|�r�tjj|�r�t"|d ��}|j%t&�WdQXq�q�WnWdQXdS("s"Install wheel as an egg directory.s%s-%ss%s.dist-infos%s.datacsc�jd�|f��D}tr7|j�jd�n	|j�}tjj�j|�SWdQXdS(Ns%s/%ssutf-8(topenRtreadtdecodetemailtparsertParsertparsestr(tnametfptvalue(t	dist_infotzf(s4/usr/lib/python2.7/site-packages/setuptools/wheel.pytget_metadataVs'tWHEELtMETADATAs
Wheel-Versions1.0s2.0dev0s$unsupported wheel format version: %stmetadatacSsd|_t|�S(N(R$tmarkertstr(treq((s4/usr/lib/python2.7/site-packages/setuptools/wheel.pytraw_reqls	c	sJi|]@}tt�fd�t��j|f��D���|�qS(c3s!|]}|�kr|VqdS(N((R7RT(tinstall_requires(s4/usr/lib/python2.7/site-packages/setuptools/wheel.pys	<genexpr>rs(Rtsortedtmaptrequires(R7textra(tdistRVRU(s4/usr/lib/python2.7/site-packages/setuptools/wheel.pys
<dictcomp>qs	sEGG-INFOsPKG-INFOtattrsRVtextras_requiretegg_infosrequires.txttscriptss.pycc3s$|]}tjj�|�VqdS(N(RR
R(R7R(t	dist_data(s4/usr/lib/python2.7/site-packages/setuptools/wheel.pys	<genexpr>�stdatatheaderstpurelibtplatlibsnamespace_packages.txtNR/s__init__.pytw(RaRbRcRd('tzipfiletZipFileR&R>R?RtgetR%Rtmkdirt
extractallR
RRt
from_locationRRRWRXRYtextrastrenametSetuptoolsDistributiontdictRtget_command_objR$RtlistdirtendswithtunlinkRtfilterR RBRCR3twritetNAMESPACE_PACKAGE_INIT(R*tdestination_eggdirt
dist_basenameRNtwheel_metadatat
dist_metadatat
wheel_versionR]R^t
setup_disttdist_data_scriptstegg_info_scriptstentryRtnamespace_packagesRJtmodtmod_dirtmod_init((R[R`RLRVRURMs4/usr/lib/python2.7/site-packages/setuptools/wheel.pytinstall_as_eggPsr

(

		!


%(t__name__t
__module__R.R6R=RAR�(((s4/usr/lib/python2.7/site-packages/setuptools/wheel.pyR!5s
				(t__doc__tdistutils.utilRRER0RtreRft
pkg_resourcesRRRtsetuptools.extern.sixRt
setuptoolsRnRtsetuptools.command.egg_infoRtcompiletVERBOSER+R"RvR tobjectR!(((s4/usr/lib/python2.7/site-packages/setuptools/wheel.pyt<module>s"	py36compat.pyo000064400000005456151733473760007334 0ustar00�
�fc@s�ddlZddlmZddlmZddlmZdd
d��YZejdkrtddd��YZne	r�dd
d	��YZndS(i����N(tDistutilsOptionError(t	strtobool(tDEBUGtDistribution_parse_config_filescBseZdZdd�ZRS(s�
    Mix-in providing forward-compatibility for functionality to be
    included by default on Python 3.7.

    Do not edit the code in this class except to update functionality
    as implemented in distutils.
    c
CsHddlm}tjtjkrRddddddd	d
ddd
ddg
}ng}t|�}|dkr|j�}ntr�|j	d�n|dd�}x�|D]�}tr�|j	d|�n|j
|�x�|j�D]�}|j|�}|j
|�}x]|D]U}	|	dkr|	|kr|j||	�}
|	jdd�}	||
f||	<qqWq�W|j�q�Wd|jkrDx�|jdj�D]�\}	\}}
|jj|	�}yY|r�t||t|
��n5|	dkr
t||	t|
��nt||	|
�Wq�tk
r<}
t|
��q�Xq�WndS(Ni����(tConfigParsersinstall-basesinstall-platbasesinstall-libsinstall-platlibsinstall-purelibsinstall-headerssinstall-scriptssinstall-datatprefixsexec-prefixthometusertroots"Distribution.parse_config_files():t
interpolations  reading %st__name__t-t_tglobaltverbosetdry_run(RR(tconfigparserRtsysRtbase_prefixt	frozensettNonetfind_config_filesRtannouncetreadtsectionstoptionstget_option_dicttgettreplacet__init__tcommand_optionstitemstnegative_opttsetattrRt
ValueErrorR(tselft	filenamesRtignore_optionstparsertfilenametsectionRtopt_dicttopttvaltsrctaliastmsg((s9/usr/lib/python2.7/site-packages/setuptools/py36compat.pytparse_config_filessJ		


&N(R
t
__module__t__doc__RR/(((s9/usr/lib/python2.7/site-packages/setuptools/py36compat.pyRsicBseZRS((R
R0(((s9/usr/lib/python2.7/site-packages/setuptools/py36compat.pyRJscBseZRS((R
R0(((s9/usr/lib/python2.7/site-packages/setuptools/py36compat.pyRQs((i(((
Rtdistutils.errorsRtdistutils.utilRtdistutils.debugRRtversion_infotFalse(((s9/usr/lib/python2.7/site-packages/setuptools/py36compat.pyt<module>sAmsvc.pyo000064400000116640151733473760006275 0ustar00�
�fc@sydZddlZddlZddlZddlZddlZddlmZddl	m
Z
ddlmZej
�dkr�ddl	mZejZnd	fd
��YZe�ZeejjfZyddlmZWnek
r�nXd�Zd
d�Zd�Zd�Zdd�Zdfd��YZdfd��YZdfd��YZdfd��YZ dS(s@
Improved support for Microsoft Visual C++ compilers.

Known supported compilers:
--------------------------
Microsoft Visual C++ 9.0:
    Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64)
    Microsoft Windows SDK 6.1 (x86, x64, ia64)
    Microsoft Windows SDK 7.0 (x86, x64, ia64)

Microsoft Visual C++ 10.0:
    Microsoft Windows SDK 7.1 (x86, x64, ia64)

Microsoft Visual C++ 14.0:
    Microsoft Visual C++ Build Tools 2015 (x86, x64, arm)
    Microsoft Visual Studio 2017 (x86, x64, arm, arm64)
    Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64)
i����N(t
LegacyVersion(tfilterfalsei(t
get_unpatchedtWindows(twinregRcBs eZdZdZdZdZRS(N(t__name__t
__module__tNonet
HKEY_USERStHKEY_CURRENT_USERtHKEY_LOCAL_MACHINEtHKEY_CLASSES_ROOT(((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR(s(tRegcCs�d}|d|f}ytj|d�}WnQtk
ry&|d|f}tj|d�}Wq�tk
r{d}q�XnX|r�tjjjj|d�}tjj|�r�|Sntt	�|�S(s+
    Patched "distutils.msvc9compiler.find_vcvarsall" to use the standalone
    compiler build for Python (VCForPython). Fall back to original behavior
    when the standalone compiler is not available.

    Redirect the path of "vcvarsall.bat".

    Known supported compilers
    -------------------------
    Microsoft Visual C++ 9.0:
        Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64)

    Parameters
    ----------
    version: float
        Required Microsoft Visual C++ version.

    Return
    ------
    vcvarsall.bat path: str
    s-Software\%sMicrosoft\DevDiv\VCForPython\%0.1ftt
installdirsWow6432Node\s
vcvarsall.batN(
Rt	get_valuetKeyErrorRtostpathtjointisfileRtmsvc9_find_vcvarsall(tversiontVC_BASEtkeyt
productdirt	vcvarsall((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR?s

tx86cOs�y#tt�}|||||�SWn'tjjk
r<ntk
rLnXyt||�j�SWn,tjjk
r�}t|||��nXdS(s�
    Patched "distutils.msvc9compiler.query_vcvarsall" for support extra
    compilers.

    Set environment without use of "vcvarsall.bat".

    Known supported compilers
    -------------------------
    Microsoft Visual C++ 9.0:
        Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64)
        Microsoft Windows SDK 6.1 (x86, x64, ia64)
        Microsoft Windows SDK 7.0 (x86, x64, ia64)

    Microsoft Visual C++ 10.0:
        Microsoft Windows SDK 7.1 (x86, x64, ia64)

    Parameters
    ----------
    ver: float
        Required Microsoft Visual C++ version.
    arch: str
        Target architecture.

    Return
    ------
    environment: dict
    N(	Rtmsvc9_query_vcvarsallt	distutilsterrorstDistutilsPlatformErrort
ValueErrortEnvironmentInfot
return_envt_augment_exception(tvertarchtargstkwargstorigtexc((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRjs
cCsxytt�|�SWntjjk
r-nXyt|dd�j�SWn)tjjk
rs}t|d��nXdS(s'
    Patched "distutils._msvccompiler._get_vc_env" for support extra
    compilers.

    Set environment without use of "vcvarsall.bat".

    Known supported compilers
    -------------------------
    Microsoft Visual C++ 14.0:
        Microsoft Visual C++ Build Tools 2015 (x86, x64, arm)
        Microsoft Visual Studio 2017 (x86, x64, arm, arm64)
        Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64)

    Parameters
    ----------
    plat_spec: str
        Target architecture.

    Return
    ------
    environment: dict
    t
vc_min_verg,@N(Rtmsvc14_get_vc_envRRRR!R"R#(t	plat_specR)((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR+�s
cOsbdtjkrOddl}t|j�td�krO|jjj||�Sntt	�||�S(s�
    Patched "distutils._msvccompiler.gen_lib_options" for fix
    compatibility between "numpy.distutils" and "distutils._msvccompiler"
    (for Numpy < 1.11.2)
    snumpy.distutilsi����Ns1.11.2(
tsystmodulestnumpyRt__version__Rt	ccompilertgen_lib_optionsRtmsvc14_gen_lib_options(R&R'tnp((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR3�s
R
cCs�|jd}d|j�ks1d|j�kr�d}|jt��}d}|dkr�|j�jd�dkr�|d	7}||d
7}q�|d7}q�|dkr�|d
7}||d7}q�|dkr�|d7}q�n|f|_dS(sl
    Add details to the exception message to help guide the user
    as to what action will resolve it.
    iRsvisual cs0Microsoft Visual C++ {version:0.1f} is required.s-www.microsoft.com/download/details.aspx?id=%dg"@tia64i����s* Get it with "Microsoft Windows SDK 7.0": iBs% Get it from http://aka.ms/vcpython27g$@s* Get it with "Microsoft Windows SDK 7.1": iW g,@sj Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-toolsN(R&tlowertformattlocalstfind(R)RR%tmessagettmplt
msdownload((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR#�s 
$


tPlatformInfocBszeZdZejdd�j�Zd�Zed��Z	d�Z
d�Zeed�Z
eed�Zed	�ZRS(
s�
    Current and Target Architectures informations.

    Parameters
    ----------
    arch: str
        Target architecture.
    tprocessor_architectureR
cCs|j�jdd�|_dS(Ntx64tamd64(R6treplaceR%(tselfR%((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt__init__�scCs|j|jjd�dS(Nt_i(R%R9(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt
target_cpu�scCs
|jdkS(NR(RE(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt
target_is_x86scCs
|jdkS(NR(tcurrent_cpu(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytcurrent_is_x86scCs=|jdkr|rdS|jdkr2|r2dSd|jS(sj
        Current platform specific subfolder.

        Parameters
        ----------
        hidex86: bool
            return '' and not '�' if architecture is x86.
        x64: bool
            return 'd' and not 'md64' if architecture is amd64.

        Return
        ------
        subfolder: str
            '	arget', or '' (see hidex86 parameter)
        RR
R@s\x64s\%s(RG(RBthidex86R?((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytcurrent_dir	scCs=|jdkr|rdS|jdkr2|r2dSd|jS(sr
        Target platform specific subfolder.

        Parameters
        ----------
        hidex86: bool
            return '' and not '\x86' if architecture is x86.
        x64: bool
            return '\x64' and not '\amd64' if architecture is amd64.

        Return
        ------
        subfolder: str
            '\current', or '' (see hidex86 parameter)
        RR
R@s\x64s\%s(RE(RBRIR?((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt
target_dirscCsB|rdn|j}|j|kr(dS|j�jdd|�S(so
        Cross platform specific subfolder.

        Parameters
        ----------
        forcex86: bool
            Use 'x86' as current architecture even if current acritecture is
            not x86.

        Return
        ------
        subfolder: str
            '' if target architecture is current architecture,
            '\current_target' if not.
        RR
s\s\%s_(RGRERKRA(RBtforcex86tcurrent((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt	cross_dir5s(RRt__doc__tsafe_envtgetR6RGRCtpropertyRERFRHtFalseRJRKRN(((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR=�s			tRegistryInfocBs�eZdZejejejejfZd�Z	e
d��Ze
d��Ze
d��Z
e
d��Ze
d��Ze
d��Ze
d��Ze
d	��Ze
d
��Zed�Zd�ZRS(
s�
    Microsoft Visual Studio related registry informations.

    Parameters
    ----------
    platform_info: PlatformInfo
        "PlatformInfo" instance.
    cCs
||_dS(N(tpi(RBt
platform_info((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRCZscCsdS(s<
        Microsoft Visual Studio root registry key.
        tVisualStudio((RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytvisualstudio]scCstjj|jd�S(s;
        Microsoft Visual Studio SxS registry key.
        tSxS(RRRRX(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytsxsdscCstjj|jd�S(s8
        Microsoft Visual C++ VC7 registry key.
        tVC7(RRRRZ(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytvckscCstjj|jd�S(s;
        Microsoft Visual Studio VS7 registry key.
        tVS7(RRRRZ(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytvsrscCsdS(s?
        Microsoft Visual C++ for Python registry key.
        sDevDiv\VCForPython((RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt
vc_for_pythonyscCsdS(s-
        Microsoft SDK registry key.
        sMicrosoft SDKs((RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt
microsoft_sdk�scCstjj|jd�S(s>
        Microsoft Windows/Platform SDK registry key.
        R(RRRR`(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytwindows_sdk�scCstjj|jd�S(s<
        Microsoft .NET Framework SDK registry key.
        tNETFXSDK(RRRR`(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt	netfx_sdk�scCsdS(s<
        Microsoft Windows Kits Roots registry key.
        sWindows Kits\Installed Roots((RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytwindows_kits_roots�scCs:|jj�s|rdnd}tjjd|d|�S(s

        Return key in Microsoft software registry.

        Parameters
        ----------
        key: str
            Registry key path where look.
        x86: str
            Force x86 software registry.

        Return
        ------
        str: value
        R
tWow6432NodetSoftwaret	Microsoft(RURHRRR(RBRRtnode64((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt	microsoft�s!cCs�tj}tj}|j}x�|jD]�}y||||�d|�}Wnkttfk
r�|jj�s%y"||||t	�d|�}Wq�ttfk
r�q%q�Xq�q%nXytj
||�dSWq%ttfk
r�q%Xq%WdS(s
        Look for values in registry in Microsoft software registry.

        Parameters
        ----------
        key: str
            Registry key path where look.
        name: str
            Value name to find.

        Return
        ------
        str: value
        iN(RtKEY_READtOpenKeyRitHKEYStOSErrortIOErrorRURHtTruetQueryValueEx(RBRtnameRjtopenkeytmsthkeytbkey((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytlookup�s"			"
(RRRORRR	R
RRlRCRRRXRZR\R^R_R`RaRcRdRSRiRv(((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRTLs"	t
SystemInfocBsjeZdZejdd�Zejdd�Zejde�Zdd�Z	d�Z
d�Zed��Z
ed	��Zd
�Zd�Zed��Zed
��Zed��Zed��Zed��Zed��Zed��Zed��Zed��Zed��Zed��Zed��Zed��Zd�Zdd�ZRS(s�
    Microsoft Windows and Visual Studio related system inormations.

    Parameters
    ----------
    registry_info: RegistryInfo
        "RegistryInfo" instance.
    vc_ver: float
        Required Microsoft Visual C++ version.
    tWinDirR
tProgramFilessProgramFiles(x86)cCs1||_|jj|_|p'|j�|_dS(N(triRUt_find_latest_available_vc_vertvc_ver(RBt
registry_infoR|((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRC�s	cCsBy|j�dSWn)tk
r=d}tjj|��nXdS(Ni����s%No Microsoft Visual C++ version found(tfind_available_vc_verst
IndexErrorRRR(RBterr((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR{�s

cCs�|jj}|jj|jj|jjf}g}xI|jjD];}x2|D]*}y%tj|||�dtj�}Wnt	t
fk
r�qMnXtj|�\}}}	xdt|�D]V}
y<t
tj||
�d�}||kr�|j|�nWq�tk
rq�Xq�Wx`t|�D]R}
y8t
tj||
��}||kr^|j|�nWq!tk
rrq!Xq!WqMWq@Wt|�S(sC
        Find all available Microsoft Visual C++ versions.
        i(RzRiR\R_R^RlRRkRjRmRntQueryInfoKeytrangetfloatt	EnumValuetappendR tEnumKeytsorted(RBRstvckeystvc_versRtRRutsubkeystvaluesRDtiR$((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR~�s2!
%

cCsKd|j}tjj|j|�}|jj|jjd|j�pJ|S(s4
        Microsoft Visual Studio directory.
        sMicrosoft Visual Studio %0.1fs%0.1f(R|RRRtProgramFilesx86RzRvR^(RBRqtdefault((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytVSInstallDir
s
cCs�|j|j�p|j�}tjj|jjd|j�}|jj	|d�}|rqtjj|d�n|}|jj	|jj
d|j�p�|}tjj|�s�d}tj
j|��n|S(s1
        Microsoft Visual C++ directory.
        s%0.1fRtVCs(Microsoft Visual C++ directory not found(R�t	_guess_vct_guess_vc_legacyRRRRzR_R|RvR\tisdirRRR(RBtguess_vctreg_patht	python_vct
default_vcRtmsg((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytVCInstallDirs"!(cCs||jdkrdSd}tjj|j|�}y*tj|�d}tjj||�SWntttfk
rwnXdS(s*
        Locate Visual C for 2017
        g,@Ns
VC\Tools\MSVCi����(	R|RRRR�tlistdirRmRnR(RBR�R�tvc_exact_ver((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR�0scCs#d|j}tjj|j|�S(s<
        Locate Visual C for versions prior to 2017
        s Microsoft Visual Studio %0.1f\VC(R|RRRR�(RBR�((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR�@s
cCsc|jdkrdS|jdkr&dS|jdkr9dS|jdkrLdS|jdkr_dSdS(sN
        Microsoft Windows SDK versions for specified MSVC++ version.
        g"@s7.0s6.1s6.0ag$@s7.1s7.0ag&@s8.0s8.0ag(@s8.1s8.1ag,@s10.0N(s7.0s6.1s6.0a(s7.1s7.0a(s8.0s8.0a(s8.1s8.1a(s10.0s8.1(R|(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytWindowsSdkVersionGscCs|jtjj|jd��S(s4
        Microsoft Windows SDK last version
        tlib(t_use_last_dir_nameRRRt
WindowsSdkDir(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytWindowsSdkLastVersionWscCs�d}xO|jD]D}tjj|jjd|�}|jj|d�}|rPqqW|srtjj|�r�tjj|jjd|j	�}|jj|d�}|r�tjj|d�}q�n|s�tjj|�rKxd|jD]V}||j
d� }d|}tjj|j|�}tjj|�r�|}q�q�Wn|setjj|�r�xQ|jD]C}d	|}tjj|j|�}tjj|�ro|}qoqoWn|s�tjj|jd
�}n|S(s2
        Microsoft Windows SDK directory.
        R
sv%stinstallationfolders%0.1fRtWinSDKt.sMicrosoft SDKs\Windows Kits\%ssMicrosoft SDKs\Windows\v%stPlatformSDK(
R�RRRRzRaRvR�R_R|trfindRyR�(RBtsdkdirR$tlocRtinstall_basetintvertd((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR�_s6"

c	Cs8|jdkrd}d}n<d}|jdkr9tnt}|jjdtd|�}d||jd	d
�f}g}|jdkr�x9|jD]+}|tjj	|j
j||�g7}q�Wnx:|jD]/}|tjj	|j
j
d||�g7}q�Wx-|D]%}|j
j|d
�}|rPqqW|S(s=
        Microsoft Windows SDK executable directory.
        g&@i#R
i(g(@R?RIsWinSDK-NetFx%dTools%ss\t-g,@sv%sAR�(R|RoRSRURJRAtNetFxSdkVersionRRRRzRcR�RaRv(	RBtnetfxverR%RItfxtregpathsR$Rtexecpath((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytWindowsSDKExecutablePath�s$	,-
cCsAd|j}tjj|jj|�}|jj|d�p@dS(s0
        Microsoft Visual F# directory.
        s%0.1f\Setup\F#RR
(R|RRRRzRXRv(RBR((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytFSharpInstallDir�s
cCsb|jdkrd}nd}x7|D]/}|jj|jjd|�}|r%Pq%q%W|padS(s8
        Microsoft Universal CRT SDK directory.
        g,@t10t81s
kitsroot%sR
(R�R�((R|RzRvRd(RBtversR$R�((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytUniversalCRTSdkDir�s	

cCs|jtjj|jd��S(s@
        Microsoft Universal C Runtime SDK last version
        R�(R�RRRR�(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytUniversalCRTSdkLastVersion�scCs|jdkrdSdSdS(s8
        Microsoft .NET Framework SDK versions.
        g,@s4.6.1s4.6N(s4.6.1s4.6((R|(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR��scCsXxK|jD]@}tjj|jj|�}|jj|d�}|r
Pq
q
W|pWdS(s9
        Microsoft .NET Framework SDK directory.
        tkitsinstallationfolderR
(R�RRRRzRcRv(RBR$R�R�((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytNetFxSdkDir�scCs7tjj|jd�}|jj|jjd�p6|S(s;
        Microsoft .NET Framework 32bit directory.
        sMicrosoft.NET\Frameworktframeworkdir32(RRRRxRzRvR\(RBtguess_fw((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytFrameworkDir32�scCs7tjj|jd�}|jj|jjd�p6|S(s;
        Microsoft .NET Framework 64bit directory.
        sMicrosoft.NET\Framework64tframeworkdir64(RRRRxRzRvR\(RBR�((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytFrameworkDir64�scCs
|jd�S(s:
        Microsoft .NET Framework 32bit versions.
        i (t_find_dot_net_versions(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytFrameworkVersion32�scCs
|jd�S(s:
        Microsoft .NET Framework 64bit versions.
        i@(R�(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytFrameworkVersion64�scCs�|jj|jjd|�}t|d|�}|pM|j|d�pMd}|jdkrn|df}nR|jdkr�|j�d d	kr�d
n|df}n|jdkr�d}n|jdkr�d}n|S(s�
        Find Microsoft .NET Framework versions.

        Parameters
        ----------
        bits: int
            Platform number of bits: 32 or 64.
        sframeworkver%dsFrameworkDir%dtvR
g(@sv4.0g$@itv4s
v4.0.30319sv3.5g"@s
v2.0.50727g @sv3.0(sv3.5s
v2.0.50727(sv3.0s
v2.0.50727(RzRvR\tgetattrR�R|R6(RBtbitstreg_vertdot_net_dirR$tframeworkver((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR�s
		cs;��fd�ttj���D�}t|d�p:dS(s�
        Return name of the last dir in path or '' if no dir found.

        Parameters
        ----------
        path: str
            Use dirs in this path
        prefix: str
            Use only dirs startings by this prefix
        c3sE|];}tjjtjj�|��r|j��r|VqdS(N(RRR�Rt
startswith(t.0tdir_name(Rtprefix(s3/usr/lib/python2.7/site-packages/setuptools/msvc.pys	<genexpr>)s!R
N(treversedRR�tnextR(RBRR�t
matching_dirs((RR�s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR�sN( RRRORPRQRxRyR�RRCR{R~RRR�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�(((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRw�s4
				&		R!cBs�eZdZddd�Zed��Zed��Zed��Zed��Z	ed��Z
ed��Zed	��Zed
��Z
ed��Zed��Zd
�Zed��Zed��Zed��Zed��Zed��Zed��Zed��Zed��Zed��Zed��Zed��Zed��Zed��Zed�Zd�Z dd�Z!RS(sY
    Return environment variables for specified Microsoft Visual C++ version
    and platform : Lib, Include, Path and libpath.

    This function is compatible with Microsoft Visual C++ 9.0 to 14.0.

    Script created by analysing Microsoft environment configuration files like
    "vcvars[...].bat", "SetEnv.Cmd", "vcbuildtools.bat", ...

    Parameters
    ----------
    arch: str
        Target architecture.
    vc_ver: float
        Required Microsoft Visual C++ version. If not set, autodetect the last
        version.
    vc_min_ver: float
        Minimum Microsoft Visual C++ version.
    icCsdt|�|_t|j�|_t|j|�|_|j|kr`d}tjj	|��ndS(Ns.No suitable Microsoft Visual C++ version found(
R=RURTRzRwtsiR|RRR(RBR%R|R*R�((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRCIscCs
|jjS(s/
        Microsoft Visual C++ version.
        (R�R|(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR|RscCs�ddg}|jdkrd|jjdtdt�}|dg7}|dg7}|d|g7}ng|D]!}tjj|jj|�^qkS(	s/
        Microsoft Visual Studio Tools
        sCommon7\IDEs
Common7\Toolsg,@RIR?s1Common7\IDE\CommonExtensions\Microsoft\TestWindowsTeam Tools\Performance ToolssTeam Tools\Performance Tools%s(	R|RURJRoRRRR�R�(RBtpathstarch_subdirR((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytVSToolsYs

cCs4tjj|jjd�tjj|jjd�gS(sL
        Microsoft Visual C++ & Microsoft Foundation Class Includes
        tIncludesATLMFC\Include(RRRR�R�(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt
VCIncludeshscCs�|jdkr'|jjdt�}n|jjdt�}d|d|g}|jdkrs|d|g7}ng|D]!}tjj|jj|�^qzS(sM
        Microsoft Visual C++ & Microsoft Foundation Class Libraries
        g.@R?RIsLib%ssATLMFC\Lib%sg,@sLib\store%s(	R|RURKRoRRRR�R�(RBR�R�R((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytVCLibrariespscCs/|jdkrgStjj|jjd�gS(sA
        Microsoft Visual C++ store references Libraries
        g,@sLib\store\references(R|RRRR�R�(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytVCStoreRefs�scCs�|j}tjj|jd�g}|jdkr9tnt}|jj	|�}|r}|tjj|jd|�g7}n|jdkr�d|jj
dt�}|tjj|j|�g7}n�|jdkrs|jj�r�dnd}|tjj|j||jjd	t��g7}|jj
|jjkr�|tjj|j||jj
d	t��g7}q�n|tjj|jd
�g7}|S(s,
        Microsoft Visual C++ Tools
        t
VCPackagesg$@sBin%sg,@RIg.@s
bin\HostX86%ss
bin\HostX64%sR?tBin(R�RRRR�R|RoRSRURNRJRHRKRGRE(RBR�ttoolsRLR�Rthost_dir((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytVCTools�s&	&"&,cCs�|jdkrJ|jjdtdt�}tjj|jjd|�gS|jjdt�}tjj|jjd�}|j	}tjj|d||f�gSdS(s1
        Microsoft Windows SDK Libraries
        g$@RIR?sLib%sR�s%sum%sN(
R|RURKRoRRRR�R�t_sdk_subdir(RBR�R�tlibver((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytOSLibraries�s 	cCs�tjj|jjd�}|jdkrC|tjj|d�gS|jdkr^|j}nd}tjj|d|�tjj|d|�tjj|d|�gSd	S(
s/
        Microsoft Windows SDK Include
        tincludeg$@tglg,@R
s%sshareds%sums%swinrtN(RRRR�R�R|R�(RBR�tsdkver((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt
OSIncludes�scCstjj|jjd�}g}|jdkr@||j7}n|jdkrn|tjj|d�g7}n|jdkr||tjj|jjd�tjj|dd�tjj|d	d�tjj|d
d�tjj|jjddd
|jddd�g7}n|S(s7
        Microsoft Windows SDK Libraries Paths
        t
Referencesg"@g&@sCommonConfiguration\Neutralg,@t
UnionMetadatas'Windows.Foundation.UniversalApiContracts1.0.0.0s%Windows.Foundation.FoundationContracts,Windows.Networking.Connectivity.WwanContractt
ExtensionSDKssMicrosoft.VCLibss%0.1ftCommonConfigurationtneutral(RRRR�R�R|R�(RBtreftlibpath((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt	OSLibpath�s>					
cCst|j��S(s-
        Microsoft Windows SDK Tools
        (tlistt
_sdk_tools(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytSdkTools�sccs�|jdkrG|jdkr$dnd}tjj|jj|�Vn|jj�s�|jjdt	�}d|}tjj|jj|�Vn|jdks�|jdkr
|jj
�r�d}n|jjd	t	dt	�}d
|}tjj|jj|�Vnl|jdkrvtjj|jjd�}|jjdt	�}|jj}tjj|d||f�Vn|jjr�|jjVndS(
s=
        Microsoft Windows SDK Tools paths generator
        g.@g&@R�sBin\x86R?sBin%sg$@R
RIsBin\NETFX 4.0 Tools%ss%s%sN(
R|RRRR�R�RURHRJRoRFR�R�(RBtbin_dirR�RR�((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR��s(
	
!cCs|jj}|rd|SdS(s6
        Microsoft Windows SDK version subdir
        s%s\R
(R�R�(RBtucrtver((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR�scCs/|jdkrgStjj|jjd�gS(s-
        Microsoft Windows SDK Setup
        g"@tSetup(R|RRRR�R�(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytSdkSetup%scCs�|j}|j}|jdkrDt}|j�o>|j�}n6|j�pY|j�}|jdkpw|jdk}g}|r�|g|jD]}t	j
j|j|�^q�7}n|r�|g|j
D]}t	j
j|j|�^q�7}n|S(s0
        Microsoft .NET Framework Tools
        g$@R@(RUR�R|RoRFRHRGRER�RRRR�R�R�(RBRUR�t	include32t	include64R�R$((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytFxTools/s		//cCsU|jdks|jjr gS|jjdt�}tjj|jjd|�gS(s8
        Microsoft .Net Framework SDK Libraries
        g,@R?slib\um%s(	R|R�R�RURKRoRRR(RBR�((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytNetFxSDKLibrariesGscCs<|jdks|jjr gStjj|jjd�gS(s7
        Microsoft .Net Framework SDK Includes
        g,@s
include\um(R|R�R�RRR(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytNetFxSDKIncludesRscCstjj|jjd�gS(s>
        Microsoft Visual Studio Team System Database
        s
VSTSDB\Deploy(RRRR�R�(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytVsTDb\scCs�|jdkrgS|jdkrF|jj}|jjdt�}n|jj}d}d|j|f}tjj	||�g}|jdkr�|tjj	||d�g7}n|S(s(
        Microsoft Build Engine
        g(@g.@RIR
sMSBuild\%0.1f\bin%stRoslyn(
R|R�R�RURJRoR�RRR(RBt	base_pathR�Rtbuild((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytMSBuildcs"cCs/|jdkrgStjj|jjd�gS(s.
        Microsoft HTML Help Workshop
        g&@sHTML Help Workshop(R|RRRR�R�(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytHTMLHelpWorkshopzscCsl|jdkrgS|jjdt�}tjj|jjd�}|j	}tjj|d||f�gS(s=
        Microsoft Universal C Runtime SDK Libraries
        g,@R?R�s%sucrt%s(
R|RURKRoRRRR�R�t_ucrt_subdir(RBR�R�R�((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt
UCRTLibraries�s	cCsK|jdkrgStjj|jjd�}tjj|d|j�gS(s;
        Microsoft Universal C Runtime SDK Include
        g,@R�s%sucrt(R|RRRR�R�R�(RBR�((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytUCRTIncludes�scCs|jj}|rd|SdS(sB
        Microsoft Universal C Runtime SDK version subdir
        s%s\R
(R�R�(RBR�((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR��scCs,|jdkr"|jdkr"gS|jjS(s%
        Microsoft Visual F#
        g&@g(@(R|R�R�(RB((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytFSharp�scCs�|jjdt�}|jdkr9|jj}d}n|jjjdd�}d}|jdkrldn|j}|||j|f}tjj	||�S(sA
        Microsoft Visual C++ runtime redistribuable dll
        R?is-redist%s\Microsoft.VC%d0.CRT\vcruntime%d0.dlls\Toolss\Redists.onecore%s\Microsoft.VC%d0.CRT\vcruntime%d0.dllg,@(
RURKRoR|R�R�RARRR(RBR�tredist_patht	vcruntimetdll_ver((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pytVCRuntimeRedist�s	cCstd|jd|j|j|j|jg|�d|jd|j|j|j|j	|j
g|�d|jd|j|j|j|jg|�d|jd|j
|j|j|j|j|j|j|j|jg	|��}|jdkrtjj|j�r|j|d<n|S(s�
        Return environment dict.

        Parameters
        ----------
        exists: bool
            It True, only return existing paths.
        R�R�R�Ritpy_vcruntime_redist(tdictt_build_pathsR�R�RR�R�R�R�R�R�R�R�R�R�R�R�R�R�R�RR|RRRR(RBtexiststenv((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR"�sD												$c
Cs�tjj|�}tj|d�jtj�}tj||�}|rctt	tj
j|��n|}|s�d|j�}t
jj|��n|j|�}	tjj|	�S(s
        Given an environment variable name and specified paths,
        return a pathsep-separated string of paths containing
        unique, extant, directories from those paths and from
        the environment variable. Raise an error if no paths
        are resolved.
        R
s %s environment variable is empty(t	itertoolstchaint
from_iterableRPRQtsplitRtpathsepR�tfilterRR�tupperRRRt_unique_everseenR(
RBRqtspec_path_listsR	t
spec_pathst	env_pathsR�textant_pathsR�tunique_paths((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR�s	'ccs�t�}|j}|dkrMxgt|j|�D]}||�|Vq1Wn;x8|D]0}||�}||krT||�|VqTqTWdS(s�
        List unique elements, preserving order.
        Remember all elements ever seen.

        _unique_everseen('AAAABBBCCDAABBB') --> A B C D

        _unique_everseen('ABBCcAD', str.lower) --> A B C D
        N(tsettaddRRt__contains__(RBtiterableRtseentseen_addtelementtk((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyRs			


N("RRRORRCRRR|R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�RR�RRRoR"RR(((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyR!1s:		 -	




-	(!RORR-tplatformRtdistutils.errorsRt#setuptools.extern.packaging.versionRtsetuptools.extern.six.movesRtmonkeyRtsystemRtenvironRPRtImportErrorRRt_msvc9_suppress_errorstdistutils.msvc9compilerRRRR+R3R#R=RTRwR!(((s3/usr/lib/python2.7/site-packages/setuptools/msvc.pyt<module>s:	
	+/	&	
%[��aextern/__init__.py000064400000004703151733473760010206 0ustar00import sys


class VendorImporter:
    """
    A PEP 302 meta path importer for finding optionally-vendored
    or otherwise naturally-installed packages from root_name.
    """

    def __init__(self, root_name, vendored_names=(), vendor_pkg=None):
        self.root_name = root_name
        self.vendored_names = set(vendored_names)
        self.vendor_pkg = vendor_pkg or root_name.replace('extern', '_vendor')

    @property
    def search_path(self):
        """
        Search first the vendor package then as a natural package.
        """
        yield self.vendor_pkg + '.'
        yield ''

    def find_module(self, fullname, path=None):
        """
        Return self when fullname starts with root_name and the
        target module is one vendored through this importer.
        """
        root, base, target = fullname.partition(self.root_name + '.')
        if root:
            return
        if not any(map(target.startswith, self.vendored_names)):
            return
        return self

    def load_module(self, fullname):
        """
        Iterate over the search path to locate and load fullname.
        """
        root, base, target = fullname.partition(self.root_name + '.')
        for prefix in self.search_path:
            try:
                extant = prefix + target
                __import__(extant)
                mod = sys.modules[extant]
                sys.modules[fullname] = mod
                # mysterious hack:
                # Remove the reference to the extant package/module
                # on later Python versions to cause relative imports
                # in the vendor package to resolve the same modules
                # as those going through this importer.
                if sys.version_info > (3, 3):
                    del sys.modules[extant]
                return mod
            except ImportError:
                pass
        else:
            raise ImportError(
                "The '{target}' package is required; "
                "normally this is bundled with this package so if you get "
                "this warning, consult the packager of your "
                "distribution.".format(**locals())
            )

    def install(self):
        """
        Install this importer into sys.meta_path if not already present.
        """
        if self not in sys.meta_path:
            sys.meta_path.append(self)


names = 'six', 'packaging', 'pyparsing',
VendorImporter(__name__, names, 'setuptools._vendor').install()
extern/__init__.pyo000064400000005561151733473760010370 0ustar00�
�fc@s?ddlZddd��YZd	Zeeed�j�dS(
i����NtVendorImportercBsJeZdZddd�Zed��Zdd�Zd�Zd�Z	RS(s�
    A PEP 302 meta path importer for finding optionally-vendored
    or otherwise naturally-installed packages from root_name.
    cCs7||_t|�|_|p-|jdd�|_dS(Ntexternt_vendor(t	root_nametsettvendored_namestreplacet
vendor_pkg(tselfRRR((s>/usr/lib/python2.7/site-packages/setuptools/extern/__init__.pyt__init__
s	ccs|jdVdVdS(sL
        Search first the vendor package then as a natural package.
        t.tN(R(R((s>/usr/lib/python2.7/site-packages/setuptools/extern/__init__.pytsearch_pathscCsL|j|jd�\}}}|r)dStt|j|j��sHdS|S(s�
        Return self when fullname starts with root_name and the
        target module is one vendored through this importer.
        R
N(t	partitionRtanytmapt
startswithR(Rtfullnametpathtroottbasettarget((s>/usr/lib/python2.7/site-packages/setuptools/extern/__init__.pytfind_modulescCs�|j|jd�\}}}x�|jD]l}yR||}t|�tj|}|tj|<tjdkr|tj|=n|SWq)tk
r�q)Xq)Wtdjt	����dS(sK
        Iterate over the search path to locate and load fullname.
        R
is�The '{target}' package is required; normally this is bundled with this package so if you get this warning, consult the packager of your distribution.N(ii(
R
RRt
__import__tsystmodulestversion_infotImportErrortformattlocals(RRRRRtprefixtextanttmod((s>/usr/lib/python2.7/site-packages/setuptools/extern/__init__.pytload_module#s





cCs&|tjkr"tjj|�ndS(sR
        Install this importer into sys.meta_path if not already present.
        N(Rt	meta_pathtappend(R((s>/usr/lib/python2.7/site-packages/setuptools/extern/__init__.pytinstall@s(N(
t__name__t
__module__t__doc__tNoneR	tpropertyRRR!R$(((s>/usr/lib/python2.7/site-packages/setuptools/extern/__init__.pyRs	tsixt	packagingt	pyparsingssetuptools._vendor((R*R+R,(RRtnamesR%R$(((s>/usr/lib/python2.7/site-packages/setuptools/extern/__init__.pyt<module>sDextern/__init__.pyc000064400000005561151733473760010354 0ustar00�
�fc@s?ddlZddd��YZd	Zeeed�j�dS(
i����NtVendorImportercBsJeZdZddd�Zed��Zdd�Zd�Zd�Z	RS(s�
    A PEP 302 meta path importer for finding optionally-vendored
    or otherwise naturally-installed packages from root_name.
    cCs7||_t|�|_|p-|jdd�|_dS(Ntexternt_vendor(t	root_nametsettvendored_namestreplacet
vendor_pkg(tselfRRR((s>/usr/lib/python2.7/site-packages/setuptools/extern/__init__.pyt__init__
s	ccs|jdVdVdS(sL
        Search first the vendor package then as a natural package.
        t.tN(R(R((s>/usr/lib/python2.7/site-packages/setuptools/extern/__init__.pytsearch_pathscCsL|j|jd�\}}}|r)dStt|j|j��sHdS|S(s�
        Return self when fullname starts with root_name and the
        target module is one vendored through this importer.
        R
N(t	partitionRtanytmapt
startswithR(Rtfullnametpathtroottbasettarget((s>/usr/lib/python2.7/site-packages/setuptools/extern/__init__.pytfind_modulescCs�|j|jd�\}}}x�|jD]l}yR||}t|�tj|}|tj|<tjdkr|tj|=n|SWq)tk
r�q)Xq)Wtdjt	����dS(sK
        Iterate over the search path to locate and load fullname.
        R
is�The '{target}' package is required; normally this is bundled with this package so if you get this warning, consult the packager of your distribution.N(ii(
R
RRt
__import__tsystmodulestversion_infotImportErrortformattlocals(RRRRRtprefixtextanttmod((s>/usr/lib/python2.7/site-packages/setuptools/extern/__init__.pytload_module#s





cCs&|tjkr"tjj|�ndS(sR
        Install this importer into sys.meta_path if not already present.
        N(Rt	meta_pathtappend(R((s>/usr/lib/python2.7/site-packages/setuptools/extern/__init__.pytinstall@s(N(
t__name__t
__module__t__doc__tNoneR	tpropertyRRR!R$(((s>/usr/lib/python2.7/site-packages/setuptools/extern/__init__.pyRs	tsixt	packagingt	pyparsingssetuptools._vendor((R*R+R,(RRtnamesR%R$(((s>/usr/lib/python2.7/site-packages/setuptools/extern/__init__.pyt<module>sDglibc.py000064400000006112151733473760006216 0ustar00# This file originally from pip:
# https://github.com/pypa/pip/blob/8f4f15a5a95d7d5b511ceaee9ed261176c181970/src/pip/_internal/utils/glibc.py
from __future__ import absolute_import

import ctypes
import re
import warnings


def glibc_version_string():
    "Returns glibc version string, or None if not using glibc."

    # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen
    # manpage says, "If filename is NULL, then the returned handle is for the
    # main program". This way we can let the linker do the work to figure out
    # which libc our process is actually using.
    process_namespace = ctypes.CDLL(None)
    try:
        gnu_get_libc_version = process_namespace.gnu_get_libc_version
    except AttributeError:
        # Symbol doesn't exist -> therefore, we are not linked to
        # glibc.
        return None

    # Call gnu_get_libc_version, which returns a string like "2.5"
    gnu_get_libc_version.restype = ctypes.c_char_p
    version_str = gnu_get_libc_version()
    # py2 / py3 compatibility:
    if not isinstance(version_str, str):
        version_str = version_str.decode("ascii")

    return version_str


# Separated out from have_compatible_glibc for easier unit testing
def check_glibc_version(version_str, required_major, minimum_minor):
    # Parse string and check against requested version.
    #
    # We use a regexp instead of str.split because we want to discard any
    # random junk that might come after the minor version -- this might happen
    # in patched/forked versions of glibc (e.g. Linaro's version of glibc
    # uses version strings like "2.20-2014.11"). See gh-3588.
    m = re.match(r"(?P<major>[0-9]+)\.(?P<minor>[0-9]+)", version_str)
    if not m:
        warnings.warn("Expected glibc version with 2 components major.minor,"
                      " got: %s" % version_str, RuntimeWarning)
        return False
    return (int(m.group("major")) == required_major and
            int(m.group("minor")) >= minimum_minor)


def have_compatible_glibc(required_major, minimum_minor):
    version_str = glibc_version_string()
    if version_str is None:
        return False
    return check_glibc_version(version_str, required_major, minimum_minor)


# platform.libc_ver regularly returns completely nonsensical glibc
# versions. E.g. on my computer, platform says:
#
#   ~$ python2.7 -c 'import platform; print(platform.libc_ver())'
#   ('glibc', '2.7')
#   ~$ python3.5 -c 'import platform; print(platform.libc_ver())'
#   ('glibc', '2.9')
#
# But the truth is:
#
#   ~$ ldd --version
#   ldd (Debian GLIBC 2.22-11) 2.22
#
# This is unfortunate, because it means that the linehaul data on libc
# versions that was generated by pip 8.1.2 and earlier is useless and
# misleading. Solution: instead of using platform, use our code that actually
# works.
def libc_ver():
    """Try to determine the glibc version

    Returns a tuple of strings (lib, version) which default to empty strings
    in case the lookup fails.
    """
    glibc_version = glibc_version_string()
    if glibc_version is None:
        return ("", "")
    else:
        return ("glibc", glibc_version)
archive_util.pyo000064400000013776151733473760010011 0ustar00�
�fc@s�dZddlZddlZddlZddlZddlZddlZddlmZddl	m
Z
ddddd	d
dgZd	efd��YZd
�Z
e
dd�Ze
d�Ze
d�Ze
d�ZeeefZdS(s/Utilities for extracting common archive formatsi����N(tDistutilsError(tensure_directorytunpack_archivetunpack_zipfiletunpack_tarfiletdefault_filtertUnrecognizedFormattextraction_driverstunpack_directorycBseZdZRS(s#Couldn't recognize the archive type(t__name__t
__module__t__doc__(((s;/usr/lib/python2.7/site-packages/setuptools/archive_util.pyRscCs|S(s@The default progress/filter callback; returns True for all files((tsrctdst((s;/usr/lib/python2.7/site-packages/setuptools/archive_util.pyRscCsZxS|ptD]5}y||||�Wntk
r=q
q
XdSq
Wtd|��dS(s�Unpack `filename` to `extract_dir`, or raise ``UnrecognizedFormat``

    `progress_filter` is a function taking two arguments: a source path
    internal to the archive ('/'-separated), and a filesystem path where it
    will be extracted.  The callback must return the desired extract path
    (which may be the same as the one passed in), or else ``None`` to skip
    that file or directory.  The callback can thus be used to report on the
    progress of the extraction, as well as to filter the items extracted or
    alter their extraction paths.

    `drivers`, if supplied, must be a non-empty sequence of functions with the
    same signature as this function (minus the `drivers` argument), that raise
    ``UnrecognizedFormat`` if they do not support extracting the designated
    archive type.  The `drivers` are tried in sequence until one is found that
    does not raise an error, or until all are exhausted (in which case
    ``UnrecognizedFormat`` is raised).  If you do not supply a sequence of
    drivers, the module's ``extraction_drivers`` constant will be used, which
    means that ``unpack_zipfile`` and ``unpack_tarfile`` will be tried, in that
    order.
    Ns!Not a recognized archive type: %s(RR(tfilenametextract_dirtprogress_filtertdriverstdriver((s;/usr/lib/python2.7/site-packages/setuptools/archive_util.pyRs
cCs:tjj|�s%td|��nid|f|6}x�tj|�D]�\}}}||\}}xD|D]<}	||	dtjj||	�f|tjj||	�<qnWx�|D]y}
tjj||
�}|||
|�}|s�q�nt|�tjj||
�}
tj|
|�tj	|
|�q�WqHWdS(s�"Unpack" a directory, using the same interface as for archives

    Raises ``UnrecognizedFormat`` if `filename` is not a directory
    s%s is not a directorytt/N(
tostpathtisdirRtwalktjoinRtshutiltcopyfiletcopystat(RRRtpathstbasetdirstfilesRR
tdtfttarget((s;/usr/lib/python2.7/site-packages/setuptools/archive_util.pyR?s"
:

c
CsGtj|�s%td|f��ntj|��
}x|j�D]�}|j}|jd�sDd|jd�kr}qDntj	j
||jd��}|||�}|s�qDn|jd�r�t|�nAt|�|j
|j�}t|d��}|j|�WdQX|jd?}	|	rDtj||	�qDqDWWdQXdS(s�Unpack zip `filename` to `extract_dir`

    Raises ``UnrecognizedFormat`` if `filename` is not a zipfile (as determined
    by ``zipfile.is_zipfile()``).  See ``unpack_archive()`` for an explanation
    of the `progress_filter` argument.
    s%s is not a zip fileRs..twbNi(tzipfilet
is_zipfileRtZipFiletinfolistRt
startswithtsplitRRRtendswithRtreadtopentwritet
external_attrtchmod(
RRRtztinfotnameR#tdataR"tunix_attributes((s;/usr/lib/python2.7/site-packages/setuptools/archive_util.pyRZs(	$


c

Cs�ytj|�}Wn'tjk
r<td|f��nXtj|���d�|_xk|D]c}|j}|jd�r`d|j	d�kr`t
jj||j	d��}x�|dk	r6|j�s�|j�r6|j}|j�r$tj|j�}tj||�}tj|�}n|j|�}q�W|dk	r�|j�s[|j�r�|||�}	|	r�|	jt
j�r�|	d }	ny|j||	�Wq�tjk
r�q�Xq�q�q`q`WtSWdQXdS(s�Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir`

    Raises ``UnrecognizedFormat`` if `filename` is not a tarfile (as determined
    by ``tarfile.open()``).  See ``unpack_archive()`` for an explanation
    of the `progress_filter` argument.
    s/%s is not a compressed or uncompressed tar filecWsdS(N(tNone(targs((s;/usr/lib/python2.7/site-packages/setuptools/archive_util.pyt<lambda>�RRs..i����N(ttarfileR-tTarErrorRt
contextlibtclosingtchownR3R)R*RRRR6tislnktissymtlinknamet	posixpathtdirnametnormpatht
_getmembertisfileRR+tsept_extract_membertExtractErrortTrue(
RRRttarobjtmemberR3t
prelim_dsttlinkpathRt	final_dst((s;/usr/lib/python2.7/site-packages/setuptools/archive_util.pyRs8
	%'	$
(RR%R9RRRAR;tdistutils.errorsRt
pkg_resourcesRt__all__RRR6RRRRR(((s;/usr/lib/python2.7/site-packages/setuptools/archive_util.pyt<module>s$	"%.glibc.pyo000064400000003650151733473770006402 0ustar00�
�fc@@s\ddlmZddlZddlZddlZd�Zd�Zd�Zd�ZdS(i(tabsolute_importNcC@sktjd�}y
|j}Wntk
r0dSXtj|_|�}t|t�sg|j	d�}n|S(s9Returns glibc version string, or None if not using glibc.tasciiN(
tctypestCDLLtNonetgnu_get_libc_versiontAttributeErrortc_char_ptrestypet
isinstancetstrtdecode(tprocess_namespaceRtversion_str((s4/usr/lib/python2.7/site-packages/setuptools/glibc.pytglibc_version_string
s

	cC@sdtjd|�}|s0tjd|t�tSt|jd��|koct|jd��|kS(Ns$(?P<major>[0-9]+)\.(?P<minor>[0-9]+)s=Expected glibc version with 2 components major.minor, got: %stmajortminor(tretmatchtwarningstwarntRuntimeWarningtFalsetinttgroup(R
trequired_majort
minimum_minortm((s4/usr/lib/python2.7/site-packages/setuptools/glibc.pytcheck_glibc_version$s	cC@s)t�}|dkrtSt|||�S(N(RRRR(RRR
((s4/usr/lib/python2.7/site-packages/setuptools/glibc.pythave_compatible_glibc4s	cC@s't�}|dkrdSd|fSdS(s�Try to determine the glibc version

    Returns a tuple of strings (lib, version) which default to empty strings
    in case the lookup fails.
    ttglibcN(RR(RR(t
glibc_version((s4/usr/lib/python2.7/site-packages/setuptools/glibc.pytlibc_verLs	(	t
__future__RRRRRRRR!(((s4/usr/lib/python2.7/site-packages/setuptools/glibc.pyt<module>s			unicode_utils.pyc000064400000002700151733473770010147 0ustar00�
�fc@sGddlZddlZddlmZd�Zd�Zd�ZdS(i����N(tsixcCsnt|tj�r"tjd|�Sy4|jd�}tjd|�}|jd�}Wntk
rinX|S(NtNFDsutf-8(t
isinstanceRt	text_typetunicodedatat	normalizetdecodetencodetUnicodeError(tpath((s</usr/lib/python2.7/site-packages/setuptools/unicode_utils.pyt	decomposes
cCsqt|tj�r|Stj�p%d}|df}x6|D].}y|j|�SWq;tk
rhq;q;Xq;WdS(sY
    Ensure that the given path is decoded,
    NONE when no expected encoding works
    sutf-8N(RRRtsystgetfilesystemencodingRtUnicodeDecodeError(R	tfs_enct
candidatestenc((s</usr/lib/python2.7/site-packages/setuptools/unicode_utils.pytfilesys_decodes

cCs*y|j|�SWntk
r%dSXdS(s/turn unicode encoding into a functional routineN(RtUnicodeEncodeErrortNone(tstringR((s</usr/lib/python2.7/site-packages/setuptools/unicode_utils.pyt
try_encode's
(RRtsetuptools.externRR
RR(((s</usr/lib/python2.7/site-packages/setuptools/unicode_utils.pyt<module>s
		py31compat.py000064400000002250151733473770007136 0ustar00__all__ = ['get_config_vars', 'get_path']

try:
    # Python 2.7 or >=3.2
    from sysconfig import get_config_vars, get_path
except ImportError:
    from distutils.sysconfig import get_config_vars, get_python_lib

    def get_path(name):
        if name not in ('platlib', 'purelib'):
            raise ValueError("Name must be purelib or platlib")
        return get_python_lib(name == 'platlib')


try:
    # Python >=3.2
    from tempfile import TemporaryDirectory
except ImportError:
    import shutil
    import tempfile

    class TemporaryDirectory(object):
        """
        Very simple temporary directory context manager.
        Will try to delete afterward, but will also ignore OS and similar
        errors on deletion.
        """

        def __init__(self):
            self.name = None  # Handle mkdtemp raising an exception
            self.name = tempfile.mkdtemp()

        def __enter__(self):
            return self.name

        def __exit__(self, exctype, excvalue, exctrace):
            try:
                shutil.rmtree(self.name, True)
            except OSError:  # removal errors are not the only possible
                pass
            self.name = None
ssl_support.py000064400000020454151733473770007541 0ustar00import os
import socket
import atexit
import re
import functools

from setuptools.extern.six.moves import urllib, http_client, map, filter

from pkg_resources import ResolutionError, ExtractionError

try:
    import ssl
except ImportError:
    ssl = None

__all__ = [
    'VerifyingHTTPSHandler', 'find_ca_bundle', 'is_available', 'cert_paths',
    'opener_for'
]

cert_paths = """
/etc/pki/tls/certs/ca-bundle.crt
/etc/ssl/certs/ca-certificates.crt
/usr/share/ssl/certs/ca-bundle.crt
/usr/local/share/certs/ca-root.crt
/etc/ssl/cert.pem
/System/Library/OpenSSL/certs/cert.pem
/usr/local/share/certs/ca-root-nss.crt
/etc/ssl/ca-bundle.pem
""".strip().split()

try:
    HTTPSHandler = urllib.request.HTTPSHandler
    HTTPSConnection = http_client.HTTPSConnection
except AttributeError:
    HTTPSHandler = HTTPSConnection = object

is_available = ssl is not None and object not in (HTTPSHandler, HTTPSConnection)


try:
    from ssl import CertificateError, match_hostname
except ImportError:
    try:
        from backports.ssl_match_hostname import CertificateError
        from backports.ssl_match_hostname import match_hostname
    except ImportError:
        CertificateError = None
        match_hostname = None

if not CertificateError:

    class CertificateError(ValueError):
        pass


if not match_hostname:

    def _dnsname_match(dn, hostname, max_wildcards=1):
        """Matching according to RFC 6125, section 6.4.3

        http://tools.ietf.org/html/rfc6125#section-6.4.3
        """
        pats = []
        if not dn:
            return False

        # Ported from python3-syntax:
        # leftmost, *remainder = dn.split(r'.')
        parts = dn.split(r'.')
        leftmost = parts[0]
        remainder = parts[1:]

        wildcards = leftmost.count('*')
        if wildcards > max_wildcards:
            # Issue #17980: avoid denials of service by refusing more
            # than one wildcard per fragment.  A survey of established
            # policy among SSL implementations showed it to be a
            # reasonable choice.
            raise CertificateError(
                "too many wildcards in certificate DNS name: " + repr(dn))

        # speed up common case w/o wildcards
        if not wildcards:
            return dn.lower() == hostname.lower()

        # RFC 6125, section 6.4.3, subitem 1.
        # The client SHOULD NOT attempt to match a presented identifier in which
        # the wildcard character comprises a label other than the left-most label.
        if leftmost == '*':
            # When '*' is a fragment by itself, it matches a non-empty dotless
            # fragment.
            pats.append('[^.]+')
        elif leftmost.startswith('xn--') or hostname.startswith('xn--'):
            # RFC 6125, section 6.4.3, subitem 3.
            # The client SHOULD NOT attempt to match a presented identifier
            # where the wildcard character is embedded within an A-label or
            # U-label of an internationalized domain name.
            pats.append(re.escape(leftmost))
        else:
            # Otherwise, '*' matches any dotless string, e.g. www*
            pats.append(re.escape(leftmost).replace(r'\*', '[^.]*'))

        # add the remaining fragments, ignore any wildcards
        for frag in remainder:
            pats.append(re.escape(frag))

        pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE)
        return pat.match(hostname)

    def match_hostname(cert, hostname):
        """Verify that *cert* (in decoded format as returned by
        SSLSocket.getpeercert()) matches the *hostname*.  RFC 2818 and RFC 6125
        rules are followed, but IP addresses are not accepted for *hostname*.

        CertificateError is raised on failure. On success, the function
        returns nothing.
        """
        if not cert:
            raise ValueError("empty or no certificate")
        dnsnames = []
        san = cert.get('subjectAltName', ())
        for key, value in san:
            if key == 'DNS':
                if _dnsname_match(value, hostname):
                    return
                dnsnames.append(value)
        if not dnsnames:
            # The subject is only checked when there is no dNSName entry
            # in subjectAltName
            for sub in cert.get('subject', ()):
                for key, value in sub:
                    # XXX according to RFC 2818, the most specific Common Name
                    # must be used.
                    if key == 'commonName':
                        if _dnsname_match(value, hostname):
                            return
                        dnsnames.append(value)
        if len(dnsnames) > 1:
            raise CertificateError("hostname %r "
                "doesn't match either of %s"
                % (hostname, ', '.join(map(repr, dnsnames))))
        elif len(dnsnames) == 1:
            raise CertificateError("hostname %r "
                "doesn't match %r"
                % (hostname, dnsnames[0]))
        else:
            raise CertificateError("no appropriate commonName or "
                "subjectAltName fields were found")


class VerifyingHTTPSHandler(HTTPSHandler):
    """Simple verifying handler: no auth, subclasses, timeouts, etc."""

    def __init__(self, ca_bundle):
        self.ca_bundle = ca_bundle
        HTTPSHandler.__init__(self)

    def https_open(self, req):
        return self.do_open(
            lambda host, **kw: VerifyingHTTPSConn(host, self.ca_bundle, **kw), req
        )


class VerifyingHTTPSConn(HTTPSConnection):
    """Simple verifying connection: no auth, subclasses, timeouts, etc."""

    def __init__(self, host, ca_bundle, **kw):
        HTTPSConnection.__init__(self, host, **kw)
        self.ca_bundle = ca_bundle

    def connect(self):
        sock = socket.create_connection(
            (self.host, self.port), getattr(self, 'source_address', None)
        )

        # Handle the socket if a (proxy) tunnel is present
        if hasattr(self, '_tunnel') and getattr(self, '_tunnel_host', None):
            self.sock = sock
            self._tunnel()
            # http://bugs.python.org/issue7776: Python>=3.4.1 and >=2.7.7
            # change self.host to mean the proxy server host when tunneling is
            # being used. Adapt, since we are interested in the destination
            # host for the match_hostname() comparison.
            actual_host = self._tunnel_host
        else:
            actual_host = self.host

        if hasattr(ssl, 'create_default_context'):
            ctx = ssl.create_default_context(cafile=self.ca_bundle)
            self.sock = ctx.wrap_socket(sock, server_hostname=actual_host)
        else:
            # This is for python < 2.7.9 and < 3.4?
            self.sock = ssl.wrap_socket(
                sock, cert_reqs=ssl.CERT_REQUIRED, ca_certs=self.ca_bundle
            )
        try:
            match_hostname(self.sock.getpeercert(), actual_host)
        except CertificateError:
            self.sock.shutdown(socket.SHUT_RDWR)
            self.sock.close()
            raise


def opener_for(ca_bundle=None):
    """Get a urlopen() replacement that uses ca_bundle for verification"""
    return urllib.request.build_opener(
        VerifyingHTTPSHandler(ca_bundle or find_ca_bundle())
    ).open


# from jaraco.functools
def once(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        if not hasattr(func, 'always_returns'):
            func.always_returns = func(*args, **kwargs)
        return func.always_returns
    return wrapper


@once
def get_win_certfile():
    try:
        import wincertstore
    except ImportError:
        return None

    class CertFile(wincertstore.CertFile):
        def __init__(self):
            super(CertFile, self).__init__()
            atexit.register(self.close)

        def close(self):
            try:
                super(CertFile, self).close()
            except OSError:
                pass

    _wincerts = CertFile()
    _wincerts.addstore('CA')
    _wincerts.addstore('ROOT')
    return _wincerts.name


def find_ca_bundle():
    """Return an existing CA bundle path, or None"""
    extant_cert_paths = filter(os.path.isfile, cert_paths)
    return (
        get_win_certfile()
        or next(extant_cert_paths, None)
        or _certifi_where()
    )


def _certifi_where():
    try:
        return __import__('certifi').where()
    except (ImportError, ResolutionError, ExtractionError):
        pass
unicode_utils.pyo000064400000002700151733473770010163 0ustar00�
�fc@sGddlZddlZddlmZd�Zd�Zd�ZdS(i����N(tsixcCsnt|tj�r"tjd|�Sy4|jd�}tjd|�}|jd�}Wntk
rinX|S(NtNFDsutf-8(t
isinstanceRt	text_typetunicodedatat	normalizetdecodetencodetUnicodeError(tpath((s</usr/lib/python2.7/site-packages/setuptools/unicode_utils.pyt	decomposes
cCsqt|tj�r|Stj�p%d}|df}x6|D].}y|j|�SWq;tk
rhq;q;Xq;WdS(sY
    Ensure that the given path is decoded,
    NONE when no expected encoding works
    sutf-8N(RRRtsystgetfilesystemencodingRtUnicodeDecodeError(R	tfs_enct
candidatestenc((s</usr/lib/python2.7/site-packages/setuptools/unicode_utils.pytfilesys_decodes

cCs*y|j|�SWntk
r%dSXdS(s/turn unicode encoding into a functional routineN(RtUnicodeEncodeErrortNone(tstringR((s</usr/lib/python2.7/site-packages/setuptools/unicode_utils.pyt
try_encode's
(RRtsetuptools.externRR
RR(((s</usr/lib/python2.7/site-packages/setuptools/unicode_utils.pyt<module>s
		ssl_support.pyo000064400000020504151733473770007714 0ustar00�
�fc@s/ddlZddlZddlZddlZddlZddlmZmZmZm	Z	ddl
mZmZyddl
Z
Wnek
r�dZ
nXdddddgZd	j�j�ZyejjZejZWnek
r�eZZnXe
dk	oeeefkZydd
l
mZmZWnUek
r�y$ddlmZddlmZWq�ek
r�dZdZq�XnXes�d
efd��YZnes�dd�Zd�Zndefd��YZdefd��YZ dd�Z!d�Z"e"d��Z#d�Z$d�Z%dS(i����N(turllibthttp_clienttmaptfilter(tResolutionErrortExtractionErrortVerifyingHTTPSHandlertfind_ca_bundletis_availablet
cert_pathst
opener_fors
/etc/pki/tls/certs/ca-bundle.crt
/etc/ssl/certs/ca-certificates.crt
/usr/share/ssl/certs/ca-bundle.crt
/usr/local/share/certs/ca-root.crt
/etc/ssl/cert.pem
/System/Library/OpenSSL/certs/cert.pem
/usr/local/share/certs/ca-root-nss.crt
/etc/ssl/ca-bundle.pem
(tCertificateErrortmatch_hostname(R(RRcBseZRS((t__name__t
__module__(((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyR5sic
CsRg}|stS|jd�}|d}|d}|jd�}||krgtdt|���n|s�|j�|j�kS|dkr�|jd�nY|jd�s�|jd�r�|jtj	|��n"|jtj	|�j
dd	��x$|D]}|jtj	|��q�Wtjd
dj|�dtj
�}	|	j|�S(
spMatching according to RFC 6125, section 6.4.3

        http://tools.ietf.org/html/rfc6125#section-6.4.3
        t.iit*s,too many wildcards in certificate DNS name: s[^.]+sxn--s\*s[^.]*s\As\.s\Z(tFalsetsplittcountRtreprtlowertappendt
startswithtretescapetreplacetcompiletjoint
IGNORECASEtmatch(
tdnthostnamet
max_wildcardstpatstpartstleftmostt	remaindert	wildcardstfragtpat((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyt_dnsname_match;s*

"
&cCs[|std��ng}|jdd
�}xC|D];\}}|dkr4t||�r_dS|j|�q4q4W|s�xc|jdd�D]L}xC|D];\}}|dkr�t||�r�dS|j|�q�q�Wq�Wnt|�dkrtd|d	jtt|��f��n;t|�dkrKtd
||df��ntd��dS(s=Verify that *cert* (in decoded format as returned by
        SSLSocket.getpeercert()) matches the *hostname*.  RFC 2818 and RFC 6125
        rules are followed, but IP addresses are not accepted for *hostname*.

        CertificateError is raised on failure. On success, the function
        returns nothing.
        sempty or no certificatetsubjectAltNametDNSNtsubjectt
commonNameis&hostname %r doesn't match either of %ss, shostname %r doesn't match %ris=no appropriate commonName or subjectAltName fields were found(((	t
ValueErrortgetR)RtlenRRRR(tcertR tdnsnamestsantkeytvaluetsub((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyRos.%cBs eZdZd�Zd�ZRS(s=Simple verifying handler: no auth, subclasses, timeouts, etc.cCs||_tj|�dS(N(t	ca_bundletHTTPSHandlert__init__(tselfR7((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyR9�s	cs�j�fd�|�S(Ncst|�j|�S(N(tVerifyingHTTPSConnR7(thosttkw(R:(s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyt<lambda>�t(tdo_open(R:treq((R:s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyt
https_open�s(R
Rt__doc__R9RB(((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyR�s	R;cBs eZdZd�Zd�ZRS(s@Simple verifying connection: no auth, subclasses, timeouts, etc.cKs tj|||�||_dS(N(tHTTPSConnectionR9R7(R:R<R7R=((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyR9�scCs+tj|j|jft|dd��}t|d�rjt|dd�rj||_|j�|j	}n	|j}tt
d�r�t
jd|j�}|j
|d|�|_n$t
j
|dt
jd|j�|_yt|jj�|�Wn4tk
r&|jjtj�|jj��nXdS(	Ntsource_addresst_tunnelt_tunnel_hosttcreate_default_contexttcafiletserver_hostnamet	cert_reqstca_certs(tsockettcreate_connectionR<tporttgetattrtNonethasattrtsockRFRGtsslRHR7twrap_sockett
CERT_REQUIREDRtgetpeercertRtshutdownt	SHUT_RDWRtclose(R:RStactual_hosttctx((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pytconnect�s$$!	
	

(R
RRCR9R](((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyR;�s	cCs"tjjt|pt���jS(s@Get a urlopen() replacement that uses ca_bundle for verification(Rtrequesttbuild_openerRRtopen(R7((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyR
�s	cs"tj���fd��}|S(Ncs+t�d�s$�||��_n�jS(Ntalways_returns(RRRa(targstkwargs(tfunc(s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pytwrapper�s(t	functoolstwraps(RdRe((Rds:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pytonce�scsnyddl}Wntk
r$dSXd|jf�fd��Y���}|jd�|jd�|jS(Ni����tCertFilecs&eZ�fd�Z�fd�ZRS(cs't�|�j�tj|j�dS(N(tsuperR9tatexittregisterRZ(R:(Ri(s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyR9�scs/yt�|�j�Wntk
r*nXdS(N(RjRZtOSError(R:(Ri(s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyRZ�s
(R
RR9RZ((Ri(s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyRi�stCAtROOT(twincertstoretImportErrorRQRitaddstoretname(Rpt	_wincerts((Ris:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pytget_win_certfile�s
	

cCs4ttjjt�}t�p3t|d�p3t�S(s*Return an existing CA bundle path, or NoneN(	RtostpathtisfileR	RutnextRQt_certifi_where(textant_cert_paths((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyR�s	cCs5ytd�j�SWntttfk
r0nXdS(Ntcertifi(t
__import__twhereRqRR(((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyRzs(&RvRMRkRRftsetuptools.extern.six.movesRRRRt
pkg_resourcesRRRTRqRQt__all__tstripRR	R^R8RDtAttributeErrortobjectRRRtbackports.ssl_match_hostnameR.R)RR;R
RhRuRRz(((s:/usr/lib/python2.7/site-packages/setuptools/ssl_support.pyt<module>sP"

	



4)
(			
site-patch.pyo000064400000003313151733473770007357 0ustar00�
�fc@s&d�Zedkr"e�[ndS(cCs�ddl}ddl}|jjd�}|dksL|jdkrU|rUg}n|j|j�}t|di�}|j	t
|�}|j	jt�}x�|D]�}||ks�|r�q�n|j|�}|dk	r|j
d�}|dk	r�|jd�Pq�q�y.ddl}	|	j
d|g�\}
}}Wntk
rRq�nX|
dkreq�nz|	jd|
||�Wd|
j�XPq�Wtd��tg|j	D]}t|�ddf^q��}
t|dd	�}d	|_x|D]}t|�q�W|j|7_t|d	�\}}d}g}x�|j	D]�}t|�\}}||kr�|dkr�t
|�}n||
ks�|dkr�|j|�qA|j||�|d7}qAW||j	(dS(
Ni����t
PYTHONPATHtwin32tpath_importer_cachetsites$Couldn't find the real 'site' moduleit__egginserti(tsystostenvirontgettNonetplatformtsplittpathseptgetattrtpathtlentdirnamet__file__tfind_moduletload_moduletimptImportErrortclosetdicttmakepathRt
addsitedirtappendtinsert(RRRtpictstdpathtmydirtitemtimportertloaderRtstreamRtdescrtknown_pathstoldpostdtndt	insert_attnew_pathtptnp((s9/usr/lib/python2.7/site-packages/setuptools/site-patch.pyt__boots`"	

"
2	
RN(R,t__name__(((s9/usr/lib/python2.7/site-packages/setuptools/site-patch.pyt<module>s	Gnamespaces.pyc000064400000011651151733473770007425 0ustar00�
�fc@sqddlZddlmZddlZddlmZejjZddd��YZ	de	fd��YZ
dS(	i����N(tlog(tmapt	Installerc	Bs_eZdZd�Zd�Zd�ZdZdZd�Zd�Z	d�Z
ed��ZRS(s
-nspkg.pthcCs�|j�}|sdStjj|j��\}}||j7}|jj|�tj	d|�t
|j|�}|jr�t
|�dSt|d��}|j|�WdQXdS(Ns
Installing %stwt(t_get_all_ns_packagestostpathtsplitextt_get_targett	nspkg_exttoutputstappendRtinfoRt_gen_nspkg_linetdry_runtlisttopent
writelines(tselftnsptfilenametexttlinestf((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pytinstall_namespacess
	
cCsbtjj|j��\}}||j7}tjj|�sAdStjd|�tj|�dS(NsRemoving %s(	RRRRR	texistsRRtremove(RRR((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pytuninstall_namespaces!s
cCs|jS(N(ttarget(R((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyR)ssimport sys, types, oss#has_mfs = sys.version_info > (3, 5)s$p = os.path.join(%(root)s, *%(pth)r)s4importlib = has_mfs and __import__('importlib.util')s-has_mfs and __import__('importlib.machinery')s�m = has_mfs and sys.modules.setdefault(%(pkg)r, importlib.util.module_from_spec(importlib.machinery.PathFinder.find_spec(%(pkg)r, [os.path.dirname(p)])))sCm = m or sys.modules.setdefault(%(pkg)r, types.ModuleType(%(pkg)r))s7mp = (m or []) and m.__dict__.setdefault('__path__',[])s(p not in mp) and mp.append(p)s4m and setattr(sys.modules[%(parent)r], %(child)r, m)cCsdS(Ns$sys._getframe(1).f_locals['sitedir']((R((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyt	_get_rootCscCs|t|�}t|jd��}|j�}|j}|jd�\}}}|rd||j7}ndj|�t�dS(Nt.t;s
(	tstrttupletsplitRt_nspkg_tmplt
rpartitiont_nspkg_tmpl_multitjointlocals(Rtpkgtpthtroott
tmpl_linestparenttseptchild((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyR
Fs	cCs.|jjpg}ttt|j|���S(s,Return sorted list of all package namespaces(tdistributiontnamespace_packagestsortedtflattenRt
_pkg_names(Rtpkgs((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyRQsccs8|jd�}x"|r3dj|�V|j�qWdS(s�
        Given a namespace package, yield the components of that
        package.

        >>> names = Installer._pkg_names('a.b.c')
        >>> set(names) == set(['a', 'a.b', 'a.b.c'])
        True
        RN(R"R&tpop(R(tparts((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyR3Vs
	(	simport sys, types, oss#has_mfs = sys.version_info > (3, 5)s$p = os.path.join(%(root)s, *%(pth)r)s4importlib = has_mfs and __import__('importlib.util')s-has_mfs and __import__('importlib.machinery')s�m = has_mfs and sys.modules.setdefault(%(pkg)r, importlib.util.module_from_spec(importlib.machinery.PathFinder.find_spec(%(pkg)r, [os.path.dirname(p)])))sCm = m or sys.modules.setdefault(%(pkg)r, types.ModuleType(%(pkg)r))s7mp = (m or []) and m.__dict__.setdefault('__path__',[])s(p not in mp) and mp.append(p)(s4m and setattr(sys.modules[%(parent)r], %(child)r, m)(
t__name__t
__module__R	RRRR#R%RR
RtstaticmethodR3(((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyRs$						tDevelopInstallercBseZd�Zd�ZRS(cCstt|j��S(N(treprR tegg_path(R((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyRgscCs|jS(N(tegg_link(R((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyRjs(R7R8RR(((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyR:fs	((Rt	distutilsRt	itertoolstsetuptools.extern.six.movesRtchaint
from_iterableR2RR:(((s9/usr/lib/python2.7/site-packages/setuptools/namespaces.pyt<module>s[archive_util.py000064400000014700151733473770007617 0ustar00"""Utilities for extracting common archive formats"""

import zipfile
import tarfile
import os
import shutil
import posixpath
import contextlib
from distutils.errors import DistutilsError

from pkg_resources import ensure_directory

__all__ = [
    "unpack_archive", "unpack_zipfile", "unpack_tarfile", "default_filter",
    "UnrecognizedFormat", "extraction_drivers", "unpack_directory",
]


class UnrecognizedFormat(DistutilsError):
    """Couldn't recognize the archive type"""


def default_filter(src, dst):
    """The default progress/filter callback; returns True for all files"""
    return dst


def unpack_archive(filename, extract_dir, progress_filter=default_filter,
        drivers=None):
    """Unpack `filename` to `extract_dir`, or raise ``UnrecognizedFormat``

    `progress_filter` is a function taking two arguments: a source path
    internal to the archive ('/'-separated), and a filesystem path where it
    will be extracted.  The callback must return the desired extract path
    (which may be the same as the one passed in), or else ``None`` to skip
    that file or directory.  The callback can thus be used to report on the
    progress of the extraction, as well as to filter the items extracted or
    alter their extraction paths.

    `drivers`, if supplied, must be a non-empty sequence of functions with the
    same signature as this function (minus the `drivers` argument), that raise
    ``UnrecognizedFormat`` if they do not support extracting the designated
    archive type.  The `drivers` are tried in sequence until one is found that
    does not raise an error, or until all are exhausted (in which case
    ``UnrecognizedFormat`` is raised).  If you do not supply a sequence of
    drivers, the module's ``extraction_drivers`` constant will be used, which
    means that ``unpack_zipfile`` and ``unpack_tarfile`` will be tried, in that
    order.
    """
    for driver in drivers or extraction_drivers:
        try:
            driver(filename, extract_dir, progress_filter)
        except UnrecognizedFormat:
            continue
        else:
            return
    else:
        raise UnrecognizedFormat(
            "Not a recognized archive type: %s" % filename
        )


def unpack_directory(filename, extract_dir, progress_filter=default_filter):
    """"Unpack" a directory, using the same interface as for archives

    Raises ``UnrecognizedFormat`` if `filename` is not a directory
    """
    if not os.path.isdir(filename):
        raise UnrecognizedFormat("%s is not a directory" % filename)

    paths = {
        filename: ('', extract_dir),
    }
    for base, dirs, files in os.walk(filename):
        src, dst = paths[base]
        for d in dirs:
            paths[os.path.join(base, d)] = src + d + '/', os.path.join(dst, d)
        for f in files:
            target = os.path.join(dst, f)
            target = progress_filter(src + f, target)
            if not target:
                # skip non-files
                continue
            ensure_directory(target)
            f = os.path.join(base, f)
            shutil.copyfile(f, target)
            shutil.copystat(f, target)


def unpack_zipfile(filename, extract_dir, progress_filter=default_filter):
    """Unpack zip `filename` to `extract_dir`

    Raises ``UnrecognizedFormat`` if `filename` is not a zipfile (as determined
    by ``zipfile.is_zipfile()``).  See ``unpack_archive()`` for an explanation
    of the `progress_filter` argument.
    """

    if not zipfile.is_zipfile(filename):
        raise UnrecognizedFormat("%s is not a zip file" % (filename,))

    with zipfile.ZipFile(filename) as z:
        for info in z.infolist():
            name = info.filename

            # don't extract absolute paths or ones with .. in them
            if name.startswith('/') or '..' in name.split('/'):
                continue

            target = os.path.join(extract_dir, *name.split('/'))
            target = progress_filter(name, target)
            if not target:
                continue
            if name.endswith('/'):
                # directory
                ensure_directory(target)
            else:
                # file
                ensure_directory(target)
                data = z.read(info.filename)
                with open(target, 'wb') as f:
                    f.write(data)
            unix_attributes = info.external_attr >> 16
            if unix_attributes:
                os.chmod(target, unix_attributes)


def unpack_tarfile(filename, extract_dir, progress_filter=default_filter):
    """Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir`

    Raises ``UnrecognizedFormat`` if `filename` is not a tarfile (as determined
    by ``tarfile.open()``).  See ``unpack_archive()`` for an explanation
    of the `progress_filter` argument.
    """
    try:
        tarobj = tarfile.open(filename)
    except tarfile.TarError:
        raise UnrecognizedFormat(
            "%s is not a compressed or uncompressed tar file" % (filename,)
        )
    with contextlib.closing(tarobj):
        # don't do any chowning!
        tarobj.chown = lambda *args: None
        for member in tarobj:
            name = member.name
            # don't extract absolute paths or ones with .. in them
            if not name.startswith('/') and '..' not in name.split('/'):
                prelim_dst = os.path.join(extract_dir, *name.split('/'))

                # resolve any links and to extract the link targets as normal
                # files
                while member is not None and (member.islnk() or member.issym()):
                    linkpath = member.linkname
                    if member.issym():
                        base = posixpath.dirname(member.name)
                        linkpath = posixpath.join(base, linkpath)
                        linkpath = posixpath.normpath(linkpath)
                    member = tarobj._getmember(linkpath)

                if member is not None and (member.isfile() or member.isdir()):
                    final_dst = progress_filter(name, prelim_dst)
                    if final_dst:
                        if final_dst.endswith(os.sep):
                            final_dst = final_dst[:-1]
                        try:
                            # XXX Ugh
                            tarobj._extract_member(member, final_dst)
                        except tarfile.ExtractError:
                            # chown/chmod/mkfifo/mknode/makedev failed
                            pass
        return True


extraction_drivers = unpack_directory, unpack_zipfile, unpack_tarfile
pep425tags.pyc000064400000022166151733473770007207 0ustar00�
�fc@@sdZddlmZddlZddlZddlZddlZddlZddl	Z	ddl
mZddlm
Z
ejd�Zd�Zd	�Zd
�Zd�Zd�Zeed
�Zd�Zd�Zd�Zd�Zd�Zdedddd�Ze�ZdS(s2Generate and work with PEP 425 Compatibility Tags.i(tabsolute_importN(tOrderedDicti(tglibcs(.+)_(\d+)_(\d+)_(.+)cC@sEytj|�SWn-tk
r@}tjdj|�t�dSXdS(Ns{}(t	sysconfigtget_config_vartIOErrortwarningstwarntformattRuntimeWarningtNone(tvarte((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyRs
cC@sUttd�rd}n9tjjd�r3d}ntjdkrKd}nd}|S(s'Return abbreviated implementation name.tpypy_version_infotpptjavatjytclitiptcp(thasattrtsystplatformt
startswith(tpyimpl((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyt
get_abbr_impls			cC@sDtd�}|s"t�dkr@djttt���}n|S(sReturn implementation version.tpy_version_nodotRt(RRtjointmaptstrtget_impl_version_info(timpl_ver((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pytget_impl_ver(scC@sKt�dkr/tjdtjjtjjfStjdtjdfSdS(sQReturn sys.version_info-like tuple for use in decrementing the minor
    version.RiiN(RRtversion_infoR
tmajortminor(((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyR0s
cC@sdjt�t��S(s;
    Returns the Tag for this specific implementation.
    s{}{}(RRR!(((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pytget_impl_tag;scC@sNt|�}|dkrD|r=tjdj|�td�n|�S||kS(sgUse a fallback method for determining SOABI flags if the needed config
    var is unset or unavailable.s?Config variable '{0}' is unset, Python ABI tag may be incorrectiN(RR
RRRR	(RtfallbacktexpectedRtval((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pytget_flagBsc	@smtd�}t��|r
�ddhkr
ttd�r
d}d}d}tdd�d�dk�rvd	}ntd
�fd�d�dk�r�d}ntd
d�ddd�dko�tjdk�r�tjdkr�d}nd�t�|||f}n\|r<|jd�r<d|jd�d}n-|rc|j	dd�j	dd�}nd}|S(sXReturn the ABI tag based on SOABI (if available) or emulate SOABI
    (CPython 2, PyPy).tSOABIRRt
maxunicodeRtPy_DEBUGcS@s
ttd�S(Ntgettotalrefcount(RR(((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyt<lambda>XRRtdt
WITH_PYMALLOCc@s
�dkS(NR(((timpl(s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyR.\RtmtPy_UNICODE_SIZEcS@s
tjdkS(Ni��(RR+(((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyR.`RR'iitus
%s%s%s%s%sscpython-t-it.t_(ii(iiN(RRRRR)R"R!RtsplittreplaceR
(tsoabiR/R2R4tabi((R1s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pytget_abi_tagNs8	(					!cC@s
tjdkS(Ni���(Rtmaxsize(((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyt_is_running_32bitpscC@s�tjdkr�tj�\}}}|jd�}|dkrQt�rQd}n|dkrot�rod}ndj|d|d	|�Stjj�j	dd
�j	dd
�}|dkr�t�r�d
}n|S(s0Return our platform name 'win32', 'linux_x86_64'tdarwinR6tx86_64ti386tppc64tppcsmacosx_{}_{}_{}iiR7R5tlinux_x86_64t
linux_i686(
RRtmac_verR8R>Rt	distutilstutiltget_platformR9(treleaseR7tmachinet	split_vertresult((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyRIts		'	cC@s`t�ddhkrtSyddl}t|j�SWnttfk
rOnXtjdd�S(NRDREiii(	RItFalset
_manylinuxtbooltmanylinux1_compatibletImportErrortAttributeErrorRthave_compatible_glibc(RO((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pytis_manylinux1_compatible�sc@s�g}��fd��tddfddfdd
fd	dfg���|||�rj|j|�nx@�D]8}|�|krq�|||�rq|j|�qqqqW|jd
�|S(s�Return a list of supported arches (including group arches) for
    the given major, minor and machine architecture of an macOS machine.
    c@s�|dkr||fdkS|dkr8||fd	kS|dkrT||fd
kS|dkrp||fdkS|�kr�x+�|D]}�|||�r�tSq�WntS(NRCi
iRBRAiR@(i
i(i
i(i
i(i
i(tTrueRN(R#R$tarchtgarch(t_supports_archtgroups(s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyRY�stfatRARCtintelR@tfat64RBtfat32t	universal(RARC(R@RA(R@RB(R@RARC(Rtappend(R#R$RKtarchesRX((RYRZs9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pytget_darwin_arches�s$			
"
cC@s�g}|dkrug}t�}|d }xGt|ddd�D],}|jdjtt||f���qBWn|p�t�}g}	|p�t�}|r�|g|	dd+nt	�}
ddl
}xK|j�D]=}|djd�r�|
j
|djdd�d�q�q�W|	jtt|
���|	jd	�|s6|pMt�}
|
jd
�rtj|
�}|r|j�\}}}}dj||�}g}xjttt|�d��D]@}x7tt|�||�D]}|j|||f�q�Wq�WqM|
g}n9|dkrDt�rD|
jdd
�|
g}n	|
g}xC|	D];}x2|D]*}
|jd||df||
f�qaWqTWxj|dD]^}|ddhkr�Pnx?|
D]7}x.|D]&}
|jd||f||
f�q�Wq�Wq�Wx3|D](}
|jd|ddd	|
f�qWn|jd||dfd	df�|jd||ddfd	df�xdt|�D]V\}}|jd|fd	df�|dkr�|jd|dd	df�q�q�W|S(scReturn a list of supported tags for each version specified in
    `versions`.

    :param versions: a list of string versions, of the form ["33", "32"],
        or None. The first version will be assumed to support our ABI.
    :param platform: specify the exact platform you want valid
        tags for, or None. If None, use the local system platform.
    :param impl: specify the exact implementation you want valid
        tags for, or None. If None, use the local interpreter impl.
    :param abi: specify the exact abi you want valid
        tags for, or None. If None, use the local interpreter abi.
    i����RiNs.abiR6iitnonetmacosxs{}_{}_%i_%stlinuxt
manylinux1s%s%st31t30spy%stany(R
RtrangeR`RRRRR<tsettimptget_suffixesRtaddR8textendtsortedtlistRIt
_osx_arch_pattmatchRZRtreversedtintRbRUR9t	enumerate(tversionstnoarchRR1R;t	supportedR"R#R$tabistabi3sRltsuffixRWRstnametactual_archttplRaR2tatversionti((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyt
get_supported�sh	
-	(
#"	

,

,
)$(%( t__doc__t
__future__Rtdistutils.utilRGRtreRRRtcollectionsRRRtcompileRrRRR!RR%RVR)R<R>RIRURbR
RNR�timplementation_tag(((s9/usr/lib/python2.7/site-packages/setuptools/pep425tags.pyt<module>s0		
				"				=	___init__.pyc000064400000016711151733473770007047 0ustar00�
�fc@s�dZddlZddlZddlZddlZddlmZddlm	Z	ddl
mZmZddl
ZddlmZddlmZmZddlmZd	d
lmZddd
ddddgZejjZdZeZdgZde fd��YZ!de!fd��YZ"e!j#Z$d�Z%d�Z&ej'j&je&_ej(ej'j)�Z*de*fd��YZ)d�Z+ej,d�Z-ej.�dS(s@Extensions to the 'distutils' for large or complex distributionsi����N(tconvert_path(tfnmatchcase(tfiltertmap(t	Extension(tDistributiontFeature(tRequirei(tmonkeytsetupRRtCommandRRt
find_packagess
lib2to3.fixest
PackageFindercBsSeZdZedddd��Zed��Zed��Zed��ZRS(	sI
    Generate a list of all Python packages found within a directory
    t.t*cCs7t|jt|�|jdd|�|j|���S(s	Return a list all Python packages found within directory 'where'

        'where' is the root directory which will be searched for packages.  It
        should be supplied as a "cross-platform" (i.e. URL-style) path; it will
        be converted to the appropriate local path syntax.

        'exclude' is a sequence of package names to exclude; '*' can be used
        as a wildcard in the names, such that 'foo.*' will exclude all
        subpackages of 'foo' (but not 'foo' itself).

        'include' is a sequence of package names to include.  If it's
        specified, only the named packages will be included.  If it's not
        specified, all found packages will be included.  'include' can contain
        shell style wildcard patterns just like 'exclude'.
        tez_setups*__pycache__(tlistt_find_packages_iterRt
_build_filter(tclstwheretexcludetinclude((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pytfind's		ccs�x�tj|dt�D]�\}}}|}g|(x�|D]�}tjj||�}	tjj|	|�}
|
jtjjd�}d|ks:|j|	�r�q:n||�r�||�r�|Vn|j	|�q:WqWdS(sy
        All the packages found in 'where' that pass the 'include' filter, but
        not the 'exclude' filter.
        tfollowlinksR
N(
tostwalktTruetpathtjointrelpathtreplacetsept_looks_like_packagetappend(RRRRtroottdirstfilestall_dirstdirt	full_pathtrel_pathtpackage((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyR>s%
cCstjjtjj|d��S(s%Does a directory look like a package?s__init__.py(RRtisfileR(R((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyR!Zscs
�fd�S(s�
        Given a list of patterns, return a callable that will be true only if
        the input matches at least one of the patterns.
        cst�fd��D��S(Nc3s!|]}t�d|�VqdS(tpatN(R(t.0R,(tname(s7/usr/lib/python2.7/site-packages/setuptools/__init__.pys	<genexpr>es(tany(R.(tpatterns(R.s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyt<lambda>et((R0((R0s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyR_s((R(	t__name__t
__module__t__doc__tclassmethodRRtstaticmethodR!R(((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyR"stPEP420PackageFindercBseZed��ZRS(cCstS(N(R(R((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyR!is(R3R4R7R!(((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyR8hscCsXtjjtd�|j�D���}|jdt�|jrT|j|j�ndS(Ncss-|]#\}}|dkr||fVqdS(tdependency_linkstsetup_requiresN(R9R:((R-tktv((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pys	<genexpr>us	tignore_option_errors(	t	distutilstcoreRtdicttitemstparse_config_filesRR:tfetch_build_eggs(tattrstdist((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyt_install_setup_requiresqs
	cKst|�tjj|�S(N(RFR>R?R	(RD((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyR	~s
cBs,eZejZeZd�Zdd�ZRS(cKs'tj||�t|�j|�dS(sj
        Construct the command for dist, updating
        vars(self) with any keyword parameters.
        N(t_Commandt__init__tvarstupdate(tselfREtkw((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyRH�sicKs,tj|||�}t|�j|�|S(N(RGtreinitialize_commandRIRJ(RKtcommandtreinit_subcommandsRLtcmd((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyRM�s(R3R4RGR5tFalsetcommand_consumes_argumentsRHRM(((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyR
�s		cCs2d�tj|dt�D�}ttjj|�S(s%
    Find all files under 'path'
    css:|]0\}}}|D]}tjj||�VqqdS(N(RRR(R-tbaseR$R%tfile((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pys	<genexpr>�sR(RRRRRR+(Rtresults((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyt_find_all_simple�scCsRt|�}|tjkrHtjtjjd|�}t||�}nt|�S(s�
    Find all files under 'dir' and return the list of full filenames.
    Unless dir is '.', return full filenames with dir prepended.
    tstart(	RVRtcurdirt	functoolstpartialRRRR(R'R%tmake_rel((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pytfindall�s
(/R5RRYtdistutils.coreR>tdistutils.filelisttdistutils.utilRtfnmatchRtsetuptools.extern.six.movesRRtsetuptools.versiont
setuptoolstsetuptools.extensionRtsetuptools.distRRtsetuptools.dependsRR2Rt__all__tversiont__version__tNonetbootstrap_install_fromRtrun_2to3_on_docteststlib2to3_fixer_packagestobjectRR8RRRFR	R?t
get_unpatchedR
RGRVRXR\t	patch_all(((s7/usr/lib/python2.7/site-packages/setuptools/__init__.pyt<module>s:		F		
		launch.py000064400000001423151733473770006411 0ustar00"""
Launch the Python script on the command line after
setuptools is bootstrapped via import.
"""

# Note that setuptools gets imported implicitly by the
# invocation of this script using python -m setuptools.launch

import tokenize
import sys


def run():
    """
    Run the script in sys.argv[1] as if it had
    been invoked naturally.
    """
    __builtins__
    script_name = sys.argv[1]
    namespace = dict(
        __file__=script_name,
        __name__='__main__',
        __doc__=None,
    )
    sys.argv[:] = sys.argv[1:]

    open_ = getattr(tokenize, 'open', open)
    script = open_(script_name).read()
    norm_script = script.replace('\\r\\n', '\\n')
    code = compile(norm_script, script_name, 'exec')
    exec(code, namespace)


if __name__ == '__main__':
    run()
site-patch.py000064400000004403151733473770007201 0ustar00def __boot():
    import sys
    import os
    PYTHONPATH = os.environ.get('PYTHONPATH')
    if PYTHONPATH is None or (sys.platform == 'win32' and not PYTHONPATH):
        PYTHONPATH = []
    else:
        PYTHONPATH = PYTHONPATH.split(os.pathsep)

    pic = getattr(sys, 'path_importer_cache', {})
    stdpath = sys.path[len(PYTHONPATH):]
    mydir = os.path.dirname(__file__)

    for item in stdpath:
        if item == mydir or not item:
            continue  # skip if current dir. on Windows, or my own directory
        importer = pic.get(item)
        if importer is not None:
            loader = importer.find_module('site')
            if loader is not None:
                # This should actually reload the current module
                loader.load_module('site')
                break
        else:
            try:
                import imp  # Avoid import loop in Python >= 3.3
                stream, path, descr = imp.find_module('site', [item])
            except ImportError:
                continue
            if stream is None:
                continue
            try:
                # This should actually reload the current module
                imp.load_module('site', stream, path, descr)
            finally:
                stream.close()
            break
    else:
        raise ImportError("Couldn't find the real 'site' module")

    known_paths = dict([(makepath(item)[1], 1) for item in sys.path])  # 2.2 comp

    oldpos = getattr(sys, '__egginsert', 0)  # save old insertion position
    sys.__egginsert = 0  # and reset the current one

    for item in PYTHONPATH:
        addsitedir(item)

    sys.__egginsert += oldpos  # restore effective old position

    d, nd = makepath(stdpath[0])
    insert_at = None
    new_path = []

    for item in sys.path:
        p, np = makepath(item)

        if np == nd and insert_at is None:
            # We've hit the first 'system' path entry, so added entries go here
            insert_at = len(new_path)

        if np in known_paths or insert_at is None:
            new_path.append(item)
        else:
            # new path after the insert point, back-insert it
            new_path.insert(insert_at, item)
            insert_at += 1

    sys.path[:] = new_path


if __name__ == 'site':
    __boot()
    del __boot
py27compat.pyo000064400000002025151733473770007322 0ustar00�
�fc@stdZddlZddlmZd�Zejr@d�Znej�dkoXejZergend�Z	dS(s2
Compatibility Support for Python 2.7 and earlier
i����N(tsixcCs
|j|�S(sH
    Given an HTTPMessage, return all headers matching a given key.
    (tget_all(tmessagetkey((s9/usr/lib/python2.7/site-packages/setuptools/py27compat.pytget_all_headers
scCs
|j|�S(N(t
getheaders(RR((s9/usr/lib/python2.7/site-packages/setuptools/py27compat.pyRstLinuxcCs|S(N((tx((s9/usr/lib/python2.7/site-packages/setuptools/py27compat.pyt<lambda>t(
t__doc__tplatformtsetuptools.externRRtPY2tsystemtlinux_py2_asciitstrtrmtree_safe(((s9/usr/lib/python2.7/site-packages/setuptools/py27compat.pyt<module>s			glob.py000064400000012127151733474000006050 0ustar00"""
Filename globbing utility. Mostly a copy of `glob` from Python 3.5.

Changes include:
 * `yield from` and PEP3102 `*` removed.
 * `bytes` changed to `six.binary_type`.
 * Hidden files are not ignored.
"""

import os
import re
import fnmatch
from setuptools.extern.six import binary_type

__all__ = ["glob", "iglob", "escape"]


def glob(pathname, recursive=False):
    """Return a list of paths matching a pathname pattern.

    The pattern may contain simple shell-style wildcards a la
    fnmatch. However, unlike fnmatch, filenames starting with a
    dot are special cases that are not matched by '*' and '?'
    patterns.

    If recursive is true, the pattern '**' will match any files and
    zero or more directories and subdirectories.
    """
    return list(iglob(pathname, recursive=recursive))


def iglob(pathname, recursive=False):
    """Return an iterator which yields the paths matching a pathname pattern.

    The pattern may contain simple shell-style wildcards a la
    fnmatch. However, unlike fnmatch, filenames starting with a
    dot are special cases that are not matched by '*' and '?'
    patterns.

    If recursive is true, the pattern '**' will match any files and
    zero or more directories and subdirectories.
    """
    it = _iglob(pathname, recursive)
    if recursive and _isrecursive(pathname):
        s = next(it)  # skip empty string
        assert not s
    return it


def _iglob(pathname, recursive):
    dirname, basename = os.path.split(pathname)
    if not has_magic(pathname):
        if basename:
            if os.path.lexists(pathname):
                yield pathname
        else:
            # Patterns ending with a slash should match only directories
            if os.path.isdir(dirname):
                yield pathname
        return
    if not dirname:
        if recursive and _isrecursive(basename):
            for x in glob2(dirname, basename):
                yield x
        else:
            for x in glob1(dirname, basename):
                yield x
        return
    # `os.path.split()` returns the argument itself as a dirname if it is a
    # drive or UNC path.  Prevent an infinite recursion if a drive or UNC path
    # contains magic characters (i.e. r'\\?\C:').
    if dirname != pathname and has_magic(dirname):
        dirs = _iglob(dirname, recursive)
    else:
        dirs = [dirname]
    if has_magic(basename):
        if recursive and _isrecursive(basename):
            glob_in_dir = glob2
        else:
            glob_in_dir = glob1
    else:
        glob_in_dir = glob0
    for dirname in dirs:
        for name in glob_in_dir(dirname, basename):
            yield os.path.join(dirname, name)


# These 2 helper functions non-recursively glob inside a literal directory.
# They return a list of basenames. `glob1` accepts a pattern while `glob0`
# takes a literal basename (so it only has to check for its existence).


def glob1(dirname, pattern):
    if not dirname:
        if isinstance(pattern, binary_type):
            dirname = os.curdir.encode('ASCII')
        else:
            dirname = os.curdir
    try:
        names = os.listdir(dirname)
    except OSError:
        return []
    return fnmatch.filter(names, pattern)


def glob0(dirname, basename):
    if not basename:
        # `os.path.split()` returns an empty basename for paths ending with a
        # directory separator.  'q*x/' should match only directories.
        if os.path.isdir(dirname):
            return [basename]
    else:
        if os.path.lexists(os.path.join(dirname, basename)):
            return [basename]
    return []


# This helper function recursively yields relative pathnames inside a literal
# directory.


def glob2(dirname, pattern):
    assert _isrecursive(pattern)
    yield pattern[:0]
    for x in _rlistdir(dirname):
        yield x


# Recursively yields relative pathnames inside a literal directory.
def _rlistdir(dirname):
    if not dirname:
        if isinstance(dirname, binary_type):
            dirname = binary_type(os.curdir, 'ASCII')
        else:
            dirname = os.curdir
    try:
        names = os.listdir(dirname)
    except os.error:
        return
    for x in names:
        yield x
        path = os.path.join(dirname, x) if dirname else x
        for y in _rlistdir(path):
            yield os.path.join(x, y)


magic_check = re.compile('([*?[])')
magic_check_bytes = re.compile(b'([*?[])')


def has_magic(s):
    if isinstance(s, binary_type):
        match = magic_check_bytes.search(s)
    else:
        match = magic_check.search(s)
    return match is not None


def _isrecursive(pattern):
    if isinstance(pattern, binary_type):
        return pattern == b'**'
    else:
        return pattern == '**'


def escape(pathname):
    """Escape all special characters.
    """
    # Escaping is done by wrapping any of "*?[" between square brackets.
    # Metacharacters do not work in the drive part and shouldn't be escaped.
    drive, pathname = os.path.splitdrive(pathname)
    if isinstance(pathname, binary_type):
        pathname = magic_check_bytes.sub(br'[\1]', pathname)
    else:
        pathname = magic_check.sub(r'[\1]', pathname)
    return drive + pathname
py27compat.py000064400000001030151733474000007121 0ustar00"""
Compatibility Support for Python 2.7 and earlier
"""

import platform

from setuptools.extern import six


def get_all_headers(message, key):
    """
    Given an HTTPMessage, return all headers matching a given key.
    """
    return message.get_all(key)


if six.PY2:
    def get_all_headers(message, key):
        return message.getheaders(key)


linux_py2_ascii = (
    platform.system() == 'Linux' and
    six.PY2
)

rmtree_safe = str if linux_py2_ascii else lambda x: x
"""Workaround for http://bugs.python.org/issue24672"""
_vendor/six.pyo000064400000075557151733474000007563 0ustar00�
�fcA@@sKdZddlmZddlZddlZddlZddlZddlZdZdZ	ej
ddkZej
ddkZej
dd!dakZ
er�efZefZefZeZeZejZn�efZeefZeejfZeZeZejjd	�r$edc�ZnVdefd
��YZ ye!e ��Wne"k
rjede�Zn
Xedg�Z[ d�Z#d�Z$defd��YZ%de%fd��YZ&dej'fd��YZ(de%fd��YZ)defd��YZ*e*e+�Z,de(fd��YZ-e)dddd�e)d d!d"d#d �e)d$d!d!d%d$�e)d&d'd"d(d&�e)d)d'd*�e)d+d!d"d,d+�e)d-d.d.d/d-�e)d0d.d.d-d0�e)d1d'd"d2d1�e)d3d'e
r�d4nd5d6�e)d7d'd8�e)d9d:d;d<�e)ddd�e)d=d=d>�e)d?d?d>�e)d@d@d>�e)d2d'd"d2d1�e)dAd!d"dBdA�e)dCd!d!dDdC�e&d"d'�e&dEdF�e&dGdH�e&dIdJdK�e&dLdMdL�e&dNdOdP�e&dQdRdS�e&dTdUdV�e&dWdXdY�e&dZd[d\�e&d]d^d_�e&d`dadb�e&dcddde�e&dfdgdh�e&dididj�e&dkdkdj�e&dldldj�e&dmdmdn�e&dodp�e&dqdr�e&dsdt�e&dudvdu�e&dwdx�e&dydzd{�e&d|d}d~�e&dd�d��e&d�d�d��e&d�d�d��e&d�d�d��e&d�d�d��e&d�d�d��e&d�d�d��e&d�d�d��e&d�d�d~�e&d�d�d��e&d�d�d��e&d�d�d��e&d�e+d�d��e&d�e+d�d��e&d�e+d�e+d��e&d�d�d��e&d�d�d��e&d�d�d��g>Z.ejd�kr;e.e&d�d��g7Z.nxJe.D]BZ/e0e-e/j1e/�e2e/e&�rBe,j3e/d�e/j1�qBqBW[/e.e-_.e-e+d��Z4e,j3e4d��d�e(fd���YZ5e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d<d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��gZ6x!e6D]Z/e0e5e/j1e/�q0W[/e6e5_.e,j3e5e+d��d�d��d�e(fd���YZ7e)d�d�d��e)d�d�d��e)d�d�d��gZ8x!e8D]Z/e0e7e/j1e/�q�W[/e8e7_.e,j3e7e+d��d�d��d�e(fd���YZ9e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��g!Z:x!e:D]Z/e0e9e/j1e/�qW[/e:e9_.e,j3e9e+d��dd�de(fd��YZ;e)dd�d�e)dd�d�e)dd�d�e)dd�d�gZ<x!e<D]Z/e0e;e/j1e/�q�W[/e<e;_.e,j3e;e+d	�d
d�de(fd
��YZ=e)dd�d��gZ>x!e>D]Z/e0e=e/j1e/�q;W[/e>e=_.e,j3e=e+d�dd�dej'fd��YZ?e,j3e?e+d��d�d�Z@d�ZAer�dZBdZCdZDdZEdZFdZGn$dZBdZCdZDd ZEd!ZFd"ZGy
eHZIWneJk
r=
d#�ZInXeIZHy
eKZKWneJk
rj
d$�ZKnXer�
d%�ZLejMZNd&�ZOeZPn7d'�ZLd(�ZNd)�ZOd*efd+��YZPeKZKe#eLd,�ejQeB�ZRejQeC�ZSejQeD�ZTejQeE�ZUejQeF�ZVejQeG�ZWer�d-�ZXd.�ZYd/�ZZd0�Z[ej\d1�Z]ej\d2�Z^ej\d3�Z_nQd4�ZXd5�ZYd6�ZZd7�Z[ej\d8�Z]ej\d9�Z^ej\d:�Z_e#eXd;�e#eYd<�e#eZd=�e#e[d>�er�d?�Z`d@�ZaebZcddldZdedjedA�jfZg[dejhd�ZiejjZkelZmddlnZnenjoZoenjpZpdBZqej
d
d
kr�dCZrdDZsq4dEZrdFZsnpdG�Z`dH�ZaecZcebZgdI�ZidJ�Zkejtejuev�ZmddloZoeojoZoZpdKZqdCZrdDZse#e`dL�e#eadM�dN�ZwdO�ZxdP�Zyer�eze4j{dQ�Z|ddR�Z~ndddS�Z|e|dT�ej
d dhkr�e|dU�n)ej
d dikr�e|dV�n	dW�Zeze4j{dXd�Z�e�dkrdY�Z�nej
d djkrDe�Z�dZ�Z�ne#e~d[�ej
dd!dkkrej�ej�d\�Z�n	ej�Z�d]�Z�d^�Z�d_�Z�gZ�e+Z�e��j�d`�dk	r�ge�_�nej�r7xOe�ej��D]>\Z�Z�ee��j+dkr�e�j1e+kr�ej�e�=Pq�q�W[�[�nej�j�e,�dS(ls6Utilities for writing code that runs on Python 2 and 3i(tabsolute_importNs'Benjamin Peterson <benjamin@python.org>s1.10.0iiitjavaiitXcB@seZd�ZRS(cC@sdS(NiiI�((tself((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt__len__>s(t__name__t
__module__R(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR<si?cC@s
||_dS(s Add documentation to a function.N(t__doc__(tfunctdoc((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt_add_docKscC@st|�tj|S(s7Import module, returning the module after the last dot.(t
__import__tsystmodules(tname((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt_import_modulePs
t
_LazyDescrcB@seZd�Zd�ZRS(cC@s
||_dS(N(R(RR((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt__init__XscC@sN|j�}t||j|�yt|j|j�Wntk
rInX|S(N(t_resolvetsetattrRtdelattrt	__class__tAttributeError(Rtobjttptresult((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt__get__[s
(RRRR(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRVs	tMovedModulecB@s&eZdd�Zd�Zd�ZRS(cC@sJtt|�j|�tr=|dkr1|}n||_n	||_dS(N(tsuperRRtPY3tNonetmod(RRtoldtnew((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRis	cC@s
t|j�S(N(RR(R((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRrscC@s/|j�}t||�}t|||�|S(N(RtgetattrR(Rtattrt_moduletvalue((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt__getattr__usN(RRRRRR&(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRgs		t_LazyModulecB@s eZd�Zd�ZgZRS(cC@s)tt|�j|�|jj|_dS(N(RR'RRR(RR((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR~scC@s3ddg}|g|jD]}|j^q7}|S(NRR(t_moved_attributesR(RtattrsR#((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt__dir__�s#(RRRR*R((((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR'|s		tMovedAttributecB@s eZddd�Zd�ZRS(cC@s�tt|�j|�trp|dkr1|}n||_|dkrd|dkr[|}qd|}n||_n'||_|dkr�|}n||_dS(N(RR+RRRRR#(RRtold_modtnew_modtold_attrtnew_attr((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR�s						cC@st|j�}t||j�S(N(RRR"R#(Rtmodule((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR�sN(RRRRR(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR+�st_SixMetaPathImportercB@s_eZdZd�Zd�Zd�Zd	d�Zd�Zd�Z	d�Z
d�ZeZRS(
s�
    A meta path importer to import six.moves and its submodules.

    This class implements a PEP302 finder and loader. It should be compatible
    with Python 2.5 and all existing versions of Python3
    cC@s||_i|_dS(N(Rt
known_modules(Rtsix_module_name((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR�s	cG@s-x&|D]}||j|jd|<qWdS(Nt.(R2R(RRt	fullnamestfullname((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt_add_module�s
cC@s|j|jd|S(NR4(R2R(RR6((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt_get_module�scC@s||jkr|SdS(N(R2R(RR6tpath((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytfind_module�scC@s7y|j|SWn!tk
r2td|��nXdS(Ns!This loader does not know module (R2tKeyErrortImportError(RR6((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt__get_module�s
cC@sjytj|SWntk
r"nX|j|�}t|t�rP|j�}n	||_|tj|<|S(N(RR
R;t _SixMetaPathImporter__get_modulet
isinstanceRRt
__loader__(RR6R((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytload_module�s
	
cC@st|j|�d�S(s�
        Return true, if the named module is a package.

        We need this method to get correct spec objects with
        Python 3.4 (see PEP451)
        t__path__(thasattrR>(RR6((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt
is_package�scC@s|j|�dS(s;Return None

        Required, if is_package is implementedN(R>R(RR6((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytget_code�s
N(
RRRRR7R8RR:R>RARDREt
get_source(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR1�s								t_MovedItemscB@seZdZgZRS(sLazy loading of moved objects(RRRRB(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRG�st	cStringIOtiotStringIOtfiltert	itertoolstbuiltinstifiltertfilterfalsetifilterfalsetinputt__builtin__t	raw_inputtinternRtmaptimaptgetcwdtostgetcwdutgetcwdbtrangetxranget
reload_modulet	importlibtimptreloadtreducet	functoolstshlex_quotetpipestshlextquotetUserDicttcollectionstUserListt
UserStringtziptiziptzip_longesttizip_longesttconfigparsertConfigParsertcopyregtcopy_regtdbm_gnutgdbmsdbm.gnut
_dummy_threadtdummy_threadthttp_cookiejart	cookielibshttp.cookiejarthttp_cookiestCookieshttp.cookiest
html_entitiesthtmlentitydefss
html.entitiesthtml_parsert
HTMLParsershtml.parserthttp_clientthttplibshttp.clienttemail_mime_multipartsemail.MIMEMultipartsemail.mime.multiparttemail_mime_nonmultipartsemail.MIMENonMultipartsemail.mime.nonmultiparttemail_mime_textsemail.MIMETextsemail.mime.texttemail_mime_basesemail.MIMEBasesemail.mime.basetBaseHTTPServershttp.servert
CGIHTTPServertSimpleHTTPServertcPickletpickletqueuetQueuetreprlibtreprtsocketservertSocketServert_threadtthreadttkintertTkinterttkinter_dialogtDialogstkinter.dialogttkinter_filedialogt
FileDialogstkinter.filedialogttkinter_scrolledtexttScrolledTextstkinter.scrolledtextttkinter_simpledialogtSimpleDialogstkinter.simpledialogttkinter_tixtTixstkinter.tixttkinter_ttktttkstkinter.ttkttkinter_constantstTkconstantsstkinter.constantsttkinter_dndtTkdndstkinter.dndttkinter_colorchooserttkColorChooserstkinter.colorchooserttkinter_commondialogttkCommonDialogstkinter.commondialogttkinter_tkfiledialogttkFileDialogttkinter_fontttkFontstkinter.fontttkinter_messageboxttkMessageBoxstkinter.messageboxttkinter_tksimpledialogttkSimpleDialogturllib_parses.moves.urllib_parsesurllib.parseturllib_errors.moves.urllib_errorsurllib.errorturllibs
.moves.urllibturllib_robotparsertrobotparsersurllib.robotparsert
xmlrpc_clientt	xmlrpclibs
xmlrpc.clientt
xmlrpc_servertSimpleXMLRPCServers
xmlrpc.servertwin32twinregt_winregsmoves.s.movestmovestModule_six_moves_urllib_parsecB@seZdZRS(s7Lazy loading of moved objects in six.moves.urllib_parse(RRR(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR�@stParseResultturlparsetSplitResulttparse_qst	parse_qslt	urldefragturljointurlsplitt
urlunparset
urlunsplitt
quote_plustunquotetunquote_plust	urlencodet
splitquerytsplittagt	splitusert
uses_fragmenttuses_netloctuses_paramst
uses_queryt
uses_relativesmoves.urllib_parsesmoves.urllib.parsetModule_six_moves_urllib_errorcB@seZdZRS(s7Lazy loading of moved objects in six.moves.urllib_error(RRR(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR�hstURLErrorturllib2t	HTTPErrortContentTooShortErrors.moves.urllib.errorsmoves.urllib_errorsmoves.urllib.errortModule_six_moves_urllib_requestcB@seZdZRS(s9Lazy loading of moved objects in six.moves.urllib_request(RRR(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR�|sturlopensurllib.requesttinstall_openertbuild_openertpathname2urlturl2pathnamet
getproxiestRequesttOpenerDirectortHTTPDefaultErrorHandlertHTTPRedirectHandlertHTTPCookieProcessortProxyHandlertBaseHandlertHTTPPasswordMgrtHTTPPasswordMgrWithDefaultRealmtAbstractBasicAuthHandlertHTTPBasicAuthHandlertProxyBasicAuthHandlertAbstractDigestAuthHandlertHTTPDigestAuthHandlertProxyDigestAuthHandlertHTTPHandlertHTTPSHandlertFileHandlert
FTPHandlertCacheFTPHandlertUnknownHandlertHTTPErrorProcessorturlretrievet
urlcleanupt	URLopenertFancyURLopenertproxy_bypasss.moves.urllib.requestsmoves.urllib_requestsmoves.urllib.requestt Module_six_moves_urllib_responsecB@seZdZRS(s:Lazy loading of moved objects in six.moves.urllib_response(RRR(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR��staddbasesurllib.responsetaddclosehooktaddinfot
addinfourls.moves.urllib.responsesmoves.urllib_responsesmoves.urllib.responset#Module_six_moves_urllib_robotparsercB@seZdZRS(s=Lazy loading of moved objects in six.moves.urllib_robotparser(RRR(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR�stRobotFileParsers.moves.urllib.robotparsersmoves.urllib_robotparsersmoves.urllib.robotparsertModule_six_moves_urllibcB@sheZdZgZejd�Zejd�Zejd�Zejd�Z	ejd�Z
d�ZRS(sICreate a six.moves.urllib namespace that resembles the Python 3 namespacesmoves.urllib_parsesmoves.urllib_errorsmoves.urllib_requestsmoves.urllib_responsesmoves.urllib_robotparsercC@sdddddgS(NtparseterrortrequesttresponseR�((R((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR*�s(RRRRBt	_importerR8RRRRR�R*(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR�ssmoves.urllibcC@stt|j|�dS(sAdd an item to six.moves.N(RRGR(tmove((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytadd_move�scC@s^ytt|�WnFtk
rYytj|=WqZtk
rUtd|f��qZXnXdS(sRemove item from six.moves.sno such move, %rN(RRGRR�t__dict__R;(R((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytremove_move�s

t__func__t__self__t__closure__t__code__t__defaults__t__globals__tim_functim_selftfunc_closuret	func_codet
func_defaultstfunc_globalscC@s
|j�S(N(tnext(tit((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytadvance_iteratorscC@std�t|�jD��S(Ncs@s|]}d|jkVqdS(t__call__N(R
(t.0tklass((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pys	<genexpr>s(tanyttypet__mro__(R((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytcallablescC@s|S(N((tunbound((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytget_unbound_functionscC@s|S(N((Rtcls((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytcreate_unbound_methodscC@s|jS(N(R(R"((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR#"scC@stj|||j�S(N(ttypest
MethodTypeR(RR((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytcreate_bound_method%scC@stj|d|�S(N(R&R'R(RR$((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR%(stIteratorcB@seZd�ZRS(cC@st|�j|�S(N(Rt__next__(R((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR-s(RRR(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR)+ss3Get the function out of a possibly unbound functioncK@st|j|��S(N(titertkeys(tdtkw((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytiterkeys>scK@st|j|��S(N(R+tvalues(R-R.((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt
itervaluesAscK@st|j|��S(N(R+titems(R-R.((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt	iteritemsDscK@st|j|��S(N(R+tlists(R-R.((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt	iterlistsGsR,R0R2cK@s
|j|�S(N(R/(R-R.((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR/PscK@s
|j|�S(N(R1(R-R.((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR1SscK@s
|j|�S(N(R3(R-R.((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR3VscK@s
|j|�S(N(R5(R-R.((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR5Ystviewkeyst
viewvaluest	viewitemss1Return an iterator over the keys of a dictionary.s3Return an iterator over the values of a dictionary.s?Return an iterator over the (key, value) pairs of a dictionary.sBReturn an iterator over the (key, [values]) pairs of a dictionary.cC@s
|jd�S(Nslatin-1(tencode(ts((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytbkscC@s|S(N((R:((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytunss>BtassertCountEqualtassertRaisesRegexptassertRegexpMatchestassertRaisesRegextassertRegexcC@s|S(N((R:((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR;�scC@st|jdd�d�S(Ns\\s\\\\tunicode_escape(tunicodetreplace(R:((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR<�scC@st|d�S(Ni(tord(tbs((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytbyte2int�scC@st||�S(N(RE(tbufti((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt
indexbytes�stassertItemsEqualsByte literalsText literalcO@st|t�||�S(N(R"t_assertCountEqual(Rtargstkwargs((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR=�scO@st|t�||�S(N(R"t_assertRaisesRegex(RRMRN((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR@�scO@st|t�||�S(N(R"t_assertRegex(RRMRN((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRA�stexeccC@sC|dkr|�}n|j|k	r9|j|��n|�dS(N(Rt
__traceback__twith_traceback(RR%ttb((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytreraise�s
cB@sc|dkrBejd�}|j}|dkr<|j}n~n|dkrW|}nddUdS(sExecute code in a namespace.isexec _code_ in _globs_, _locs_N(RRt	_getframet	f_globalstf_locals(t_code_t_globs_t_locs_tframe((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytexec_�s		s9def reraise(tp, value, tb=None):
    raise tp, value, tb
srdef raise_from(value, from_value):
    if from_value is None:
        raise value
    raise value from from_value
sCdef raise_from(value, from_value):
    raise value from from_value
cC@s
|�dS(N((R%t
from_value((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt
raise_from�stprintc
@s�|jdtj���dkr%dS�fd�}t}|jdd�}|dk	r�t|t�rpt}q�t|t�s�t	d��q�n|jdd�}|dk	r�t|t�r�t}q�t|t�s�t	d��q�n|r�t	d��n|s0x*|D]}t|t�r
t}Pq
q
Wn|rQtd	�}td
�}nd	}d
}|dkrr|}n|dkr�|}nx7t
|�D])\}	}|	r�||�n||�q�W||�dS(s4The new-style print function for Python 2.4 and 2.5.tfileNc@s�t|t�st|�}nt�t�r�t|t�r��jdk	r�t�dd�}|dkrrd}n|j�j|�}n�j	|�dS(Nterrorststrict(
R?t
basestringtstrRaRCtencodingRR"R9twrite(tdataRb(tfp(s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRg�s	tsepssep must be None or a stringtendsend must be None or a strings$invalid keyword arguments to print()s
t (tpopRtstdoutRtFalseR?RCtTrueRet	TypeErrort	enumerate(
RMRNRgtwant_unicodeRjRktargtnewlinetspaceRI((Ris:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytprint_�sL		
		
cO@sW|jdtj�}|jdt�}t||�|rS|dk	rS|j�ndS(NRatflush(tgetRRnRmRot_printRRx(RMRNRiRx((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRws

sReraise an exception.c@s���fd�}|S(Nc@s(tj����|�}�|_|S(N(Rbtwrapst__wrapped__(tf(tassignedtupdatedtwrapped(s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytwrappers	((R�R~RR�((R~RR�s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR{sc@s5d�f��fd��Y}tj|ddi�S(s%Create a base class with a metaclass.t	metaclassc@seZ��fd�ZRS(c@s�|�|�S(N((R$Rt
this_basesR-(tbasestmeta(s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt__new__'s(RRR�((R�R�(s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR�%sttemporary_class((RR�(R�R�R�((R�R�s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytwith_metaclass sc@s�fd�}|S(s6Class decorator for creating a class with a metaclass.c@s�|jj�}|jd�}|dk	rft|t�rE|g}nx|D]}|j|�qLWn|jdd�|jdd��|j|j|�S(Nt	__slots__R
t__weakref__(	R
tcopyRyRR?ReRmRt	__bases__(R$t	orig_varstslotst	slots_var(R�(s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR�.s
((R�R�((R�s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt
add_metaclass,scC@sJtrFd|jkr+td|j��n|j|_d�|_n|S(s
    A decorator that defines __unicode__ and __str__ methods under Python 2.
    Under Python 3 it does nothing.

    To support Python 2 and 3 with a single code base, define a __str__ method
    returning text and apply this decorator to the class.
    t__str__sY@python_2_unicode_compatible cannot be applied to %s because it doesn't define __str__().cS@s|j�jd�S(Nsutf-8(t__unicode__R9(R((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt<lambda>Jt(tPY2R
t
ValueErrorRR�R�(R((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytpython_2_unicode_compatible<st__spec__(iiI�i���I�i���ll����(ii(ii(ii(ii(�Rt
__future__RRbRLtoperatorRR&t
__author__t__version__tversion_infoR�RtPY34Retstring_typestintt
integer_typesRtclass_typest	text_typetbytestbinary_typetmaxsizetMAXSIZERdtlongt	ClassTypeRCtplatformt
startswithtobjectRtlent
OverflowErrorR
RRRt
ModuleTypeR'R+R1RRRGR(R#RRR?R7R�R�t_urllib_parse_moved_attributesR�t_urllib_error_moved_attributesR�t _urllib_request_moved_attributesR�t!_urllib_response_moved_attributesRt$_urllib_robotparser_moved_attributesRR	Rt
_meth_funct
_meth_selft
_func_closuret
_func_codet_func_defaultst
_func_globalsRRt	NameErrorR!R#R'R(R%R)t
attrgettertget_method_functiontget_method_selftget_function_closuretget_function_codetget_function_defaultstget_function_globalsR/R1R3R5tmethodcallerR6R7R8R;R<tchrtunichrtstructtStructtpacktint2bytet
itemgetterRGtgetitemRJR+t	iterbytesRIRJtBytesIORLRORPtpartialRVRER=R@RAR"RMR]RRUR_RwRztWRAPPER_ASSIGNMENTStWRAPPER_UPDATESR{R�R�R�RBt__package__tglobalsRyR�tsubmodule_search_locationst	meta_pathRrRItimportertappend(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt<module>s�				
		>			
	
	

	

	

	

	

			





															

											


			

	5
					
	_vendor/pyparsing.pyc000064400000707266151733474000010757 0ustar00�
�fci@sdZdZdZdZddlZddlmZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlmZyddlmZWn!ek
r�ddlmZnXydd	l
mZWn?ek
r=ydd	lmZWnek
r9eZnXnXd
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrgiZee	j�ds ZedtdskZer�e	jZ e!Z"e#Z$e!Z%e&e'e(e)e*ee+e,e-e.e/gZ0nre	j1Z e2Z3du�Z%gZ0ddl4Z4xEdvj5�D]7Z6ye0j7e8e4e6��Wne9k
rZq$nXq$We:dw�e3dx�D��Z;dy�Z<dze=fd{��YZ>ej?ej@ZAd|ZBeBd}ZCeAeBZDe#d~�ZEdjFd��ejGD��ZHd!eIfd���YZJd#eJfd���YZKd%eJfd���YZLd'eLfd���YZMd*eIfd���YZNd�e=fd���YZOd&e=fd���YZPe
jQjReP�d��ZSd��ZTd��ZUd��ZVd��ZWd��ZXd��ZYd�d��ZZd(e=fd���YZ[d0e[fd���YZ\de\fd���YZ]de\fd���YZ^de\fd���YZ_e_Z`e_e[_ade\fd���YZbde_fd���YZcdebfd���YZddpe\fd���YZed3e\fd���YZfd+e\fd���YZgd)e\fd���YZhd
e\fd���YZid2e\fd���YZjd�e\fd���YZkdekfd���YZldekfd���YZmdekfd���YZnd.ekfd���YZod-ekfd���YZpd5ekfd���YZqd4ekfd���YZrd$e[fd���YZsd
esfd���YZtd esfd���YZudesfd���YZvdesfd���YZwd"e[fd���YZxdexfd���YZydexfd���YZzd�exfd���YZ{de{fd���YZ|d6e{fd���YZ}d�e=fd���YZ~e~�Zdexfd���YZ�d,exfd���YZ�dexfd���YZ�d�e�fd���YZ�d1exfd���YZ�de�fd���YZ�de�fd���YZ�de�fd���YZ�d/e�fd���YZ�de=fd���YZ�d��Z�d�e�d��Z�ed��Z�d��Z�d��Z�d��Z�d��Z�e�e�d��Z�d��Z�e�d��Z�d��Z�d��Z�e]�j�dG�Z�em�j�dM�Z�en�j�dL�Z�eo�j�de�Z�ep�j�dd�Z�efeEd�d�d��j�d���Z�egd��j�d���Z�egd��j�d���Z�e�e�Be�BefeHd�d�d�dx�Begd�ej��BZ�e�e�e�d��e��Z�e_d��e�d��j�d��e�e|e�e�B��j�d��d�Z�d��Z�d��Z�d��Z�d��Z�d��Z�e�d���Z�e�d���Z�d��Z�d��Z�d��Z�d��Z�e=�e�_�dd��Z�e>�Z�e=�e�_�e=�e�_�e�d��e�d��d��Z�e�Z�e�egd��d��j�d��Z�e�egd��d��j�d��Z�e�egd��d�egd��d�B�j�d��Z�e�e`d��e�j��j�d��Z�d�d�ee�j�d��Z�e�d��Z�e�d��Z�e�d��Z�e�efeAeDd��j�d���\Z�Z�e�e�d�j5�d���Z�egd�djFe�j���d�j�d�Z�d�Z�e�egd�d�j�d�Z�egd�j�d�Z�egd	�j��j�d
�Z�egd�j�d�Z�e�egd�de�B�j�d
�Z�e�Z�egd�j�d�Z�e�e|efeHd�d��e�efd�e_d��en����j��j�d�Z�e�e�e�j�e�Bdd��j�d>�Z�drfd��YZ�e�dkrecd�Z�ecd�Z�efeAeDd�Z�e�e�dde��j�e��Z�e�e�e���j�d�Z�de�BZ�e�e�dde��j�e��Z�e�e�e���j�d�Z�e�d�e�d�e�e�d�Z�e�j�d�e�j�j�d�e�j�j�d�e�j�j�d �ddl�Z�e�j�j�e�e�j���e�j�j�d!�ndS("sS
pyparsing module - Classes and methods to define and execute parsing grammars

The pyparsing module is an alternative approach to creating and executing simple grammars,
vs. the traditional lex/yacc approach, or the use of regular expressions.  With pyparsing, you
don't need to learn a new syntax for defining grammars or matching expressions - the parsing module
provides a library of classes that you use to construct the grammar directly in Python.

Here is a program to parse "Hello, World!" (or any greeting of the form 
C{"<salutation>, <addressee>!"}), built up using L{Word}, L{Literal}, and L{And} elements 
(L{'+'<ParserElement.__add__>} operator gives L{And} expressions, strings are auto-converted to
L{Literal} expressions)::

    from pyparsing import Word, alphas

    # define grammar of a greeting
    greet = Word(alphas) + "," + Word(alphas) + "!"

    hello = "Hello, World!"
    print (hello, "->", greet.parseString(hello))

The program outputs the following::

    Hello, World! -> ['Hello', ',', 'World', '!']

The Python representation of the grammar is quite readable, owing to the self-explanatory
class names, and the use of '+', '|' and '^' operators.

The L{ParseResults} object returned from L{ParserElement.parseString<ParserElement.parseString>} can be accessed as a nested list, a dictionary, or an
object with named attributes.

The pyparsing module handles some of the problems that are typically vexing when writing text parsers:
 - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello  ,  World  !", etc.)
 - quoted strings
 - embedded comments
s2.1.10s07 Oct 2016 01:31 UTCs*Paul McGuire <ptmcg@users.sourceforge.net>i����N(tref(tdatetime(tRLock(tOrderedDicttAndtCaselessKeywordtCaselessLiteralt
CharsNotIntCombinetDicttEachtEmptyt
FollowedBytForwardt
GoToColumntGrouptKeywordtLineEndt	LineStarttLiteralt
MatchFirsttNoMatchtNotAnyt	OneOrMoretOnlyOncetOptionaltOrtParseBaseExceptiontParseElementEnhancetParseExceptiontParseExpressiontParseFatalExceptiontParseResultstParseSyntaxExceptiont
ParserElementtQuotedStringtRecursiveGrammarExceptiontRegextSkipTot	StringEndtStringStarttSuppresstTokentTokenConvertertWhitetWordtWordEndt	WordStartt
ZeroOrMoret	alphanumstalphast
alphas8bittanyCloseTagt
anyOpenTagt
cStyleCommenttcoltcommaSeparatedListtcommonHTMLEntitytcountedArraytcppStyleCommenttdblQuotedStringtdblSlashCommentt
delimitedListtdictOftdowncaseTokenstemptythexnumsthtmlCommenttjavaStyleCommenttlinetlineEndt	lineStarttlinenotmakeHTMLTagstmakeXMLTagstmatchOnlyAtColtmatchPreviousExprtmatchPreviousLiteralt
nestedExprtnullDebugActiontnumstoneOftopAssoctoperatorPrecedencet
printablestpunc8bittpythonStyleCommenttquotedStringtremoveQuotestreplaceHTMLEntitytreplaceWitht
restOfLinetsglQuotedStringtsranget	stringEndtstringStartttraceParseActiont
unicodeStringtupcaseTokenst
withAttributet
indentedBlocktoriginalTextFortungroupt
infixNotationtlocatedExprt	withClasst
CloseMatchttokenMaptpyparsing_commoniicCs}t|t�r|Syt|�SWnUtk
rxt|�jtj�d�}td�}|jd��|j	|�SXdS(sDrop-in replacement for str(obj) that tries to be Unicode friendly. It first tries
           str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It
           then < returns the unicode object | encodes it with the default encoding | ... >.
        txmlcharrefreplaces&#\d+;cSs#dtt|ddd!��dS(Ns\uiii����(thextint(tt((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt<lambda>�tN(
t
isinstancetunicodetstrtUnicodeEncodeErrortencodetsystgetdefaultencodingR%tsetParseActionttransformString(tobjtrett
xmlcharref((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_ustr�s
s6sum len sorted reversed list tuple set any all min maxccs|]}|VqdS(N((t.0ty((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�sicCsRd}d�dj�D�}x/t||�D]\}}|j||�}q,W|S(s/Escape &, <, >, ", ', etc. in a string of data.s&><"'css|]}d|dVqdS(t&t;N((R�ts((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�ssamp gt lt quot apos(tsplittziptreplace(tdatatfrom_symbolst
to_symbolstfrom_tto_((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_xml_escape�s
t
_ConstantscBseZRS((t__name__t
__module__(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��st
0123456789tABCDEFabcdefi\Rrccs$|]}|tjkr|VqdS(N(tstringt
whitespace(R�tc((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�scBs_eZdZdd
d
d�Zed��Zd�Zd�Zd�Z	dd�Z
d	�ZRS(s7base exception class for all parsing runtime exceptionsicCs[||_|dkr*||_d|_n||_||_||_|||f|_dS(NRr(tloctNonetmsgtpstrt
parserElementtargs(tselfR�R�R�telem((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__init__�s					cCs||j|j|j|j�S(s�
        internal factory method to simplify creating one type of ParseException 
        from another - avoids having __init__ signature conflicts among subclasses
        (R�R�R�R�(tclstpe((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_from_exception�scCsm|dkrt|j|j�S|dkr>t|j|j�S|dkr]t|j|j�St|��dS(s�supported attributes by name are:
            - lineno - returns the line number of the exception text
            - col - returns the column number of the exception text
            - line - returns the line containing the exception text
        RHR7tcolumnREN(R7R�(RHR�R�R7REtAttributeError(R�taname((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__getattr__�scCs d|j|j|j|jfS(Ns"%s (at char %d), (line:%d, col:%d)(R�R�RHR�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__str__�scCs
t|�S(N(R(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__repr__�ss>!<cCsI|j}|jd}|r?dj|| |||f�}n|j�S(s�Extracts the exception line from the input string, and marks
           the location of the exception with a special symbol.
        iRr(RER�tjointstrip(R�tmarkerStringtline_strtline_column((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
markInputline�s	

cCsdj�tt|��S(Nslineno col line(R�tdirttype(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__dir__�sN(R�R�t__doc__R�R�tclassmethodR�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s			
cBseZdZRS(sN
    Exception thrown when parse expressions don't match class;
    supported attributes by name are:
     - lineno - returns the line number of the exception text
     - col - returns the column number of the exception text
     - line - returns the line containing the exception text
        
    Example::
        try:
            Word(nums).setName("integer").parseString("ABC")
        except ParseException as pe:
            print(pe)
            print("column: {}".format(pe.col))
            
    prints::
       Expected integer (at char 0), (line:1, col:1)
        column: 1
    (R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�scBseZdZRS(snuser-throwable exception thrown when inconsistent parse content
       is found; stops all parsing immediately(R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscBseZdZRS(s�just like L{ParseFatalException}, but thrown internally when an
       L{ErrorStop<And._ErrorStop>} ('-' operator) indicates that parsing is to stop 
       immediately because an unbacktrackable syntax error has been found(R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR!scBs eZdZd�Zd�ZRS(sZexception thrown by L{ParserElement.validate} if the grammar could be improperly recursivecCs
||_dS(N(tparseElementTrace(R�tparseElementList((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�scCsd|jS(NsRecursiveGrammarException: %s(R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR� s(R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR$s	t_ParseResultsWithOffsetcBs,eZd�Zd�Zd�Zd�ZRS(cCs||f|_dS(N(ttup(R�tp1tp2((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�$scCs|j|S(N(R�(R�ti((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__getitem__&scCst|jd�S(Ni(treprR�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�(scCs|jd|f|_dS(Ni(R�(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt	setOffset*s(R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�#s			cBs�eZdZd-d-eed�Zd-d-eeed�Zd�Zed�Z	d�Z
d�Zd�Zd�Z
e
Zd	�Zd
�Zd�Zd�Zd
�Zer�eZeZeZn-eZeZeZd�Zd�Zd�Zd�Zd�Zd-d�Zd�Zd�Zd�Z d�Z!d�Z"d�Z#d�Z$d�Z%d�Z&d�Z'dd�Z(d �Z)d!�Z*d"�Z+d-e,ded#�Z-d$�Z.d%�Z/dd&ed'�Z0d(�Z1d)�Z2d*�Z3d+�Z4d,�Z5RS(.sI
    Structured parse results, to provide multiple means of access to the parsed data:
       - as a list (C{len(results)})
       - by list index (C{results[0], results[1]}, etc.)
       - by attribute (C{results.<resultsName>} - see L{ParserElement.setResultsName})

    Example::
        integer = Word(nums)
        date_str = (integer.setResultsName("year") + '/' 
                        + integer.setResultsName("month") + '/' 
                        + integer.setResultsName("day"))
        # equivalent form:
        # date_str = integer("year") + '/' + integer("month") + '/' + integer("day")

        # parseString returns a ParseResults object
        result = date_str.parseString("1999/12/31")

        def test(s, fn=repr):
            print("%s -> %s" % (s, fn(eval(s))))
        test("list(result)")
        test("result[0]")
        test("result['month']")
        test("result.day")
        test("'month' in result")
        test("'minutes' in result")
        test("result.dump()", str)
    prints::
        list(result) -> ['1999', '/', '12', '/', '31']
        result[0] -> '1999'
        result['month'] -> '12'
        result.day -> '31'
        'month' in result -> True
        'minutes' in result -> False
        result.dump() -> ['1999', '/', '12', '/', '31']
        - day: 31
        - month: 12
        - year: 1999
    cCs/t||�r|Stj|�}t|_|S(N(Rstobjectt__new__tTruet_ParseResults__doinit(R�ttoklisttnametasListtmodaltretobj((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�Ts
	cCs�|jr�t|_d|_d|_i|_||_||_|dkrTg}n||t�rp||_	n-||t
�r�t|�|_	n|g|_	t�|_n|dk	r�|r�|s�d|j|<n||t
�r�t|�}n||_||td�ttf�o+|ddgfks�||t�rI|g}n|r�||t�rzt|j�d�||<ntt|d�d�||<|||_q�y|d||<Wq�tttfk
r�|||<q�Xq�ndS(NiRr(R�tFalseR�t_ParseResults__namet_ParseResults__parentt_ParseResults__accumNamest_ParseResults__asListt_ParseResults__modaltlistt_ParseResults__toklistt_generatorTypetdictt_ParseResults__tokdictRoRR�t
basestringR R�tcopytKeyErrort	TypeErrort
IndexError(R�R�R�R�R�Rs((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�]sB								
	3cCsnt|ttf�r |j|S||jkrB|j|ddStg|j|D]}|d^qS�SdS(Ni����i(RsRotsliceR�R�R�R (R�R�tv((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s
cCs�||t�rB|jj|t��|g|j|<|d}n`||ttf�rm||j|<|}n5|jj|t��t|d�g|j|<|}||t�r�t|�|_	ndS(Ni(
R�R�tgetR�RoR�R�R twkrefR�(R�tkR�Rstsub((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__setitem__�s&

	/c
Cst|ttf�rt|j�}|j|=t|t�rl|dkrV||7}nt||d�}ntt|j|���}|j�x{|j	j
�D]]\}}xN|D]F}x=t|�D]/\}\}}	t||	|	|k�||<q�Wq�Wq�Wn
|j	|=dS(Nii(
RsRoR�tlenR�R�trangetindicestreverseR�titemst	enumerateR�(
R�R�tmylentremovedR�toccurrencestjR�tvaluetposition((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__delitem__�s



,cCs
||jkS(N(R�(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__contains__�scCs
t|j�S(N(R�R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__len__�RrcCs	|jS(N(R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__bool__�RrcCs
t|j�S(N(titerR�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__iter__�RrcCst|jddd��S(Ni����(R�R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__reversed__�RrcCs0t|jd�r|jj�St|j�SdS(Ntiterkeys(thasattrR�R�R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt	_iterkeys�s
cs�fd��j�D�S(Nc3s|]}�|VqdS(N((R�R�(R�(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�s(R�(R�((R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_itervalues�scs�fd��j�D�S(Nc3s|]}|�|fVqdS(N((R�R�(R�(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�s(R�(R�((R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
_iteritems�scCst|j��S(sVReturns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x).(R�R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytkeys�scCst|j��S(sXReturns all named result values (as a list in Python 2.x, as an iterator in Python 3.x).(R�t
itervalues(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytvalues�scCst|j��S(sfReturns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x).(R�t	iteritems(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scCs
t|j�S(s�Since keys() returns an iterator, this method is helpful in bypassing
           code that looks for the existence of any defined results names.(tboolR�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pythaskeys�scOs�|sdg}nxI|j�D];\}}|dkrJ|d|f}qtd|��qWt|dt�s�t|�dks�|d|kr�|d}||}||=|S|d}|SdS(s�
        Removes and returns item at specified index (default=C{last}).
        Supports both C{list} and C{dict} semantics for C{pop()}. If passed no
        argument or an integer argument, it will use C{list} semantics
        and pop tokens from the list of parsed tokens. If passed a 
        non-integer argument (most likely a string), it will use C{dict}
        semantics and pop the corresponding value from any defined 
        results names. A second default return value argument is 
        supported, just as in C{dict.pop()}.

        Example::
            def remove_first(tokens):
                tokens.pop(0)
            print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321']
            print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321']

            label = Word(alphas)
            patt = label("LABEL") + OneOrMore(Word(nums))
            print(patt.parseString("AAB 123 321").dump())

            # Use pop() in a parse action to remove named result (note that corresponding value is not
            # removed from list form of results)
            def remove_LABEL(tokens):
                tokens.pop("LABEL")
                return tokens
            patt.addParseAction(remove_LABEL)
            print(patt.parseString("AAB 123 321").dump())
        prints::
            ['AAB', '123', '321']
            - LABEL: AAB

            ['AAB', '123', '321']
        i����tdefaultis-pop() got an unexpected keyword argument '%s'iN(R�R�RsRoR�(R�R�tkwargsR�R�tindexR}tdefaultvalue((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytpop�s"


cCs||kr||S|SdS(si
        Returns named result matching the given key, or if there is no
        such name, then returns the given C{defaultValue} or C{None} if no
        C{defaultValue} is specified.

        Similar to C{dict.get()}.
        
        Example::
            integer = Word(nums)
            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")           

            result = date_str.parseString("1999/12/31")
            print(result.get("year")) # -> '1999'
            print(result.get("hour", "not specified")) # -> 'not specified'
            print(result.get("hour")) # -> None
        N((R�tkeytdefaultValue((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�scCsw|jj||�x]|jj�D]L\}}x=t|�D]/\}\}}t||||k�||<q<Wq#WdS(s
        Inserts new element at location index in the list of parsed tokens.
        
        Similar to C{list.insert()}.

        Example::
            print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321']

            # use a parse action to insert the parse location in the front of the parsed results
            def insert_locn(locn, tokens):
                tokens.insert(0, locn)
            print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321']
        N(R�tinsertR�R�R�R�(R�R�tinsStrR�R�R�R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR2scCs|jj|�dS(s�
        Add single element to end of ParseResults list of elements.

        Example::
            print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321']
            
            # use a parse action to compute the sum of the parsed integers, and add it to the end
            def append_sum(tokens):
                tokens.append(sum(map(int, tokens)))
            print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444]
        N(R�tappend(R�titem((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRFscCs0t|t�r||7}n|jj|�dS(s
        Add sequence of elements to end of ParseResults list of elements.

        Example::
            patt = OneOrMore(Word(alphas))
            
            # use a parse action to append the reverse of the matched strings, to make a palindrome
            def make_palindrome(tokens):
                tokens.extend(reversed([t[::-1] for t in tokens]))
                return ''.join(tokens)
            print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl'
        N(RsR R�textend(R�titemseq((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRTs

cCs|j2|jj�dS(s7
        Clear all elements and results names.
        N(R�R�tclear(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRfscCs�y||SWntk
r dSX||jkr}||jkrR|j|ddStg|j|D]}|d^qc�SndSdS(NRri����i(R�R�R�R (R�R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�ms
+cCs|j�}||7}|S(N(R�(R�totherR}((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__add__{s
c	s�|jr�t|j���fd�}|jj�}g|D]<\}}|D])}|t|d||d��f^qMq=}xJ|D]?\}}|||<t|dt�r�t|�|d_q�q�Wn|j|j7_|j	j
|j	�|S(Ncs|dkr�S|�S(Ni((ta(toffset(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq�Rrii(R�R�R�R�R�RsR R�R�R�tupdate(R�R	t	addoffsett
otheritemsR�tvlistR�totherdictitems((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__iadd__�s	F
cCs1t|t�r%|dkr%|j�S||SdS(Ni(RsRoR�(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__radd__�s
cCs dt|j�t|j�fS(Ns(%s, %s)(R�R�R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scCs"ddjd�|jD��dS(Nt[s, css6|],}t|t�r$t|�n	t|�VqdS(N(RsR RR�(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�st](R�R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��sRrcCsog}xb|jD]W}|r2|r2|j|�nt|t�rT||j�7}q|jt|��qW|S(N(R�RRsR t
_asStringListR(R�tseptoutR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�scCs5g|jD]'}t|t�r+|j�n|^q
S(s�
        Returns the parse results as a nested list of matching tokens, all converted to strings.

        Example::
            patt = OneOrMore(Word(alphas))
            result = patt.parseString("sldkj lsdkj sldkj")
            # even though the result prints in string-like form, it is actually a pyparsing ParseResults
            print(type(result), result) # -> <class 'pyparsing.ParseResults'> ['sldkj', 'lsdkj', 'sldkj']
            
            # Use asList() to create an actual list
            result_list = result.asList()
            print(type(result_list), result_list) # -> <class 'list'> ['sldkj', 'lsdkj', 'sldkj']
        (R�RsR R�(R�tres((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scsGtr|j}n	|j}�fd��t�fd�|�D��S(s�
        Returns the named parse results as a nested dictionary.

        Example::
            integer = Word(nums)
            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
            
            result = date_str.parseString('12/31/1999')
            print(type(result), repr(result)) # -> <class 'pyparsing.ParseResults'> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]})
            
            result_dict = result.asDict()
            print(type(result_dict), repr(result_dict)) # -> <class 'dict'> {'day': '1999', 'year': '12', 'month': '31'}

            # even though a ParseResults supports dict-like access, sometime you just need to have a dict
            import json
            print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable
            print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"}
        csMt|t�rE|j�r%|j�Sg|D]}�|�^q,Sn|SdS(N(RsR R�tasDict(R|R�(ttoItem(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s

 c3s'|]\}}|�|�fVqdS(N((R�R�R�(R(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�s(tPY_3R�R�R�(R�titem_fn((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s
		cCsPt|j�}|jj�|_|j|_|jj|j�|j|_|S(sA
        Returns a new copy of a C{ParseResults} object.
        (R R�R�R�R�R�R
R�(R�R}((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scCs�d}g}td�|jj�D��}|d}|sPd}d}d}nd	}	|d	k	rk|}	n|jr�|j}	n|	s�|r�dSd}	n|||d|	dg7}x	t|j�D]�\}
}t|t�rI|
|kr||j	||
|o|d	k||�g7}q�||j	d	|o6|d	k||�g7}q�d	}|
|krh||
}n|s�|rzq�q�d}nt
t|��}
|||d|d|
d|dg	7}q�W|||d|	dg7}dj|�S(
s�
        (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names.
        s
css2|](\}}|D]}|d|fVqqdS(iN((R�R�RR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�s	s  RrtITEMt<t>s</N(
R�R�R�R�R�R�R�RsR tasXMLR�RR�(R�tdoctagtnamedItemsOnlytindentt	formattedtnlRt
namedItemstnextLevelIndenttselfTagR�RtresTagtxmlBodyText((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR!�sT
				
	cCsKxD|jj�D]3\}}x$|D]\}}||kr#|Sq#WqWdS(N(R�R�R�(R�R�R�RR�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__lookup$s
cCs�|jr|jS|jr?|j�}|r8|j|�SdSnmt|�dkr�t|j�dkr�tt|jj���dddkr�tt|jj	���SdSdS(s(
        Returns the results name for this token expression. Useful when several 
        different expressions might match at a particular location.

        Example::
            integer = Word(nums)
            ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d")
            house_number_expr = Suppress('#') + Word(nums, alphanums)
            user_data = (Group(house_number_expr)("house_number") 
                        | Group(ssn_expr)("ssn")
                        | Group(integer)("age"))
            user_info = OneOrMore(user_data)
            
            result = user_info.parseString("22 111-22-3333 #221B")
            for item in result:
                print(item.getName(), ':', item[0])
        prints::
            age : 22
            ssn : 111-22-3333
            house_number : 221B
        iii����N(ii����(
R�R�t_ParseResults__lookupR�R�R�tnextR�R�R�(R�tpar((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytgetName+s		
)icCs�g}d}|j|t|j���|r�|j�rtd�|j�D��}xk|D]�\}}|r�|j|�n|jd|d||f�t|t�r�|r�|j|j||d��q�|jt|��q^|jt	|��q^Wq�t
d�|D��r�|}x�t|�D]�\}	}
t|
t�r�|jd|d||	|d|d|
j||d�f�q,|jd|d||	|d|dt|
�f�q,Wq�ndj|�S(	sH
        Diagnostic method for listing out the contents of a C{ParseResults}.
        Accepts an optional C{indent} argument so that this string can be embedded
        in a nested display of other data.

        Example::
            integer = Word(nums)
            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
            
            result = date_str.parseString('12/31/1999')
            print(result.dump())
        prints::
            ['12', '/', '31', '/', '1999']
            - day: 1999
            - month: 31
            - year: 12
        s
css'|]\}}t|�|fVqdS(N(Ru(R�R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>gss
%s%s- %s: s  icss|]}t|t�VqdS(N(RsR (R�tvv((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>sss
%s%s[%d]:
%s%s%sRr(
RRR�R�tsortedR�RsR tdumpR�tanyR�R�(R�R$tdepthtfullRtNLR�R�R�R�R1((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR3Ps, B?cOstj|j�||�dS(s�
        Pretty-printer for parsed results as a list, using the C{pprint} module.
        Accepts additional positional or keyword args as defined for the 
        C{pprint.pprint} method. (U{http://docs.python.org/3/library/pprint.html#pprint.pprint})

        Example::
            ident = Word(alphas, alphanums)
            num = Word(nums)
            func = Forward()
            term = ident | num | Group('(' + func + ')')
            func <<= ident + Group(Optional(delimitedList(term)))
            result = func.parseString("fna a,b,(fnb c,d,200),100")
            result.pprint(width=40)
        prints::
            ['fna',
             ['a',
              'b',
              ['(', 'fnb', ['c', 'd', '200'], ')'],
              '100']]
        N(tpprintR�(R�R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR8}scCsC|j|jj�|jdk	r-|j�p0d|j|jffS(N(R�R�R�R�R�R�R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__getstate__�s
cCsm|d|_|d\|_}}|_i|_|jj|�|dk	r`t|�|_n	d|_dS(Nii(R�R�R�R�R
R�R�R�(R�tstateR/tinAccumNames((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__setstate__�s
	cCs|j|j|j|jfS(N(R�R�R�R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__getnewargs__�scCs tt|��t|j��S(N(R�R�R�R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��sN(6R�R�R�R�R�R�RsR�R�R�R�R�R�R�t__nonzero__R�R�R�R�R�RR�R�R�R�R�R�R�R�R�RRRRR�R
RRR�R�RR�RR�R�R!R-R0R3R8R9R<R=R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR -sh&	'		
														4												#	=		%-			
	cCsW|}d|ko#t|�knr@||ddkr@dS||jdd|�S(sReturns current column within a string, counting newlines as line separators.
   The first column is number 1.

   Note: the default parsing behavior is to expand tabs in the input string
   before starting the parsing process.  See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information
   on parsing strings containing C{<TAB>}s, and suggested methods to maintain a
   consistent view of the parsed string, the parse location, and line and column
   positions within the parsed string.
   iis
(R�trfind(R�tstrgR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR7�s
cCs|jdd|�dS(sReturns current line number within a string, counting newlines as line separators.
   The first line is number 1.

   Note: the default parsing behavior is to expand tabs in the input string
   before starting the parsing process.  See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information
   on parsing strings containing C{<TAB>}s, and suggested methods to maintain a
   consistent view of the parsed string, the parse location, and line and column
   positions within the parsed string.
   s
ii(tcount(R�R@((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRH�s
cCsR|jdd|�}|jd|�}|dkrB||d|!S||dSdS(sfReturns the line of text containing loc within a string, counting newlines as line separators.
       s
iiN(R?tfind(R�R@tlastCRtnextCR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRE�s
cCsAdt|�dt|�dt||�t||�fGHdS(NsMatch s at loc s(%d,%d)(RRHR7(tinstringR�texpr((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_defaultStartDebugAction�scCs'dt|�dt|j��GHdS(NsMatched s -> (RRuR�(REtstartloctendlocRFttoks((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_defaultSuccessDebugAction�scCsdt|�GHdS(NsException raised:(R(RER�RFtexc((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_defaultExceptionDebugAction�scGsdS(sG'Do-nothing' debug action, to suppress debugging output during parsing.N((R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRO�sics�tkr�fd�Sdg�tg�td dkrVdd�}dd��ntj}tj�d}|d	d�d
}|d|d|f�������fd�}d
}y"t�dt�d�j�}Wntk
r�t	��}nX||_|S(Ncs
�|�S(N((R�tlRp(tfunc(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq�RriiiicSsJtdkrdnd}tjd||d�|}|j|jfgS(	Niiii����i����tlimiti(iii(tsystem_versiont	tracebackt
extract_stacktfilenameRH(RPRt
frame_summary((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRSscSs2tj|d|�}|d}|j|jfgS(NRPi����(RRt
extract_tbRTRH(ttbRPtframesRU((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRVs
iRPi����ics�x�y&�|�d�}t�d<|SWqtk
r��drI�nAz:tj�d}�|dd�dd �ks��nWd~X�d�kr��dcd7<qn�qXqWdS(Nii����RPii(R�R�Rxtexc_info(R�R}RW(RVt
foundArityRORPtmaxargstpa_call_line_synth(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytwrappers"


 
s<parse action>R�t	__class__(ii(
tsingleArgBuiltinsR�RQRRRSRVtgetattrR�t	ExceptionRu(ROR[RSt	LINE_DIFFt	this_lineR]t	func_name((RVRZRORPR[R\s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_trim_arity�s*
					
	cBseZdZdZeZed��Zed��Zed�Z	d�Z
d�Zed�Ze
d�Zd	�Zd
�Zd�Zd�Zd
�Zd�Ze
d�Zd�Ze
e
d�Zd�Zd�Zdefd��YZedFk	rdefd��YZndefd��YZiZe �Z!ddgZ"e
e
d�Z#eZ$ed��Z%eZ&edd��Z'ed�Z(e)ed�Z*d �Z+e)d!�Z,e)ed"�Z-d#�Z.d$�Z/d%�Z0d&�Z1d'�Z2d(�Z3d)�Z4d*�Z5d+�Z6d,�Z7d-�Z8d.�Z9d/�Z:dFd0�Z;d1�Z<d2�Z=d3�Z>d4�Z?d5�Z@d6�ZAe
d7�ZBd8�ZCd9�ZDd:�ZEd;�ZFgd<�ZGed=�ZHd>�ZId?�ZJd@�ZKdA�ZLdB�ZMe
dC�ZNe
dDe
e
edE�ZORS(Gs)Abstract base level parser element class.s 
	
cCs
|t_dS(s�
        Overrides the default whitespace chars

        Example::
            # default whitespace chars are space, <TAB> and newline
            OneOrMore(Word(alphas)).parseString("abc def\nghi jkl")  # -> ['abc', 'def', 'ghi', 'jkl']
            
            # change to just treat newline as significant
            ParserElement.setDefaultWhitespaceChars(" \t")
            OneOrMore(Word(alphas)).parseString("abc def\nghi jkl")  # -> ['abc', 'def']
        N(R"tDEFAULT_WHITE_CHARS(tchars((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsetDefaultWhitespaceChars=s
cCs
|t_dS(s�
        Set class to be used for inclusion of string literals into a parser.
        
        Example::
            # default literal class used is Literal
            integer = Word(nums)
            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")           

            date_str.parseString("1999/12/31")  # -> ['1999', '/', '12', '/', '31']


            # change to Suppress
            ParserElement.inlineLiteralsUsing(Suppress)
            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")           

            date_str.parseString("1999/12/31")  # -> ['1999', '12', '31']
        N(R"t_literalStringClass(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytinlineLiteralsUsingLscCs�t�|_d|_d|_d|_||_t|_t	j
|_t|_t
|_t
|_t�|_t
|_t
|_t|_d|_t|_d|_d|_t|_t
|_dS(NRr(NNN(R�tparseActionR�t
failActiontstrReprtresultsNamet
saveAsListR�tskipWhitespaceR"Rft
whiteCharstcopyDefaultWhiteCharsR�tmayReturnEmptytkeepTabstignoreExprstdebugtstreamlinedt
mayIndexErrorterrmsgtmodalResultstdebugActionstretcallPreparset
callDuringTry(R�tsavelist((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�as(																cCsEtj|�}|j|_|j|_|jrAtj|_n|S(s$
        Make a copy of this C{ParserElement}.  Useful for defining different parse actions
        for the same parsing pattern, using copies of the original parse element.
        
        Example::
            integer = Word(nums).setParseAction(lambda toks: int(toks[0]))
            integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K")
            integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M")
            
            print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M"))
        prints::
            [5120, 100, 655360, 268435456]
        Equivalent form of C{expr.copy()} is just C{expr()}::
            integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M")
        (R�RkRuRrR"RfRq(R�tcpy((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�xs

	cCs>||_d|j|_t|d�r:|j|j_n|S(sf
        Define name for this expression, makes debugging and exception messages clearer.
        
        Example::
            Word(nums).parseString("ABC")  # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1)
            Word(nums).setName("integer").parseString("ABC")  # -> Exception: Expected integer (at char 0), (line:1, col:1)
        s	Expected t	exception(R�RyR�R�R�(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsetName�s
	cCsE|j�}|jd�r.|d }t}n||_||_|S(sP
        Define name for referencing matching tokens as a nested attribute
        of the returned parse results.
        NOTE: this returns a *copy* of the original C{ParserElement} object;
        this is so that the client can define a basic element, such as an
        integer, and reference it in multiple places with different names.

        You can also set results names using the abbreviated syntax,
        C{expr("name")} in place of C{expr.setResultsName("name")} - 
        see L{I{__call__}<__call__>}.

        Example::
            date_str = (integer.setResultsName("year") + '/' 
                        + integer.setResultsName("month") + '/' 
                        + integer.setResultsName("day"))

            # equivalent form:
            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
        t*i����(R�tendswithR�RnRz(R�R�tlistAllMatchestnewself((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsetResultsName�s
		
csa|r9|j�tt�fd�}�|_||_n$t|jd�r]|jj|_n|S(s�Method to invoke the Python pdb debugger when this element is
           about to be parsed. Set C{breakFlag} to True to enable, False to
           disable.
        cs)ddl}|j��||||�S(Ni����(tpdbt	set_trace(RER�t	doActionstcallPreParseR�(t_parseMethod(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytbreaker�s
t_originalParseMethod(t_parseR�R�R�(R�t	breakFlagR�((R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsetBreak�s		cOs7tttt|���|_|jdt�|_|S(s
        Define action to perform when successfully matching parse element definition.
        Parse action fn is a callable method with 0-3 arguments, called as C{fn(s,loc,toks)},
        C{fn(loc,toks)}, C{fn(toks)}, or just C{fn()}, where:
         - s   = the original string being parsed (see note below)
         - loc = the location of the matching substring
         - toks = a list of the matched tokens, packaged as a C{L{ParseResults}} object
        If the functions in fns modify the tokens, they can return them as the return
        value from fn, and the modified list of tokens will replace the original.
        Otherwise, fn does not need to return any value.

        Optional keyword arguments:
         - callDuringTry = (default=C{False}) indicate if parse action should be run during lookaheads and alternate testing

        Note: the default parsing behavior is to expand tabs in the input string
        before starting the parsing process.  See L{I{parseString}<parseString>} for more information
        on parsing strings containing C{<TAB>}s, and suggested methods to maintain a
        consistent view of the parsed string, the parse location, and line and column
        positions within the parsed string.
        
        Example::
            integer = Word(nums)
            date_str = integer + '/' + integer + '/' + integer

            date_str.parseString("1999/12/31")  # -> ['1999', '/', '12', '/', '31']

            # use parse action to convert to ints at parse time
            integer = Word(nums).setParseAction(lambda toks: int(toks[0]))
            date_str = integer + '/' + integer + '/' + integer

            # note that integer fields are now ints, not strings
            date_str.parseString("1999/12/31")  # -> [1999, '/', 12, '/', 31]
        R~(R�tmapReRkR�R�R~(R�tfnsR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRz�s"cOsF|jtttt|���7_|jp<|jdt�|_|S(s�
        Add parse action to expression's list of parse actions. See L{I{setParseAction}<setParseAction>}.
        
        See examples in L{I{copy}<copy>}.
        R~(RkR�R�ReR~R�R�(R�R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytaddParseAction�s$cs�|jdd��|jdt�r*tnt�x3|D]+����fd�}|jj|�q7W|jp~|jdt�|_|S(s�Add a boolean predicate function to expression's list of parse actions. See 
        L{I{setParseAction}<setParseAction>} for function call signatures. Unlike C{setParseAction}, 
        functions passed to C{addCondition} need to return boolean success/fail of the condition.

        Optional keyword arguments:
         - message = define a custom message to be used in the raised exception
         - fatal   = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException
         
        Example::
            integer = Word(nums).setParseAction(lambda toks: int(toks[0]))
            year_int = integer.copy()
            year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later")
            date_str = year_int + '/' + integer + '/' + integer

            result = date_str.parseString("1999/12/31")  # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1)
        tmessagesfailed user-defined conditiontfatalcs7tt��|||��s3�||���ndS(N(R�Re(R�RNRp(texc_typetfnR�(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytpasR~(R�R�RRRkRR~(R�R�R�R�((R�R�R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytaddCondition�s
cCs
||_|S(sDefine action to perform if parsing fails at this expression.
           Fail acton fn is a callable function that takes the arguments
           C{fn(s,loc,expr,err)} where:
            - s = string being parsed
            - loc = location where expression match was attempted and failed
            - expr = the parse expression that failed
            - err = the exception thrown
           The function returns no value.  It may throw C{L{ParseFatalException}}
           if it is desired to stop parsing immediately.(Rl(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
setFailActions
	cCsnt}xa|rit}xN|jD]C}y)x"|j||�\}}t}q+WWqtk
raqXqWq	W|S(N(R�R�RuR�R(R�RER�t
exprsFoundtetdummy((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_skipIgnorables#s	
cCsp|jr|j||�}n|jrl|j}t|�}x-||krh|||krh|d7}q?Wn|S(Ni(RuR�RpRqR�(R�RER�twttinstrlen((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytpreParse0s			cCs
|gfS(N((R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt	parseImpl<scCs|S(N((R�RER�t	tokenlist((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt	postParse?sc	Cs�|j}|s|jr,|jdr?|jd|||�n|rc|jrc|j||�}n|}|}yUy|j|||�\}}Wn/tk
r�t|t|�|j	|��nXWq�t
k
r(}	|jdr|jd||||	�n|jr"|j||||	�n�q�Xn�|rP|jrP|j||�}n|}|}|jsw|t|�kr�y|j|||�\}}Wq�tk
r�t|t|�|j	|��q�Xn|j|||�\}}|j|||�}t
||jd|jd|j�}
|jrf|s7|jrf|r�yrxk|jD]`}||||
�}|dk	rJt
||jd|jo�t|t
tf�d|j�}
qJqJWWqct
k
r�}	|jdr�|jd||||	�n�qcXqfxn|jD]`}||||
�}|dk	r�t
||jd|joMt|t
tf�d|j�}
q�q�Wn|r�|jdr�|jd|||||
�q�n||
fS(NiiR�R�i(RvRlR{R}R�R�R�RR�RyRRxR�R RnRoRzRkR~R�RsR�(R�RER�R�R�t	debuggingtprelocttokensStartttokensterrt	retTokensR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
_parseNoCacheCsp	

&
	

%$	

	
#cCsNy|j||dt�dSWn)tk
rIt|||j|��nXdS(NR�i(R�R�RRRy(R�RER�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyttryParse�s
cCs7y|j||�Wnttfk
r.tSXtSdS(N(R�RR�R�R�(R�RER�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytcanParseNext�s
t_UnboundedCachecBseZd�ZRS(cs�i�t�|_���fd�}�fd�}�fd�}tj||�|_tj||�|_tj||�|_dS(Ncs�j|��S(N(R�(R�R(tcachetnot_in_cache(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scs|�|<dS(N((R�RR�(R�(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytset�scs�j�dS(N(R(R�(R�(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s(R�R�ttypest
MethodTypeR�R�R(R�R�R�R((R�R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s(R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��st
_FifoCachecBseZd�ZRS(cs�t�|_�t����fd�}��fd�}�fd�}tj||�|_tj||�|_tj||�|_dS(Ncs�j|��S(N(R�(R�R(R�R�(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scs0|�|<t���kr,�jt�ndS(N(R�tpopitemR�(R�RR�(R�tsize(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s
cs�j�dS(N(R(R�(R�(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s(R�R�t_OrderedDictR�R�R�R�R(R�R�R�R�R((R�R�R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s	(R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scBseZd�ZRS(cs�t�|_�i�tjg�����fd�}���fd�}��fd�}tj||�|_tj||�|_tj||�|_dS(Ncs�j|��S(N(R�(R�R(R�R�(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scsF|�|<t���kr5�j�j�d�n�j|�dS(N(R�R�tpopleftR�R(R�RR�(R�tkey_fifoR�(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s
cs�j��j�dS(N(R(R�(R�R�(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s
(	R�R�tcollectionstdequeR�R�R�R�R(R�R�R�R�R((R�R�R�R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s(R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��sic	Cs.d\}}|||||f}tj��tj}|j|�}	|	|jkr�tj|cd7<y|j||||�}	Wn2tk
r�}
|j||
j	|
j
���q$X|j||	d|	dj�f�|	SnCtj|cd7<t|	t
�r|	�n|	d|	dj�fSWdQXdS(Nii(ii(R"tpackrat_cache_lockt
packrat_cacheR�R�tpackrat_cache_statsR�RR�R^R�R�RsRa(R�RER�R�R�tHITtMISStlookupR�R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_parseCache�s$
	$	cCs+tjj�dgttj�tj(dS(Ni(R"R�RR�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
resetCache�s
i�cCsUtjsQtt_|dkr0tj�t_ntj|�t_tjt_ndS(s�Enables "packrat" parsing, which adds memoizing to the parsing logic.
           Repeated parse attempts at the same string location (which happens
           often in many complex grammars) can immediately return a cached value,
           instead of re-executing parsing/validating code.  Memoizing is done of
           both valid results and parsing exceptions.
           
           Parameters:
            - cache_size_limit - (default=C{128}) - if an integer value is provided
              will limit the size of the packrat cache; if None is passed, then
              the cache size will be unbounded; if 0 is passed, the cache will
              be effectively disabled.
            
           This speedup may break existing programs that use parse actions that
           have side-effects.  For this reason, packrat parsing is disabled when
           you first import pyparsing.  To activate the packrat feature, your
           program must call the class method C{ParserElement.enablePackrat()}.  If
           your program uses C{psyco} to "compile as you go", you must call
           C{enablePackrat} before calling C{psyco.full()}.  If you do not do this,
           Python will crash.  For best results, call C{enablePackrat()} immediately
           after importing pyparsing.
           
           Example::
               import pyparsing
               pyparsing.ParserElement.enablePackrat()
        N(	R"t_packratEnabledR�R�R�R�R�R�R�(tcache_size_limit((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
enablePackrats		cCs�tj�|js |j�nx|jD]}|j�q*W|jsV|j�}nyW|j|d�\}}|r�|j||�}t	�t
�}|j||�nWn(tk
r�}tjr��q�|�nX|SdS(sB
        Execute the parse expression with the given string.
        This is the main interface to the client code, once the complete
        expression has been built.

        If you want the grammar to require that the entire input string be
        successfully parsed, then set C{parseAll} to True (equivalent to ending
        the grammar with C{L{StringEnd()}}).

        Note: C{parseString} implicitly calls C{expandtabs()} on the input string,
        in order to report proper column numbers in parse actions.
        If the input string contains tabs and
        the grammar uses parse actions that use the C{loc} argument to index into the
        string being parsed, you can ensure you have a consistent view of the input
        string by:
         - calling C{parseWithTabs} on your grammar before calling C{parseString}
           (see L{I{parseWithTabs}<parseWithTabs>})
         - define your parse action using the full C{(s,loc,toks)} signature, and
           reference the input string using the parse action's C{s} argument
         - explictly expand the tabs in your input string before calling
           C{parseString}
        
        Example::
            Word('a').parseString('aaaaabaaa')  # -> ['aaaaa']
            Word('a').parseString('aaaaabaaa', parseAll=True)  # -> Exception: Expected end of text
        iN(
R"R�Rwt
streamlineRuRtt
expandtabsR�R�RR'Rtverbose_stacktrace(R�REtparseAllR�R�R�tseRL((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytparseString#s$
	
		
ccs�|js|j�nx|jD]}|j�q W|jsRt|�j�}nt|�}d}|j}|j}t	j
�d}	y�x�||kra|	|kray.|||�}
|||
dt�\}}Wntk
r�|
d}q�X||krT|	d7}	||
|fV|rK|||�}
|
|kr>|}qQ|d7}q^|}q�|
d}q�WWn(t
k
r�}t	jr��q�|�nXdS(s�
        Scan the input string for expression matches.  Each match will return the
        matching tokens, start location, and end location.  May be called with optional
        C{maxMatches} argument, to clip scanning after 'n' matches are found.  If
        C{overlap} is specified, then overlapping matches will be reported.

        Note that the start and end locations are reported relative to the string
        being parsed.  See L{I{parseString}<parseString>} for more information on parsing
        strings with embedded tabs.

        Example::
            source = "sldjf123lsdjjkf345sldkjf879lkjsfd987"
            print(source)
            for tokens,start,end in Word(alphas).scanString(source):
                print(' '*start + '^'*(end-start))
                print(' '*start + tokens[0])
        
        prints::
        
            sldjf123lsdjjkf345sldkjf879lkjsfd987
            ^^^^^
            sldjf
                    ^^^^^^^
                    lsdjjkf
                              ^^^^^^
                              sldkjf
                                       ^^^^^^
                                       lkjsfd
        iR�iN(RwR�RuRtRR�R�R�R�R"R�R�RRR�(R�REt
maxMatchestoverlapR�R�R�t
preparseFntparseFntmatchesR�tnextLocR�tnextlocRL((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
scanStringUsB	
			


	
		c	Cs%g}d}t|_y�x�|j|�D]}\}}}|j|||!�|r�t|t�rs||j�7}q�t|t�r�||7}q�|j|�n|}q(W|j||�g|D]}|r�|^q�}djt	t
t|���SWn(tk
r }t
jr�q!|�nXdS(sf
        Extension to C{L{scanString}}, to modify matching text with modified tokens that may
        be returned from a parse action.  To use C{transformString}, define a grammar and
        attach a parse action to it that modifies the returned token list.
        Invoking C{transformString()} on a target string will then scan for matches,
        and replace the matched text patterns according to the logic in the parse
        action.  C{transformString()} returns the resulting transformed string.
        
        Example::
            wd = Word(alphas)
            wd.setParseAction(lambda toks: toks[0].title())
            
            print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york."))
        Prints::
            Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York.
        iRrN(R�RtR�RRsR R�R�R�R�Rt_flattenRR"R�(	R�RERtlastERpR�R�toRL((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR{�s(	

 	cCsey6tg|j||�D]\}}}|^q�SWn(tk
r`}tjrW�qa|�nXdS(s~
        Another extension to C{L{scanString}}, simplifying the access to the tokens found
        to match the given parse expression.  May be called with optional
        C{maxMatches} argument, to clip searching after 'n' matches are found.
        
        Example::
            # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters
            cap_word = Word(alphas.upper(), alphas.lower())
            
            print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity"))
        prints::
            ['More', 'Iron', 'Lead', 'Gold', 'I']
        N(R R�RR"R�(R�RER�RpR�R�RL((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsearchString�s6	c	csfd}d}xJ|j|d|�D]3\}}}|||!V|rO|dVn|}q"W||VdS(s[
        Generator method to split a string using the given expression as a separator.
        May be called with optional C{maxsplit} argument, to limit the number of splits;
        and the optional C{includeSeparators} argument (default=C{False}), if the separating
        matching text should be included in the split results.
        
        Example::        
            punc = oneOf(list(".,;:/-!?"))
            print(list(punc.split("This, this?, this sentence, is badly punctuated!")))
        prints::
            ['This', ' this', '', ' this sentence', ' is badly punctuated', '']
        iR�N(R�(	R�REtmaxsplittincludeSeparatorstsplitstlastRpR�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s
%
cCsdt|t�r!tj|�}nt|t�sTtjdt|�tdd�dSt	||g�S(s�
        Implementation of + operator - returns C{L{And}}. Adding strings to a ParserElement
        converts them to L{Literal}s by default.
        
        Example::
            greet = Word(alphas) + "," + Word(alphas) + "!"
            hello = "Hello, World!"
            print (hello, "->", greet.parseString(hello))
        Prints::
            Hello, World! -> ['Hello', ',', 'World', '!']
        s4Cannot combine element of type %s with ParserElementt
stackleveliN(
RsR�R"RitwarningstwarnR�t
SyntaxWarningR�R(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR
�s
cCs\t|t�r!tj|�}nt|t�sTtjdt|�tdd�dS||S(s]
        Implementation of + operator when left operand is not a C{L{ParserElement}}
        s4Cannot combine element of type %s with ParserElementR�iN(	RsR�R"RiR�R�R�R�R�(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs
cCsmt|t�r!tj|�}nt|t�sTtjdt|�tdd�dSt	|t	j
�|g�S(sQ
        Implementation of - operator, returns C{L{And}} with error stop
        s4Cannot combine element of type %s with ParserElementR�iN(RsR�R"RiR�R�R�R�R�Rt
_ErrorStop(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__sub__s
cCs\t|t�r!tj|�}nt|t�sTtjdt|�tdd�dS||S(s]
        Implementation of - operator when left operand is not a C{L{ParserElement}}
        s4Cannot combine element of type %s with ParserElementR�iN(	RsR�R"RiR�R�R�R�R�(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__rsub__ s
csEt|t�r|d}}n-t|t�r7|dd }|dd
kr_d|df}nt|dt�r�|dd
kr�|ddkr�t��S|ddkr�t��S�|dt��SqLt|dt�rt|dt�r|\}}||8}qLtdt|d�t|d���ntdt|���|dkrgtd��n|dkr�td��n||ko�dknr�td��n|r��fd	��|r
|dkr���|�}qt	�g|��|�}qA�|�}n(|dkr.�}nt	�g|�}|S(s�
        Implementation of * operator, allows use of C{expr * 3} in place of
        C{expr + expr + expr}.  Expressions may also me multiplied by a 2-integer
        tuple, similar to C{{min,max}} multipliers in regular expressions.  Tuples
        may also include C{None} as in:
         - C{expr*(n,None)} or C{expr*(n,)} is equivalent
              to C{expr*n + L{ZeroOrMore}(expr)}
              (read as "at least n instances of C{expr}")
         - C{expr*(None,n)} is equivalent to C{expr*(0,n)}
              (read as "0 to n instances of C{expr}")
         - C{expr*(None,None)} is equivalent to C{L{ZeroOrMore}(expr)}
         - C{expr*(1,None)} is equivalent to C{L{OneOrMore}(expr)}

        Note that C{expr*(None,n)} does not raise an exception if
        more than n exprs exist in the input stream; that is,
        C{expr*(None,n)} does not enforce a maximum number of expr
        occurrences.  If this behavior is desired, then write
        C{expr*(None,n) + ~expr}
        iiis7cannot multiply 'ParserElement' and ('%s','%s') objectss0cannot multiply 'ParserElement' and '%s' objectss/cannot multiply ParserElement by negative values@second tuple value must be greater or equal to first tuple values+cannot multiply ParserElement by 0 or (0,0)cs2|dkr$t��|d��St��SdS(Ni(R(tn(tmakeOptionalListR�(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�]sN(NN(
RsRottupleR�R0RR�R�t
ValueErrorR(R�R	tminElementstoptElementsR}((R�R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__mul__,sD#

&
) 	cCs
|j|�S(N(R�(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__rmul__pscCsdt|t�r!tj|�}nt|t�sTtjdt|�tdd�dSt	||g�S(sI
        Implementation of | operator - returns C{L{MatchFirst}}
        s4Cannot combine element of type %s with ParserElementR�iN(
RsR�R"RiR�R�R�R�R�R(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__or__ss
cCs\t|t�r!tj|�}nt|t�sTtjdt|�tdd�dS||BS(s]
        Implementation of | operator when left operand is not a C{L{ParserElement}}
        s4Cannot combine element of type %s with ParserElementR�iN(	RsR�R"RiR�R�R�R�R�(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__ror__s
cCsdt|t�r!tj|�}nt|t�sTtjdt|�tdd�dSt	||g�S(sA
        Implementation of ^ operator - returns C{L{Or}}
        s4Cannot combine element of type %s with ParserElementR�iN(
RsR�R"RiR�R�R�R�R�R(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__xor__�s
cCs\t|t�r!tj|�}nt|t�sTtjdt|�tdd�dS||AS(s]
        Implementation of ^ operator when left operand is not a C{L{ParserElement}}
        s4Cannot combine element of type %s with ParserElementR�iN(	RsR�R"RiR�R�R�R�R�(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__rxor__�s
cCsdt|t�r!tj|�}nt|t�sTtjdt|�tdd�dSt	||g�S(sC
        Implementation of & operator - returns C{L{Each}}
        s4Cannot combine element of type %s with ParserElementR�iN(
RsR�R"RiR�R�R�R�R�R
(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__and__�s
cCs\t|t�r!tj|�}nt|t�sTtjdt|�tdd�dS||@S(s]
        Implementation of & operator when left operand is not a C{L{ParserElement}}
        s4Cannot combine element of type %s with ParserElementR�iN(	RsR�R"RiR�R�R�R�R�(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__rand__�s
cCs
t|�S(sE
        Implementation of ~ operator - returns C{L{NotAny}}
        (R(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
__invert__�scCs'|dk	r|j|�S|j�SdS(s

        Shortcut for C{L{setResultsName}}, with C{listAllMatches=False}.
        
        If C{name} is given with a trailing C{'*'} character, then C{listAllMatches} will be
        passed as C{True}.
           
        If C{name} is omitted, same as calling C{L{copy}}.

        Example::
            # these are equivalent
            userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno")
            userdata = Word(alphas)("name") + Word(nums+"-")("socsecno")             
        N(R�R�R�(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__call__�s
cCs
t|�S(s�
        Suppresses the output of this C{ParserElement}; useful to keep punctuation from
        cluttering up returned output.
        (R)(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsuppress�scCs
t|_|S(s
        Disables the skipping of whitespace before matching the characters in the
        C{ParserElement}'s defined pattern.  This is normally only used internally by
        the pyparsing module, but may be needed in some whitespace-sensitive grammars.
        (R�Rp(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytleaveWhitespace�s	cCst|_||_t|_|S(s8
        Overrides the default whitespace chars
        (R�RpRqR�Rr(R�Rg((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsetWhitespaceChars�s			cCs
t|_|S(s�
        Overrides default behavior to expand C{<TAB>}s to spaces before parsing the input string.
        Must be called before C{parseString} when the input grammar contains elements that
        match C{<TAB>} characters.
        (R�Rt(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
parseWithTabs�s	cCsrt|t�rt|�}nt|t�rR||jkrn|jj|�qnn|jjt|j���|S(s�
        Define expression to be ignored (e.g., comments) while doing pattern
        matching; may be called repeatedly, to define multiple comment or other
        ignorable patterns.
        
        Example::
            patt = OneOrMore(Word(alphas))
            patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj']
            
            patt.ignore(cStyleComment)
            patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd']
        (RsR�R)RuRR�(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytignore�s
cCs1|p	t|pt|ptf|_t|_|S(sT
        Enable display of debugging messages while doing pattern matching.
        (RGRKRMR{R�Rv(R�tstartActiont
successActiontexceptionAction((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsetDebugActions
s
			cCs)|r|jttt�n	t|_|S(s�
        Enable display of debugging messages while doing pattern matching.
        Set C{flag} to True to enable, False to disable.

        Example::
            wd = Word(alphas).setName("alphaword")
            integer = Word(nums).setName("numword")
            term = wd | integer
            
            # turn on debugging for wd
            wd.setDebug()

            OneOrMore(term).parseString("abc 123 xyz 890")
        
        prints::
            Match alphaword at loc 0(1,1)
            Matched alphaword -> ['abc']
            Match alphaword at loc 3(1,4)
            Exception raised:Expected alphaword (at char 4), (line:1, col:5)
            Match alphaword at loc 7(1,8)
            Matched alphaword -> ['xyz']
            Match alphaword at loc 11(1,12)
            Exception raised:Expected alphaword (at char 12), (line:1, col:13)
            Match alphaword at loc 15(1,16)
            Exception raised:Expected alphaword (at char 15), (line:1, col:16)

        The output shown is that produced by the default debug actions - custom debug actions can be
        specified using L{setDebugActions}. Prior to attempting
        to match the C{wd} expression, the debugging message C{"Match <exprname> at loc <n>(<line>,<col>)"}
        is shown. Then if the parse succeeds, a C{"Matched"} message is shown, or an C{"Exception raised"}
        message is shown. Also note the use of L{setName} to assign a human-readable name to the expression,
        which makes debugging and exception messages easier to understand - for instance, the default
        name created for the C{Word} expression without calling C{setName} is C{"W:(ABCD...)"}.
        (R�RGRKRMR�Rv(R�tflag((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsetDebugs#	cCs|jS(N(R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�@scCs
t|�S(N(R(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�CscCst|_d|_|S(N(R�RwR�Rm(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�Fs		cCsdS(N((R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytcheckRecursionKscCs|jg�dS(sj
        Check defined expressions for valid structure, check for infinite recursive definitions.
        N(R(R�t
validateTrace((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytvalidateNscCs�y|j�}Wn5tk
rGt|d��}|j�}WdQXnXy|j||�SWn(tk
r�}tjr}�q�|�nXdS(s�
        Execute the parse expression on the given file or filename.
        If a filename is specified (instead of a file object),
        the entire file is opened, read, and closed before parsing.
        trN(treadR�topenR�RR"R�(R�tfile_or_filenameR�t
file_contentstfRL((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt	parseFileTs
	cCsdt|t�r1||kp0t|�t|�kSt|t�rM|j|�Stt|�|kSdS(N(RsR"tvarsR�R�tsuper(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__eq__hs
"
cCs||kS(N((R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__ne__pscCstt|��S(N(thashtid(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__hash__sscCs
||kS(N((R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__req__vscCs||kS(N((R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__rne__yscCs:y!|jt|�d|�tSWntk
r5tSXdS(s�
        Method for quick testing of a parser against a test string. Good for simple 
        inline microtests of sub expressions while building up larger parser.
           
        Parameters:
         - testString - to test against this expression for a match
         - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests
            
        Example::
            expr = Word(nums)
            assert expr.matches("100")
        R�N(R�RR�RR�(R�t
testStringR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�|s


t#cCsyt|t�r6tttj|j�j���}nt|t�rTt|�}ng}g}t	}	x|D]�}
|dk	r�|j|
t�s�|r�|
r�|j
|
�qmn|
s�qmndj|�|
g}g}yQ|
jdd�}
|j|
d|�}|j
|jd|��|	o%|}	Wn�tk
r�}
t|
t�rPdnd}d|
kr�|j
t|
j|
��|j
dt|
j|
�dd	|�n|j
d|
jd	|�|j
d
t|
��|	o�|}	|
}n<tk
r*}|j
dt|��|	o|}	|}nX|rX|rG|j
d�ndj|�GHn|j
|
|f�qmW|	|fS(
s3
        Execute the parse expression on a series of test strings, showing each
        test, the parsed results or where the parse failed. Quick and easy way to
        run a parse expression against a list of sample strings.
           
        Parameters:
         - tests - a list of separate test strings, or a multiline string of test strings
         - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests           
         - comment - (default=C{'#'}) - expression for indicating embedded comments in the test 
              string; pass None to disable comment filtering
         - fullDump - (default=C{True}) - dump results as list followed by results names in nested outline;
              if False, only dump nested list
         - printResults - (default=C{True}) prints test output to stdout
         - failureTests - (default=C{False}) indicates if these tests are expected to fail parsing

        Returns: a (success, results) tuple, where success indicates that all tests succeeded
        (or failed if C{failureTests} is True), and the results contain a list of lines of each 
        test's output
        
        Example::
            number_expr = pyparsing_common.number.copy()

            result = number_expr.runTests('''
                # unsigned integer
                100
                # negative integer
                -100
                # float with scientific notation
                6.02e23
                # integer with scientific notation
                1e-12
                ''')
            print("Success" if result[0] else "Failed!")

            result = number_expr.runTests('''
                # stray character
                100Z
                # missing leading digit before '.'
                -.100
                # too many '.'
                3.14.159
                ''', failureTests=True)
            print("Success" if result[0] else "Failed!")
        prints::
            # unsigned integer
            100
            [100]

            # negative integer
            -100
            [-100]

            # float with scientific notation
            6.02e23
            [6.02e+23]

            # integer with scientific notation
            1e-12
            [1e-12]

            Success
            
            # stray character
            100Z
               ^
            FAIL: Expected end of text (at char 3), (line:1, col:4)

            # missing leading digit before '.'
            -.100
            ^
            FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1)

            # too many '.'
            3.14.159
                ^
            FAIL: Expected end of text (at char 4), (line:1, col:5)

            Success

        Each test string must be on a single line. If you want to test a string that spans multiple
        lines, create a test like this::

            expr.runTest(r"this is a test\n of strings that spans \n 3 lines")
        
        (Note that this is a raw string literal, you must include the leading 'r'.)
        s
s\nR�R6s(FATAL)Rrt it^sFAIL: sFAIL-EXCEPTION: N(RsR�R�R�RuR�trstript
splitlinesRR�R�R�R�RR�R�R�R3RRRER�R7Ra(R�ttestsR�tcommenttfullDumptprintResultstfailureTestst
allResultstcommentstsuccessRpRtresultR�R�RL((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytrunTests�sNW'
+
,	
N(PR�R�R�RfR�R�tstaticmethodRhRjR�R�R�R�R�R�RzR�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�RR�R�R�R�R�R�R�R�t_MAX_INTR�R{R�R�R
RR�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�RRR	RR
RRRR�R"(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR"8s�			&	
		
	
		H			"2G	+					D																	
)									cBseZdZd�ZRS(sT
    Abstract C{ParserElement} subclass, for defining atomic matching patterns.
    cCstt|�jdt�dS(NR(RR*R�R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�	s(R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR*	scBseZdZd�ZRS(s,
    An empty token, will always match.
    cCs2tt|�j�d|_t|_t|_dS(NR(RRR�R�R�RsR�Rx(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�	s		(R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR	scBs#eZdZd�Zed�ZRS(s(
    A token that will never match.
    cCs;tt|�j�d|_t|_t|_d|_dS(NRsUnmatchable token(	RRR�R�R�RsR�RxRy(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�*	s
			cCst|||j|��dS(N(RRy(R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�1	s(R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR&	s	cBs#eZdZd�Zed�ZRS(s�
    Token to exactly match a specified string.
    
    Example::
        Literal('blah').parseString('blah')  # -> ['blah']
        Literal('blah').parseString('blahfooblah')  # -> ['blah']
        Literal('blah').parseString('bla')  # -> Exception: Expected "blah"
    
    For case-insensitive matching, use L{CaselessLiteral}.
    
    For keyword matching (force word break before and after the matched string),
    use L{Keyword} or L{CaselessKeyword}.
    cCs�tt|�j�||_t|�|_y|d|_Wn0tk
rntj	dt
dd�t|_nXdt
|j�|_d|j|_t|_t|_dS(Nis2null string passed to Literal; use Empty() insteadR�is"%s"s	Expected (RRR�tmatchR�tmatchLentfirstMatchCharR�R�R�R�RR^RR�RyR�RsRx(R�tmatchString((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�C	s	
	

	cCsg|||jkrK|jdks7|j|j|�rK||j|jfSt|||j|��dS(Ni(R'R&t
startswithR%RRy(R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�V	s$(R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR5	s
	cBsKeZdZedZded�Zed�Z	d�Z
ed��ZRS(s\
    Token to exactly match a specified string as a keyword, that is, it must be
    immediately followed by a non-keyword character.  Compare with C{L{Literal}}:
     - C{Literal("if")} will match the leading C{'if'} in C{'ifAndOnlyIf'}.
     - C{Keyword("if")} will not; it will only match the leading C{'if'} in C{'if x=1'}, or C{'if(y==2)'}
    Accepts two optional constructor arguments in addition to the keyword string:
     - C{identChars} is a string of characters that would be valid identifier characters,
          defaulting to all alphanumerics + "_" and "$"
     - C{caseless} allows case-insensitive matching, default is C{False}.
       
    Example::
        Keyword("start").parseString("start")  # -> ['start']
        Keyword("start").parseString("starting")  # -> Exception

    For case-insensitive matching, use L{CaselessKeyword}.
    s_$cCs�tt|�j�|dkr+tj}n||_t|�|_y|d|_Wn't	k
r}t
jdtdd�nXd|j|_
d|j
|_t|_t|_||_|r�|j�|_|j�}nt|�|_dS(Nis2null string passed to Keyword; use Empty() insteadR�is"%s"s	Expected (RRR�R�tDEFAULT_KEYWORD_CHARSR%R�R&R'R�R�R�R�R�RyR�RsRxtcaselesstuppert
caselessmatchR�t
identChars(R�R(R.R+((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�q	s&	
				cCsb|jr�||||j!j�|jkrF|t|�|jkse|||jj�|jkrF|dks�||dj�|jkrF||j|jfSn�|||jkrF|jdks�|j|j|�rF|t|�|jks|||j|jkrF|dks2||d|jkrF||j|jfSt	|||j
|��dS(Nii(R+R&R,R-R�R.R%R'R)RRy(R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��	s	#9)$3#cCs%tt|�j�}tj|_|S(N(RRR�R*R.(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��	scCs
|t_dS(s,Overrides the default Keyword chars
        N(RR*(Rg((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsetDefaultKeywordChars�	sN(
R�R�R�R1R*R�R�R�R�R�R�R#R/(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR^	s
	cBs#eZdZd�Zed�ZRS(sl
    Token to match a specified string, ignoring case of letters.
    Note: the matched results will always be in the case of the given
    match string, NOT the case of the input text.

    Example::
        OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD']
        
    (Contrast with example for L{CaselessKeyword}.)
    cCsItt|�j|j��||_d|j|_d|j|_dS(Ns'%s's	Expected (RRR�R,treturnStringR�Ry(R�R(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��	s	cCsS||||j!j�|jkr7||j|jfSt|||j|��dS(N(R&R,R%R0RRy(R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��	s#(R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�	s
	cBs&eZdZdd�Zed�ZRS(s�
    Caseless version of L{Keyword}.

    Example::
        OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD']
        
    (Contrast with example for L{CaselessLiteral}.)
    cCs#tt|�j||dt�dS(NR+(RRR�R�(R�R(R.((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��	scCs�||||j!j�|jkrp|t|�|jks\|||jj�|jkrp||j|jfSt|||j|��dS(N(R&R,R-R�R.R%RRy(R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��	s#9N(R�R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�	scBs&eZdZdd�Zed�ZRS(sx
    A variation on L{Literal} which matches "close" matches, that is, 
    strings with at most 'n' mismatching characters. C{CloseMatch} takes parameters:
     - C{match_string} - string to be matched
     - C{maxMismatches} - (C{default=1}) maximum number of mismatches allowed to count as a match
    
    The results from a successful parse will contain the matched text from the input string and the following named results:
     - C{mismatches} - a list of the positions within the match_string where mismatches were found
     - C{original} - the original match_string used to compare against the input string
    
    If C{mismatches} is an empty list, then the match was an exact match.
    
    Example::
        patt = CloseMatch("ATCATCGAATGGA")
        patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']})
        patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1)

        # exact match
        patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']})

        # close match allowing up to 2 mismatches
        patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2)
        patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']})
    icCs]tt|�j�||_||_||_d|j|jf|_t|_t|_	dS(Ns&Expected %r (with up to %d mismatches)(
RRjR�R�tmatch_stringt
maxMismatchesRyR�RxRs(R�R1R2((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��	s				cCs|}t|�}|t|j�}||kr|j}d}g}	|j}
x�tt|||!|j��D]J\}}|\}}
||
kro|	j|�t|	�|
kr�Pq�qoqoW|d}t|||!g�}|j|d<|	|d<||fSnt|||j|��dS(Niitoriginalt
mismatches(	R�R1R2R�R�RR RRy(R�RER�R�tstartR�tmaxlocR1tmatch_stringlocR4R2ts_mtsrctmattresults((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��	s(		,




(R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRj�	s	cBs>eZdZddddedd�Zed�Zd�ZRS(s	
    Token for matching words composed of allowed character sets.
    Defined with string containing all allowed initial characters,
    an optional string containing allowed body characters (if omitted,
    defaults to the initial character set), and an optional minimum,
    maximum, and/or exact length.  The default value for C{min} is 1 (a
    minimum value < 1 is not valid); the default values for C{max} and C{exact}
    are 0, meaning no maximum or exact length restriction. An optional
    C{excludeChars} parameter can list characters that might be found in 
    the input C{bodyChars} string; useful to define a word of all printables
    except for one or two characters, for instance.
    
    L{srange} is useful for defining custom character set strings for defining 
    C{Word} expressions, using range notation from regular expression character sets.
    
    A common mistake is to use C{Word} to match a specific literal string, as in 
    C{Word("Address")}. Remember that C{Word} uses the string argument to define
    I{sets} of matchable characters. This expression would match "Add", "AAA",
    "dAred", or any other word made up of the characters 'A', 'd', 'r', 'e', and 's'.
    To match an exact literal string, use L{Literal} or L{Keyword}.

    pyparsing includes helper strings for building Words:
     - L{alphas}
     - L{nums}
     - L{alphanums}
     - L{hexnums}
     - L{alphas8bit} (alphabetic characters in ASCII range 128-255 - accented, tilded, umlauted, etc.)
     - L{punc8bit} (non-alphabetic characters in ASCII range 128-255 - currency, symbols, superscripts, diacriticals, etc.)
     - L{printables} (any non-whitespace character)

    Example::
        # a word composed of digits
        integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9"))
        
        # a word with a leading capital, and zero or more lowercase
        capital_word = Word(alphas.upper(), alphas.lower())

        # hostnames are alphanumeric, with leading alpha, and '-'
        hostname = Word(alphas, alphanums+'-')
        
        # roman numeral (not a strict parser, accepts invalid mix of characters)
        roman = Word("IVXLCDM")
        
        # any string of non-whitespace characters, except for ','
        csv_value = Word(printables, excludeChars=",")
    iics�tt|�j��rcdj�fd�|D��}|rcdj�fd�|D��}qcn||_t|�|_|r�||_t|�|_n||_t|�|_|dk|_	|dkr�t
d��n||_|dkr�||_n	t
|_|dkr)||_||_nt|�|_d|j|_t|_||_d|j|jkr}|dkr}|dkr}|dkr}|j|jkr�d	t|j�|_net|j�dkr�d
tj|j�t|j�f|_n%dt|j�t|j�f|_|jrDd|jd|_nytj|j�|_Wq}tk
ryd|_q}XndS(
NRrc3s!|]}|�kr|VqdS(N((R�R�(texcludeChars(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>7
sc3s!|]}|�kr|VqdS(N((R�R�(R<(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>9
siisZcannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitteds	Expected Rs[%s]+s%s[%s]*s	[%s][%s]*s\b(RR-R�R�t
initCharsOrigR�t	initCharst
bodyCharsOrigt	bodyCharstmaxSpecifiedR�tminLentmaxLenR$RR�RyR�Rxt	asKeywordt_escapeRegexRangeCharstreStringR�R|tescapetcompileRaR�(R�R>R@tmintmaxtexactRDR<((R<s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�4
sT%								:	
c
Cs�|jr[|jj||�}|s?t|||j|��n|j�}||j�fS|||jkr�t|||j|��n|}|d7}t|�}|j}||j	}t
||�}x*||kr�|||kr�|d7}q�Wt}	|||jkrt
}	n|jrG||krG|||krGt
}	n|jr�|dkrp||d|ks�||kr�|||kr�t
}	q�n|	r�t|||j|��n||||!fS(Nii(R|R%RRytendtgroupR>R�R@RCRIR�RBR�RARD(
R�RER�R�R!R5R�t	bodycharsR6tthrowException((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�j
s6	
	
	%		<cCs�ytt|�j�SWntk
r*nX|jdkr�d�}|j|jkr}d||j�||j�f|_q�d||j�|_n|jS(NcSs&t|�dkr|d dS|SdS(Nis...(R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
charsAsStr�
ss	W:(%s,%s)sW:(%s)(RR-R�RaRmR�R=R?(R�RP((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��
s
	(N(	R�R�R�R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR-
s.6#cBsDeZdZeejd��Zdd�Zed�Z	d�Z
RS(s�
    Token for matching strings that match a given regular expression.
    Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module.
    If the given regex contains named groups (defined using C{(?P<name>...)}), these will be preserved as 
    named parse results.

    Example::
        realnum = Regex(r"[+-]?\d+\.\d*")
        date = Regex(r'(?P<year>\d{4})-(?P<month>\d\d?)-(?P<day>\d\d?)')
        # ref: http://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression
        roman = Regex(r"M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})")
    s[A-Z]icCs3tt|�j�t|t�r�|sAtjdtdd�n||_||_	y+t
j|j|j	�|_
|j|_Wq�t
jk
r�tjd|tdd��q�XnIt|tj�r�||_
t|�|_|_||_	ntd��t|�|_d|j|_t|_t|_dS(s�The parameters C{pattern} and C{flags} are passed to the C{re.compile()} function as-is. See the Python C{re} module for an explanation of the acceptable patterns and flags.s0null string passed to Regex; use Empty() insteadR�is$invalid pattern (%s) passed to RegexsCRegex may only be constructed with a string or a compiled RE objects	Expected N(RR%R�RsR�R�R�R�tpatterntflagsR|RHRFt
sre_constantsterrortcompiledREtypeRuR�RR�RyR�RxR�Rs(R�RQRR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��
s.			


		cCs�|jj||�}|s6t|||j|��n|j�}|j�}t|j��}|r�x|D]}||||<qmWn||fS(N(R|R%RRyRLt	groupdictR RM(R�RER�R�R!tdR}R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��
s
cCsZytt|�j�SWntk
r*nX|jdkrSdt|j�|_n|jS(NsRe:(%s)(RR%R�RaRmR�R�RQ(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��
s
(R�R�R�R�R|RHRUR�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR%�
s
"
cBs>eZdZddeeded�Zed�Zd�ZRS(s�
    Token for matching strings that are delimited by quoting characters.
    
    Defined with the following parameters:
        - quoteChar - string of one or more characters defining the quote delimiting string
        - escChar - character to escape quotes, typically backslash (default=C{None})
        - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=C{None})
        - multiline - boolean indicating whether quotes can span multiple lines (default=C{False})
        - unquoteResults - boolean indicating whether the matched text should be unquoted (default=C{True})
        - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=C{None} => same as quoteChar)
        - convertWhitespaceEscapes - convert escaped whitespace (C{'\t'}, C{'\n'}, etc.) to actual whitespace (default=C{True})

    Example::
        qs = QuotedString('"')
        print(qs.searchString('lsjdf "This is the quote" sldjf'))
        complex_qs = QuotedString('{{', endQuoteChar='}}')
        print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf'))
        sql_qs = QuotedString('"', escQuote='""')
        print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf'))
    prints::
        [['This is the quote']]
        [['This is the "quote"']]
        [['This is the quote with "embedded" quotes']]
    c	stt��j�|j�}|sGtjdtdd�t��n|dkr\|}n4|j�}|s�tjdtdd�t��n|�_	t
|��_|d�_|�_
t
|��_|�_|�_|�_|�_|rTtjtjB�_dtj�j	�t�j
d�|dk	rDt|�pGdf�_nPd�_dtj�j	�t�j
d�|dk	r�t|�p�df�_t
�j
�d	kr�jd
dj�fd�tt
�j
�d	dd
�D��d7_n|r*�jdtj|�7_n|rh�jdtj|�7_tj�j�d�_n�jdtj�j
�7_y+tj�j�j��_�j�_Wn4tj k
r�tjd�jtdd��nXt!���_"d�j"�_#t$�_%t&�_'dS(Ns$quoteChar cannot be the empty stringR�is'endQuoteChar cannot be the empty stringis%s(?:[^%s%s]Rrs%s(?:[^%s\n\r%s]is|(?:s)|(?:c3s<|]2}dtj�j| �t�j|�fVqdS(s%s[^%s]N(R|RGtendQuoteCharRE(R�R�(R�(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>/si����t)s|(?:%s)s|(?:%s.)s(.)s)*%ss$invalid pattern (%s) passed to Regexs	Expected ((RR#R�R�R�R�R�tSyntaxErrorR�t	quoteCharR�tquoteCharLentfirstQuoteCharRXtendQuoteCharLentescChartescQuotetunquoteResultstconvertWhitespaceEscapesR|t	MULTILINEtDOTALLRRRGRERQR�R�tescCharReplacePatternRHRFRSRTRR�RyR�RxR�Rs(R�R[R_R`t	multilineRaRXRb((R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�sf		
					(	%E
	c	CsT|||jkr(|jj||�p+d}|sOt|||j|��n|j�}|j�}|jrJ||j	|j
!}t|t�rJd|kr�|j
r�idd6dd6dd6dd	6}x/|j�D]\}}|j||�}q�Wn|jr tj|jd
|�}n|jrG|j|j|j�}qGqJn||fS(Ns\s	s\ts
s\nss\fs
s\rs\g<1>(R]R|R%R�RRyRLRMRaR\R^RsR�RbR�R�R_R�ReR`RX(	R�RER�R�R!R}tws_maptwslittwschar((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�Gs*.	
		!cCs]ytt|�j�SWntk
r*nX|jdkrVd|j|jf|_n|jS(Ns.quoted string, starting with %s ending with %s(RR#R�RaRmR�R[RX(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�js
N(	R�R�R�R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR#�
sA#cBs5eZdZdddd�Zed�Zd�ZRS(s�
    Token for matching words composed of characters I{not} in a given set (will
    include whitespace in matched characters if not listed in the provided exclusion set - see example).
    Defined with string containing all disallowed characters, and an optional
    minimum, maximum, and/or exact length.  The default value for C{min} is 1 (a
    minimum value < 1 is not valid); the default values for C{max} and C{exact}
    are 0, meaning no maximum or exact length restriction.

    Example::
        # define a comma-separated-value as anything that is not a ','
        csv_value = CharsNotIn(',')
        print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213"))
    prints::
        ['dkls', 'lsdkjf', 's12 34', '@!#', '213']
    iicCs�tt|�j�t|_||_|dkr@td��n||_|dkra||_n	t	|_|dkr�||_||_nt
|�|_d|j|_|jdk|_
t|_dS(Nisfcannot specify a minimum length < 1; use Optional(CharsNotIn()) if zero-length char group is permittedis	Expected (RRR�R�RptnotCharsR�RBRCR$RR�RyRsRx(R�RjRIRJRK((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s 					cCs�|||jkr.t|||j|��n|}|d7}|j}t||jt|��}x*||kr�|||kr�|d7}qfW|||jkr�t|||j|��n||||!fS(Ni(RjRRyRIRCR�RB(R�RER�R�R5tnotcharstmaxlen((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s
	cCs�ytt|�j�SWntk
r*nX|jdkryt|j�dkrfd|jd |_qyd|j|_n|jS(Nis
!W:(%s...)s!W:(%s)(RRR�RaRmR�R�Rj(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s
(R�R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRvscBsXeZdZidd6dd6dd6dd6d	d
6Zddd
d
d�Zed�ZRS(s�
    Special matching class for matching whitespace.  Normally, whitespace is ignored
    by pyparsing grammars.  This class is included when some whitespace structures
    are significant.  Define with a string containing the whitespace characters to be
    matched; default is C{" \t\r\n"}.  Also takes optional C{min}, C{max}, and C{exact} arguments,
    as defined for the C{L{Word}} class.
    s<SPC>Rs<TAB>s	s<LF>s
s<CR>s
s<FF>ss 	
iics�tt��j�|�_�jdj�fd��jD���djd��jD���_t�_	d�j�_
|�_|dkr�|�_n	t
�_|dkr�|�_|�_ndS(NRrc3s$|]}|�jkr|VqdS(N(t
matchWhite(R�R�(R�(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�scss|]}tj|VqdS(N(R,t	whiteStrs(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�ss	Expected i(RR,R�RmR�R�RqR�R�RsRyRBRCR$(R�twsRIRJRK((R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s	)				cCs�|||jkr.t|||j|��n|}|d7}||j}t|t|��}x-||kr�|||jkr�|d7}qcW|||jkr�t|||j|��n||||!fS(Ni(RmRRyRCRIR�RB(R�RER�R�R5R6((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s

"(R�R�R�RnR�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR,�s
t_PositionTokencBseZd�ZRS(cCs8tt|�j�|jj|_t|_t|_	dS(N(
RRpR�R^R�R�R�RsR�Rx(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s	(R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRp�scBs,eZdZd�Zd�Zed�ZRS(sb
    Token to advance to a specific column of input text; useful for tabular report scraping.
    cCs tt|�j�||_dS(N(RRR�R7(R�tcolno((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scCs�t||�|jkr�t|�}|jrB|j||�}nxE||kr�||j�r�t||�|jkr�|d7}qEWn|S(Ni(R7R�RuR�tisspace(R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s	7cCs^t||�}||jkr6t||d|��n||j|}|||!}||fS(NsText not in expected column(R7R(R�RER�R�tthiscoltnewlocR}((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s
(R�R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s			cBs#eZdZd�Zed�ZRS(s�
    Matches if current position is at the beginning of a line within the parse string
    
    Example::
    
        test = '''        AAA this line
        AAA and this line
          AAA but not this one
        B AAA and definitely not this one
        '''

        for t in (LineStart() + 'AAA' + restOfLine).searchString(test):
            print(t)
    
    Prints::
        ['AAA', ' this line']
        ['AAA', ' and this line']    

    cCs tt|�j�d|_dS(NsExpected start of line(RRR�Ry(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�&scCs;t||�dkr|gfSt|||j|��dS(Ni(R7RRy(R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�*s
(R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs	cBs#eZdZd�Zed�ZRS(sU
    Matches if current position is at the end of a line within the parse string
    cCs<tt|�j�|jtjjdd��d|_dS(Ns
RrsExpected end of line(RRR�R�R"RfR�Ry(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�3scCs�|t|�krK||dkr0|ddfSt|||j|��n8|t|�krk|dgfSt|||j|��dS(Ns
i(R�RRy(R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�8s(R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR/s	cBs#eZdZd�Zed�ZRS(sM
    Matches if current position is at the beginning of the parse string
    cCs tt|�j�d|_dS(NsExpected start of text(RR(R�Ry(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�GscCsL|dkrB||j|d�krBt|||j|��qBn|gfS(Ni(R�RRy(R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�Ks(R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR(Cs	cBs#eZdZd�Zed�ZRS(sG
    Matches if current position is at the end of the parse string
    cCs tt|�j�d|_dS(NsExpected end of text(RR'R�Ry(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�VscCs�|t|�kr-t|||j|��nT|t|�krM|dgfS|t|�kri|gfSt|||j|��dS(Ni(R�RRy(R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�Zs
(R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR'Rs	cBs&eZdZed�Zed�ZRS(sp
    Matches if the current position is at the beginning of a Word, and
    is not preceded by any character in a given set of C{wordChars}
    (default=C{printables}). To emulate the C{} behavior of regular expressions,
    use C{WordStart(alphanums)}. C{WordStart} will also match at the beginning of
    the string being parsed, or at the beginning of a line.
    cCs/tt|�j�t|�|_d|_dS(NsNot at the start of a word(RR/R�R�t	wordCharsRy(R�Ru((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�lscCs^|dkrT||d|jks6|||jkrTt|||j|��qTn|gfS(Nii(RuRRy(R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�qs
(R�R�R�RTR�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR/dscBs&eZdZed�Zed�ZRS(sZ
    Matches if the current position is at the end of a Word, and
    is not followed by any character in a given set of C{wordChars}
    (default=C{printables}). To emulate the C{} behavior of regular expressions,
    use C{WordEnd(alphanums)}. C{WordEnd} will also match at the end of
    the string being parsed, or at the end of a line.
    cCs8tt|�j�t|�|_t|_d|_dS(NsNot at the end of a word(RR.R�R�RuR�RpRy(R�Ru((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s	cCsvt|�}|dkrl||krl|||jksN||d|jkrlt|||j|��qln|gfS(Nii(R�RuRRy(R�RER�R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s(R�R�R�RTR�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR.xscBsqeZdZed�Zd�Zd�Zd�Zd�Zd�Z	d�Z
ed�Zgd	�Zd
�Z
RS(s^
    Abstract subclass of ParserElement, for combining and post-processing parsed tokens.
    cCs�tt|�j|�t|t�r4t|�}nt|t�r[tj|�g|_	n�t|t
j�r�t|�}td�|D��r�t
tj|�}nt|�|_	n3yt|�|_	Wntk
r�|g|_	nXt|_dS(Ncss|]}t|t�VqdS(N(RsR�(R�RF((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�s(RRR�RsR�R�R�R"RitexprsR�tIterabletallR�R�R�R}(R�RvR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s
cCs|j|S(N(Rv(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scCs|jj|�d|_|S(N(RvRR�Rm(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s	cCsPt|_g|jD]}|j�^q|_x|jD]}|j�q8W|S(s~Extends C{leaveWhitespace} defined in base class, and also invokes C{leaveWhitespace} on
           all contained expressions.(R�RpRvR�R�(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s
	%cCs�t|t�rb||jkr�tt|�j|�x(|jD]}|j|jd�q>Wq�n>tt|�j|�x%|jD]}|j|jd�q�W|S(Ni����(RsR)RuRRR�Rv(R�R	R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scCsfytt|�j�SWntk
r*nX|jdkr_d|jjt|j	�f|_n|jS(Ns%s:(%s)(
RRR�RaRmR�R^R�RRv(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s
%cCswtt|�j�x|jD]}|j�qWt|j�dkr`|jd}t||j�r�|jr�|jdkr�|j
r�|j|jdg|_d|_|j|jO_|j
|j
O_
n|jd}t||j�r`|jr`|jdkr`|j
r`|jd |j|_d|_|j|jO_|j
|j
O_
q`ndt|�|_|S(Niiii����s	Expected (RRR�RvR�RsR^RkRnR�RvRmRsRxRRy(R�R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s0


	


	cCstt|�j||�}|S(N(RRR�(R�R�R�R}((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scCs@||g}x|jD]}|j|�qW|jg�dS(N(RvRR(R�RttmpR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�scCs>tt|�j�}g|jD]}|j�^q|_|S(N(RRR�Rv(R�R}R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s%(R�R�R�R�R�R�RR�R�R�R�R�RR�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s						
	"cBsWeZdZdefd��YZed�Zed�Zd�Zd�Z	d�Z
RS(s

    Requires all given C{ParseExpression}s to be found in the given order.
    Expressions may be separated by whitespace.
    May be constructed using the C{'+'} operator.
    May also be constructed using the C{'-'} operator, which will suppress backtracking.

    Example::
        integer = Word(nums)
        name_expr = OneOrMore(Word(alphas))

        expr = And([integer("id"),name_expr("name"),integer("age")])
        # more easily written as:
        expr = integer("id") + name_expr("name") + integer("age")
    R�cBseZd�ZRS(cOs3ttj|�j||�d|_|j�dS(Nt-(RRR�R�R�R�(R�R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�
s	(R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�
scCsltt|�j||�td�|jD��|_|j|jdj�|jdj|_t	|_
dS(Ncss|]}|jVqdS(N(Rs(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>
si(RRR�RxRvRsR�RqRpR�R}(R�RvR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�
s
c	Cs?|jdj|||dt�\}}t}x|jdD]�}t|tj�r`t}q<n|r�y|j|||�\}}Wqtk
r��qtk
r�}d|_
tj|��qtk
r�t|t
|�|j|��qXn|j|||�\}}|s$|j�r<||7}q<q<W||fS(NiR�i(RvR�R�RsRR�R�R!RR�t
__traceback__R�R�R�RyR�(	R�RER�R�t
resultlistt	errorStopR�t
exprtokensR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�
s((
	
%cCs.t|t�r!tj|�}n|j|�S(N(RsR�R"RiR(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR5
scCs@||g}x+|jD] }|j|�|jsPqqWdS(N(RvRRs(R�R�tsubRecCheckListR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR:
s

	cCsVt|d�r|jS|jdkrOddjd�|jD��d|_n|jS(NR�t{Rcss|]}t|�VqdS(N(R(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>F
st}(R�R�RmR�R�Rv(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�A
s
*(R�R�R�RR�R�R�R�RRR�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s		cBsAeZdZed�Zed�Zd�Zd�Zd�Z	RS(s�
    Requires that at least one C{ParseExpression} is found.
    If two expressions match, the expression that matches the longest string will be used.
    May be constructed using the C{'^'} operator.

    Example::
        # construct Or using '^' operator
        
        number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums))
        print(number.searchString("123 3.1416 789"))
    prints::
        [['123'], ['3.1416'], ['789']]
    cCsNtt|�j||�|jrAtd�|jD��|_n	t|_dS(Ncss|]}|jVqdS(N(Rs(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>\
s(RRR�RvR4RsR�(R�RvR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�Y
s	cCs�d}d}g}x�|jD]�}y|j||�}Wn�tk
rw}	d|	_|	j|kr�|	}|	j}q�qtk
r�t|�|kr�t|t|�|j|�}t|�}q�qX|j	||f�qW|rh|j
dd��xn|D]c\}
}y|j|||�SWq�tk
r`}	d|	_|	j|kra|	}|	j}qaq�Xq�Wn|dk	r�|j|_|�nt||d|��dS(Ni����RcSs	|dS(Ni((tx((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqu
Rrs no defined alternatives to match(
R�RvR�RR{R�R�R�RyRtsortR�R�(R�RER�R�t	maxExcLoctmaxExceptionR�R�tloc2R�t_((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�`
s<	
		cCs.t|t�r!tj|�}n|j|�S(N(RsR�R"RiR(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__ixor__�
scCsVt|d�r|jS|jdkrOddjd�|jD��d|_n|jS(NR�R�s ^ css|]}t|�VqdS(N(R(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�
sR�(R�R�RmR�R�Rv(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��
s
*cCs3||g}x|jD]}|j|�qWdS(N(RvR(R�R�RR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�
s(
R�R�R�R�R�R�R�R�R�R(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRK
s
&			cBsAeZdZed�Zed�Zd�Zd�Zd�Z	RS(s�
    Requires that at least one C{ParseExpression} is found.
    If two expressions match, the first one listed is the one that will match.
    May be constructed using the C{'|'} operator.

    Example::
        # construct MatchFirst using '|' operator
        
        # watch the order of expressions to match
        number = Word(nums) | Combine(Word(nums) + '.' + Word(nums))
        print(number.searchString("123 3.1416 789")) #  Fail! -> [['123'], ['3'], ['1416'], ['789']]

        # put more selective expression first
        number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums)
        print(number.searchString("123 3.1416 789")) #  Better -> [['123'], ['3.1416'], ['789']]
    cCsNtt|�j||�|jrAtd�|jD��|_n	t|_dS(Ncss|]}|jVqdS(N(Rs(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�
s(RRR�RvR4RsR�(R�RvR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��
s	c	Cs�d}d}x�|jD]�}y|j|||�}|SWqtk
ro}|j|kr�|}|j}q�qtk
r�t|�|kr�t|t|�|j|�}t|�}q�qXqW|dk	r�|j|_|�nt||d|��dS(Ni����s no defined alternatives to match(	R�RvR�RR�R�R�RyR�(	R�RER�R�R�R�R�R}R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��
s$
	cCs.t|t�r!tj|�}n|j|�S(N(RsR�R"RiR(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__ior__�
scCsVt|d�r|jS|jdkrOddjd�|jD��d|_n|jS(NR�R�s | css|]}t|�VqdS(N(R(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�
sR�(R�R�RmR�R�Rv(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��
s
*cCs3||g}x|jD]}|j|�qWdS(N(RvR(R�R�RR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�
s(
R�R�R�R�R�R�R�R�R�R(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�
s			cBs8eZdZed�Zed�Zd�Zd�ZRS(sm
    Requires all given C{ParseExpression}s to be found, but in any order.
    Expressions may be separated by whitespace.
    May be constructed using the C{'&'} operator.

    Example::
        color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN")
        shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON")
        integer = Word(nums)
        shape_attr = "shape:" + shape_type("shape")
        posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn")
        color_attr = "color:" + color("color")
        size_attr = "size:" + integer("size")

        # use Each (using operator '&') to accept attributes in any order 
        # (shape and posn are required, color and size are optional)
        shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr)

        shape_spec.runTests('''
            shape: SQUARE color: BLACK posn: 100, 120
            shape: CIRCLE size: 50 color: BLUE posn: 50,80
            color:GREEN size:20 shape:TRIANGLE posn:20,40
            '''
            )
    prints::
        shape: SQUARE color: BLACK posn: 100, 120
        ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']]
        - color: BLACK
        - posn: ['100', ',', '120']
          - x: 100
          - y: 120
        - shape: SQUARE


        shape: CIRCLE size: 50 color: BLUE posn: 50,80
        ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']]
        - color: BLUE
        - posn: ['50', ',', '80']
          - x: 50
          - y: 80
        - shape: CIRCLE
        - size: 50


        color: GREEN size: 20 shape: TRIANGLE posn: 20,40
        ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']]
        - color: GREEN
        - posn: ['20', ',', '40']
          - x: 20
          - y: 40
        - shape: TRIANGLE
        - size: 20
    cCsKtt|�j||�td�|jD��|_t|_t|_dS(Ncss|]}|jVqdS(N(Rs(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>s(	RR
R�RxRvRsR�RptinitExprGroups(R�RvR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s	cCs4|jrLtd�|jD��|_g|jD]}t|t�r/|j^q/}g|jD]%}|jr]t|t�r]|^q]}|||_g|jD]}t|t	�r�|j^q�|_
g|jD]}t|t�r�|j^q�|_g|jD]$}t|tt	tf�s|^q|_
|j
|j7_
t|_n|}|j
}|j}	g}
t}x�|r_||	|j
|j}g}
x�|D]�}y|j||�}Wntk
r�|
j|�q�X|
j|jjt|�|��||kr|j|�q�||	kr�|	j|�q�q�Wt|
�t|�krut}ququW|r�djd�|D��}t||d|��n|
g|jD]*}t|t�r�|j|	kr�|^q�7}
g}x6|
D].}|j|||�\}}|j|�q�Wt|tg��}||fS(Ncss3|])}t|t�rt|j�|fVqdS(N(RsRRRF(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>ss, css|]}t|�VqdS(N(R(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>=ss*Missing one or more required elements (%s)(R�R�Rvtopt1mapRsRRFRst	optionalsR0tmultioptionalsRt
multirequiredtrequiredR�R�R�RRR�RtremoveR�R�R�tsumR (R�RER�R�R�topt1topt2ttmpLocttmpReqdttmpOptt
matchOrdertkeepMatchingttmpExprstfailedtmissingR|R;tfinalResults((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�sP	.5
117

	

"
>
cCsVt|d�r|jS|jdkrOddjd�|jD��d|_n|jS(NR�R�s & css|]}t|�VqdS(N(R(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>PsR�(R�R�RmR�R�Rv(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�Ks
*cCs3||g}x|jD]}|j|�qWdS(N(RvR(R�R�RR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRTs(R�R�R�R�R�R�R�R(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR
�
s
51		cBs_eZdZed�Zed�Zd�Zd�Zd�Z	d�Z
gd�Zd�ZRS(	sa
    Abstract subclass of C{ParserElement}, for combining and post-processing parsed tokens.
    cCs�tt|�j|�t|t�rattjt�rItj|�}qatjt	|��}n||_
d|_|dk	r�|j
|_
|j|_|j|j�|j|_|j|_|j|_|jj|j�ndS(N(RRR�RsR�t
issubclassR"RiR*RRFR�RmRxRsR�RqRpRoR}RuR(R�RFR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�^s		cCsG|jdk	r+|jj|||dt�Std||j|��dS(NR�Rr(RFR�R�R�RRy(R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�pscCs>t|_|jj�|_|jdk	r:|jj�n|S(N(R�RpRFR�R�R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�vs
	cCs�t|t�rc||jkr�tt|�j|�|jdk	r`|jj|jd�q`q�n?tt|�j|�|jdk	r�|jj|jd�n|S(Ni����(RsR)RuRRR�RFR�(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�}s cCs6tt|�j�|jdk	r2|jj�n|S(N(RRR�RFR�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scCsV||kr"t||g��n||g}|jdk	rR|jj|�ndS(N(R$RFR�R(R�R�R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s
cCsA||g}|jdk	r0|jj|�n|jg�dS(N(RFR�RR(R�RRy((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�scCsuytt|�j�SWntk
r*nX|jdkrn|jdk	rnd|jjt	|j�f|_n|jS(Ns%s:(%s)(
RRR�RaRmR�RFR^R�R(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s
%(
R�R�R�R�R�R�R�R�R�R�RRR�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRZs				cBs#eZdZd�Zed�ZRS(s�
    Lookahead matching of the given parse expression.  C{FollowedBy}
    does I{not} advance the parsing position within the input string, it only
    verifies that the specified parse expression matches at the current
    position.  C{FollowedBy} always returns a null token list.

    Example::
        # use FollowedBy to match a label only if it is followed by a ':'
        data_word = Word(alphas)
        label = data_word + FollowedBy(':')
        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
        
        OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint()
    prints::
        [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']]
    cCs#tt|�j|�t|_dS(N(RRR�R�Rs(R�RF((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scCs|jj||�|gfS(N(RFR�(R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s(R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s	cBs,eZdZd�Zed�Zd�ZRS(s�
    Lookahead to disallow matching with the given parse expression.  C{NotAny}
    does I{not} advance the parsing position within the input string, it only
    verifies that the specified parse expression does I{not} match at the current
    position.  Also, C{NotAny} does I{not} skip over leading whitespace. C{NotAny}
    always returns a null token list.  May be constructed using the '~' operator.

    Example::
        
    cCsBtt|�j|�t|_t|_dt|j�|_	dS(NsFound unwanted token, (
RRR�R�RpR�RsRRFRy(R�RF((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s		cCs:|jj||�r0t|||j|��n|gfS(N(RFR�RRy(R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scCsIt|d�r|jS|jdkrBdt|j�d|_n|jS(NR�s~{R�(R�R�RmR�RRF(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s
(R�R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s
	t_MultipleMatchcBs eZdd�Zed�ZRS(cCsftt|�j|�t|_|}t|t�rFtj|�}n|dk	rY|nd|_
dS(N(RR�R�R�RoRsR�R"RiR�t	not_ender(R�RFtstopOntender((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s	cCs|jj}|j}|jdk	}|r9|jj}n|rO|||�n||||dt�\}}y�|j}	xo|r�|||�n|	r�|||�}
n|}
|||
|�\}}|s�|j�r~||7}q~q~WWnt	t
fk
rnX||fS(NR�(RFR�R�R�R�R�R�RuR�RR�(R�RER�R�tself_expr_parsetself_skip_ignorablestcheck_endert
try_not_enderR�thasIgnoreExprsR�t	tmptokens((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s,	N(R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scBseZdZd�ZRS(s�
    Repetition of one or more of the given expression.
    
    Parameters:
     - expr - expression that must match one or more times
     - stopOn - (default=C{None}) - expression for a terminating sentinel
          (only required if the sentinel would ordinarily match the repetition 
          expression)          

    Example::
        data_word = Word(alphas)
        label = data_word + FollowedBy(':')
        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join))

        text = "shape: SQUARE posn: upper left color: BLACK"
        OneOrMore(attr_expr).parseString(text).pprint()  # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']]

        # use stopOn attribute for OneOrMore to avoid reading label string as part of the data
        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
        OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']]
        
        # could also be written as
        (attr_expr * (1,)).parseString(text).pprint()
    cCsIt|d�r|jS|jdkrBdt|j�d|_n|jS(NR�R�s}...(R�R�RmR�RRF(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�!s
(R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscBs/eZdZdd�Zed�Zd�ZRS(sw
    Optional repetition of zero or more of the given expression.
    
    Parameters:
     - expr - expression that must match zero or more times
     - stopOn - (default=C{None}) - expression for a terminating sentinel
          (only required if the sentinel would ordinarily match the repetition 
          expression)          

    Example: similar to L{OneOrMore}
    cCs)tt|�j|d|�t|_dS(NR�(RR0R�R�Rs(R�RFR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�6scCsEy tt|�j|||�SWnttfk
r@|gfSXdS(N(RR0R�RR�(R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�:s cCsIt|d�r|jS|jdkrBdt|j�d|_n|jS(NR�Rs]...(R�R�RmR�RRF(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�@s
N(R�R�R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR0*st
_NullTokencBs eZd�ZeZd�ZRS(cCstS(N(R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�JscCsdS(NRr((R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�Ms(R�R�R�R>R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�Is	cBs/eZdZed�Zed�Zd�ZRS(sa
    Optional matching of the given expression.

    Parameters:
     - expr - expression that must match zero or more times
     - default (optional) - value to be returned if the optional expression is not found.

    Example::
        # US postal code can be a 5-digit zip, plus optional 4-digit qualifier
        zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4)))
        zip.runTests('''
            # traditional ZIP code
            12345
            
            # ZIP+4 form
            12101-0001
            
            # invalid ZIP
            98765-
            ''')
    prints::
        # traditional ZIP code
        12345
        ['12345']

        # ZIP+4 form
        12101-0001
        ['12101-0001']

        # invalid ZIP
        98765-
             ^
        FAIL: Expected end of text (at char 5), (line:1, col:6)
    cCsAtt|�j|dt�|jj|_||_t|_dS(NR(	RRR�R�RFRoRR�Rs(R�RFR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�ts	cCs�y(|jj|||dt�\}}Wnottfk
r�|jtk	r�|jjr�t|jg�}|j||jj<q�|jg}q�g}nX||fS(NR�(	RFR�R�RR�Rt_optionalNotMatchedRnR (R�RER�R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�zs(
cCsIt|d�r|jS|jdkrBdt|j�d|_n|jS(NR�RR(R�R�RmR�RRF(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s
(R�R�R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRQs"cBs,eZdZeddd�Zed�ZRS(s�	
    Token for skipping over all undefined text until the matched expression is found.

    Parameters:
     - expr - target expression marking the end of the data to be skipped
     - include - (default=C{False}) if True, the target expression is also parsed 
          (the skipped text and target expression are returned as a 2-element list).
     - ignore - (default=C{None}) used to define grammars (typically quoted strings and 
          comments) that might contain false matches to the target expression
     - failOn - (default=C{None}) define expressions that are not allowed to be 
          included in the skipped test; if found before the target expression is found, 
          the SkipTo is not a match

    Example::
        report = '''
            Outstanding Issues Report - 1 Jan 2000

               # | Severity | Description                               |  Days Open
            -----+----------+-------------------------------------------+-----------
             101 | Critical | Intermittent system crash                 |          6
              94 | Cosmetic | Spelling error on Login ('log|n')         |         14
              79 | Minor    | System slow when running too many reports |         47
            '''
        integer = Word(nums)
        SEP = Suppress('|')
        # use SkipTo to simply match everything up until the next SEP
        # - ignore quoted strings, so that a '|' character inside a quoted string does not match
        # - parse action will call token.strip() for each matched token, i.e., the description body
        string_data = SkipTo(SEP, ignore=quotedString)
        string_data.setParseAction(tokenMap(str.strip))
        ticket_expr = (integer("issue_num") + SEP 
                      + string_data("sev") + SEP 
                      + string_data("desc") + SEP 
                      + integer("days_open"))
        
        for tkt in ticket_expr.searchString(report):
            print tkt.dump()
    prints::
        ['101', 'Critical', 'Intermittent system crash', '6']
        - days_open: 6
        - desc: Intermittent system crash
        - issue_num: 101
        - sev: Critical
        ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14']
        - days_open: 14
        - desc: Spelling error on Login ('log|n')
        - issue_num: 94
        - sev: Cosmetic
        ['79', 'Minor', 'System slow when running too many reports', '47']
        - days_open: 47
        - desc: System slow when running too many reports
        - issue_num: 79
        - sev: Minor
    cCs�tt|�j|�||_t|_t|_||_t|_	t
|t�rgtj
|�|_n	||_dt|j�|_dS(NsNo match found for (RR&R�t
ignoreExprR�RsR�RxtincludeMatchR�RsR�R"RitfailOnRRFRy(R�R	tincludeR�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s						cCs�|}t|�}|j}|jj}|jdk	rB|jjnd}|jdk	rc|jjnd}	|}
x�|
|kr#|dk	r�|||
�r�Pq�n|	dk	r�x/y|	||
�}
Wq�tk
r�Pq�Xq�Wny|||
dt	dt	�Wn!t
tfk
r|
d7}
qrXPqrWt
|||j|��|
}|||!}t
|�}|jr�||||dt	�\}}
||
7}n||fS(NR�R�i(R�RFR�R�R�R�R�R�RR�RR�RyR R�(R�RER�R�RHR�RFt
expr_parsetself_failOn_canParseNexttself_ignoreExpr_tryParsettmploctskiptextt
skipresultR:((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s<	!!

	
N(R�R�R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR&�s6
cBs\eZdZd	d�Zd�Zd�Zd�Zd�Zgd�Z	d�Z
d�ZRS(
sK
    Forward declaration of an expression to be defined later -
    used for recursive grammars, such as algebraic infix notation.
    When the expression is known, it is assigned to the C{Forward} variable using the '<<' operator.

    Note: take care when assigning to C{Forward} not to overlook precedence of operators.
    Specifically, '|' has a lower precedence than '<<', so that::
        fwdExpr << a | b | c
    will actually be evaluated as::
        (fwdExpr << a) | b | c
    thereby leaving b and c out as parseable alternatives.  It is recommended that you
    explicitly group the values inserted into the C{Forward}::
        fwdExpr << (a | b | c)
    Converting to use the '<<=' operator instead will avoid this problem.

    See L{ParseResults.pprint} for an example of a recursive parser created using
    C{Forward}.
    cCs tt|�j|dt�dS(NR(RR
R�R�(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�scCs�t|t�r!tj|�}n||_d|_|jj|_|jj|_|j	|jj
�|jj|_|jj|_|j
j|jj
�|S(N(RsR�R"RiRFR�RmRxRsR�RqRpRoRuR(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
__lshift__s		cCs||>S(N((R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__ilshift__'scCs
t|_|S(N(R�Rp(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�*s	cCs8|js4t|_|jdk	r4|jj�q4n|S(N(RwR�RFR�R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�.s
		cCsP||kr?||g}|jdk	r?|jj|�q?n|jg�dS(N(RFR�RR(R�RRy((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR5s
cCs�t|d�r|jS|jjdS|j|_t|_z+|jdk	r]t|j�}nd}Wd|j|_X|jjd|S(NR�s: ...R�s: (	R�R�R^R�t_revertClasst_ForwardNoRecurseRFR�R(R�t	retString((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�<s	

cCs=|jdk	r"tt|�j�St�}||K}|SdS(N(RFR�RR
R�(R�R}((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�Ms
	
N(R�R�R�R�R�R�R�R�R�RR�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR
s	
				R�cBseZd�ZRS(cCsdS(Ns...((R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�Vs(R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�UscBseZdZed�ZRS(sQ
    Abstract subclass of C{ParseExpression}, for converting parsed results.
    cCs#tt|�j|�t|_dS(N(RR+R�R�Ro(R�RFR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�]s(R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR+YscBs/eZdZded�Zd�Zd�ZRS(s�
    Converter to concatenate all matching tokens to a single string.
    By default, the matching patterns must also be contiguous in the input string;
    this can be disabled by specifying C{'adjacent=False'} in the constructor.

    Example::
        real = Word(nums) + '.' + Word(nums)
        print(real.parseString('3.1416')) # -> ['3', '.', '1416']
        # will also erroneously match the following
        print(real.parseString('3. 1416')) # -> ['3', '.', '1416']

        real = Combine(Word(nums) + '.' + Word(nums))
        print(real.parseString('3.1416')) # -> ['3.1416']
        # no match when there are internal spaces
        print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...)
    RrcCsQtt|�j|�|r)|j�n||_t|_||_t|_dS(N(	RRR�R�tadjacentR�Rpt
joinStringR}(R�RFR�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�rs
			cCs6|jrtj||�ntt|�j|�|S(N(R�R"R�RR(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�|s	cCse|j�}|2|tdj|j|j��gd|j�7}|jr]|j�r]|gS|SdS(NRrR�(R�R R�RR�RzRnR�(R�RER�R�tretToks((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s1(R�R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRas
	cBs eZdZd�Zd�ZRS(s�
    Converter to return the matched tokens as a list - useful for returning tokens of C{L{ZeroOrMore}} and C{L{OneOrMore}} expressions.

    Example::
        ident = Word(alphas)
        num = Word(nums)
        term = ident | num
        func = ident + Optional(delimitedList(term))
        print(func.parseString("fn a,b,100"))  # -> ['fn', 'a', 'b', '100']

        func = ident + Group(Optional(delimitedList(term)))
        print(func.parseString("fn a,b,100"))  # -> ['fn', ['a', 'b', '100']]
    cCs#tt|�j|�t|_dS(N(RRR�R�Ro(R�RF((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scCs|gS(N((R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s(R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s
	cBs eZdZd�Zd�ZRS(sW
    Converter to return a repetitive expression as a list, but also as a dictionary.
    Each element can also be referenced using the first token in the expression as its key.
    Useful for tabular report scraping when the first column can be used as a item key.

    Example::
        data_word = Word(alphas)
        label = data_word + FollowedBy(':')
        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join))

        text = "shape: SQUARE posn: upper left color: light blue texture: burlap"
        attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
        
        # print attributes as plain groups
        print(OneOrMore(attr_expr).parseString(text).dump())
        
        # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names
        result = Dict(OneOrMore(Group(attr_expr))).parseString(text)
        print(result.dump())
        
        # access named fields as dict entries, or output as dict
        print(result['shape'])        
        print(result.asDict())
    prints::
        ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap']

        [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']]
        - color: light blue
        - posn: upper left
        - shape: SQUARE
        - texture: burlap
        SQUARE
        {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'}
    See more examples at L{ParseResults} of accessing fields by results name.
    cCs#tt|�j|�t|_dS(N(RR	R�R�Ro(R�RF((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scCsTx9t|�D]+\}}t|�dkr1q
n|d}t|t�rct|d�j�}nt|�dkr�td|�||<q
t|�dkr�t|dt�r�t|d|�||<q
|j�}|d=t|�dkst|t�r!|j	�r!t||�||<q
t|d|�||<q
W|j
rL|gS|SdS(NiiRri(R�R�RsRoRR�R�R R�R�Rn(R�RER�R�R�ttoktikeyt	dictvalue((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s$
&-	(R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR	�s#	cBs eZdZd�Zd�ZRS(sV
    Converter for ignoring the results of a parsed expression.

    Example::
        source = "a, b, c,d"
        wd = Word(alphas)
        wd_list1 = wd + ZeroOrMore(',' + wd)
        print(wd_list1.parseString(source))

        # often, delimiters that are useful during parsing are just in the
        # way afterward - use Suppress to keep them out of the parsed output
        wd_list2 = wd + ZeroOrMore(Suppress(',') + wd)
        print(wd_list2.parseString(source))
    prints::
        ['a', ',', 'b', ',', 'c', ',', 'd']
        ['a', 'b', 'c', 'd']
    (See also L{delimitedList}.)
    cCsgS(N((R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scCs|S(N((R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s(R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR)�s	cBs)eZdZd�Zd�Zd�ZRS(sI
    Wrapper for parse actions, to ensure they are only called once.
    cCst|�|_t|_dS(N(RetcallableR�tcalled(R�t
methodCall((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�scCsA|js+|j|||�}t|_|St||d��dS(NRr(R�R�R�R(R�R�RNRpR;((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s
		cCs
t|_dS(N(R�R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytreset
s(R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s		csCt����fd�}y�j|_Wntk
r>nX|S(ss
    Decorator for debugging parse actions. 
    
    When the parse action is called, this decorator will print C{">> entering I{method-name}(line:I{current_source_line}, I{parse_location}, I{matched_tokens})".}
    When the parse action completes, the decorator will print C{"<<"} followed by the returned value, or any exception that the parse action raised.

    Example::
        wd = Word(alphas)

        @traceParseAction
        def remove_duplicate_chars(tokens):
            return ''.join(sorted(set(''.join(tokens)))

        wds = OneOrMore(wd).setParseAction(remove_duplicate_chars)
        print(wds.parseString("slkdjs sld sldd sdlf sdljf"))
    prints::
        >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {}))
        <<leaving remove_duplicate_chars (ret: 'dfjkls')
        ['dfjkls']
    cs��j}|d\}}}t|�dkrI|djjd|}ntjjd|t||�||f�y�|�}Wn0tk
r�}tjjd||f��nXtjjd||f�|S(Ni����iit.s">>entering %s(line: '%s', %d, %r)
s<<leaving %s (exception: %s)
s<<leaving %s (ret: %r)
(R�R�R^RxtstderrtwriteRERa(tpaArgstthisFuncR�RNRpR}RL(R(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytz#s	)(ReR�R�(RR�((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR`
s

t,cCsxt|�dt|�dt|�d}|rSt|t||��j|�S|tt|�|�j|�SdS(s�
    Helper to define a delimited list of expressions - the delimiter defaults to ','.
    By default, the list elements and delimiters can have intervening whitespace, and
    comments, but this can be overridden by passing C{combine=True} in the constructor.
    If C{combine} is set to C{True}, the matching tokens are returned as a single token
    string, with the delimiters included; otherwise, the matching tokens are returned
    as a list of tokens, with the delimiters suppressed.

    Example::
        delimitedList(Word(alphas)).parseString("aa,bb,cc") # -> ['aa', 'bb', 'cc']
        delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE']
    s [Rs]...N(RRR0R�R)(RFtdelimtcombinetdlName((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR>9s
,!cs�t����fd�}|dkrBtt�jd��}n|j�}|jd�|j|dt�|�jdt	��d�S(s:
    Helper to define a counted list of expressions.
    This helper defines a pattern of the form::
        integer expr expr expr...
    where the leading integer tells how many expr expressions follow.
    The matched tokens returns the array of expr tokens as a list - the leading count token is suppressed.
    
    If C{intExpr} is specified, it should be a pyparsing expression that produces an integer value.

    Example::
        countedArray(Word(alphas)).parseString('2 ab cd ef')  # -> ['ab', 'cd']

        # in this parser, the leading integer value is given in binary,
        # '10' indicating that 2 values are in the array
        binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2))
        countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef')  # -> ['ab', 'cd']
    cs;|d}�|r,tt�g|��p5tt�>gS(Ni(RRRA(R�RNRpR�(t	arrayExprRF(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytcountFieldParseAction_s
-cSst|d�S(Ni(Ro(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqdRrtarrayLenR~s(len) s...N(
R
R�R-RPRzR�R�R�R�R(RFtintExprR�((R�RFs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR:Ls	
cCsMg}x@|D]8}t|t�r8|jt|��q
|j|�q
W|S(N(RsR�RR�R(tLR}R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�ks
csFt���fd�}|j|dt��jdt|���S(s*
    Helper to define an expression that is indirectly defined from
    the tokens matched in a previous expression, that is, it looks
    for a 'repeat' of a previous expression.  For example::
        first = Word(nums)
        second = matchPreviousLiteral(first)
        matchExpr = first + ":" + second
    will match C{"1:1"}, but not C{"1:2"}.  Because this matches a
    previous literal, will also match the leading C{"1:1"} in C{"1:10"}.
    If this is not desired, use C{matchPreviousExpr}.
    Do I{not} use with packrat parsing enabled.
    csc|rTt|�dkr'�|d>q_t|j��}�td�|D��>n�t�>dS(Niicss|]}t|�VqdS(N(R(R�ttt((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�s(R�R�R�RR(R�RNRpttflat(trep(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytcopyTokenToRepeater�sR~s(prev) (R
R�R�R�R(RFR�((R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRMts

	
cs\t��|j�}�|K��fd�}|j|dt��jdt|���S(sS
    Helper to define an expression that is indirectly defined from
    the tokens matched in a previous expression, that is, it looks
    for a 'repeat' of a previous expression.  For example::
        first = Word(nums)
        second = matchPreviousExpr(first)
        matchExpr = first + ":" + second
    will match C{"1:1"}, but not C{"1:2"}.  Because this matches by
    expressions, will I{not} match the leading C{"1:1"} in C{"1:10"};
    the expressions are evaluated first, and then compared, so
    C{"1"} is compared with C{"10"}.
    Do I{not} use with packrat parsing enabled.
    cs8t|j����fd�}�j|dt�dS(Ncs7t|j��}|�kr3tddd��ndS(NRri(R�R�R(R�RNRpttheseTokens(tmatchTokens(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytmustMatchTheseTokens�sR~(R�R�RzR�(R�RNRpR�(R�(R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��sR~s(prev) (R
R�R�R�R�R(RFte2R�((R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRL�s	
cCsUx$dD]}|j|t|�}qW|jdd�}|jdd�}t|�S(Ns\^-]s
s\ns	s\t(R�t_bslashR(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRE�s

c
sD|r!d�}d�}t�nd�}d�}t�g}t|t�r]|j�}n7t|tj�r~t|�}ntj	dt
dd�|s�t�Sd}x�|t|�d	krV||}x�t
||d	�D]f\}}	||	|�r
|||d	=Pq�|||	�r�|||d	=|j||	�|	}Pq�q�W|d	7}q�W|r|ry�t|�td
j|��kr�tdd
jd�|D���jd
j|��Stdjd�|D���jd
j|��SWqtk
rtj	dt
dd�qXnt�fd�|D��jd
j|��S(s�
    Helper to quickly define a set of alternative Literals, and makes sure to do
    longest-first testing when there is a conflict, regardless of the input order,
    but returns a C{L{MatchFirst}} for best performance.

    Parameters:
     - strs - a string of space-delimited literals, or a collection of string literals
     - caseless - (default=C{False}) - treat all literals as caseless
     - useRegex - (default=C{True}) - as an optimization, will generate a Regex
          object; otherwise, will generate a C{MatchFirst} object (if C{caseless=True}, or
          if creating a C{Regex} raises an exception)

    Example::
        comp_oper = oneOf("< = > <= >= !=")
        var = Word(alphas)
        number = Word(nums)
        term = var | number
        comparison_expr = term + comp_oper + term
        print(comparison_expr.searchString("B = 12  AA=23 B<=AA AA>12"))
    prints::
        [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']]
    cSs|j�|j�kS(N(R,(Rtb((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq�RrcSs|j�j|j��S(N(R,R)(RR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq�RrcSs
||kS(N((RR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq�RrcSs
|j|�S(N(R)(RR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq�Rrs6Invalid argument to oneOf, expected string or iterableR�iiiRrs[%s]css|]}t|�VqdS(N(RE(R�tsym((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�ss | t|css|]}tj|�VqdS(N(R|RG(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�ss7Exception creating Regex for oneOf, building MatchFirstc3s|]}�|�VqdS(N((R�R�(tparseElementClass(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�s(RRRsR�R�R�RwR�R�R�R�RR�R�RR�R%R�RaR(
tstrsR+tuseRegextisequaltmaskstsymbolsR�tcurR�R	((R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRQ�sL						

!
!33
	cCsttt||���S(s�
    Helper to easily and clearly define a dictionary by specifying the respective patterns
    for the key and value.  Takes care of defining the C{L{Dict}}, C{L{ZeroOrMore}}, and C{L{Group}} tokens
    in the proper order.  The key pattern can include delimiting markers or punctuation,
    as long as they are suppressed, thereby leaving the significant key text.  The value
    pattern can include named results, so that the C{Dict} results can include named token
    fields.

    Example::
        text = "shape: SQUARE posn: upper left color: light blue texture: burlap"
        attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
        print(OneOrMore(attr_expr).parseString(text).dump())
        
        attr_label = label
        attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)

        # similar to Dict, but simpler call format
        result = dictOf(attr_label, attr_value).parseString(text)
        print(result.dump())
        print(result['shape'])
        print(result.shape)  # object attribute access works too
        print(result.asDict())
    prints::
        [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']]
        - color: light blue
        - posn: upper left
        - shape: SQUARE
        - texture: burlap
        SQUARE
        SQUARE
        {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'}
    (R	R0R(RR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR?�s!cCs|t�jd��}|j�}t|_|d�||d�}|rVd�}n	d�}|j|�|j|_|S(s�
    Helper to return the original, untokenized text for a given expression.  Useful to
    restore the parsed fields of an HTML start tag into the raw tag text itself, or to
    revert separate tokens with intervening whitespace back to the original matching
    input text. By default, returns astring containing the original parsed text.  
       
    If the optional C{asString} argument is passed as C{False}, then the return value is a 
    C{L{ParseResults}} containing any results names that were originally matched, and a 
    single token containing the original matched text from the input string.  So if 
    the expression passed to C{L{originalTextFor}} contains expressions with defined
    results names, you must set C{asString} to C{False} if you want to preserve those
    results name values.

    Example::
        src = "this is test <b> bold <i>text</i> </b> normal text "
        for tag in ("b","i"):
            opener,closer = makeHTMLTags(tag)
            patt = originalTextFor(opener + SkipTo(closer) + closer)
            print(patt.searchString(src)[0])
    prints::
        ['<b> bold <i>text</i> </b>']
        ['<i>text</i>']
    cSs|S(N((R�R�Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq8Rrt_original_startt
_original_endcSs||j|j!S(N(R�R�(R�RNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq=RrcSs'||jd�|jd�!g|(dS(NR�R�(R�(R�RNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytextractText?s(RRzR�R�R}Ru(RFtasStringt	locMarkertendlocMarkert	matchExprR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRe s		
cCst|�jd��S(sp
    Helper to undo pyparsing's default grouping of And expressions, even
    if all but one are non-empty.
    cSs|dS(Ni((Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqJRr(R+Rz(RF((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRfEscCsEt�jd��}t|d�|d�|j�j�d��S(s�
    Helper to decorate a returned token with its starting and ending locations in the input string.
    This helper adds the following results names:
     - locn_start = location where matched expression begins
     - locn_end = location where matched expression ends
     - value = the actual parsed results

    Be careful if the input text contains C{<TAB>} characters, you may want to call
    C{L{ParserElement.parseWithTabs}}

    Example::
        wd = Word(alphas)
        for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"):
            print(match)
    prints::
        [[0, 'ljsdf', 5]]
        [[8, 'lksdjjf', 15]]
        [[18, 'lkkjj', 23]]
    cSs|S(N((R�RNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq`Rrt
locn_startR�tlocn_end(RRzRR�R�(RFtlocator((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRhLss\[]-*.$+^?()~ RKcCs|ddS(Nii((R�RNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqkRrs\\0?[xX][0-9a-fA-F]+cCs tt|djd�d��S(Nis\0xi(tunichrRotlstrip(R�RNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqlRrs	\\0[0-7]+cCstt|ddd��S(Niii(R�Ro(R�RNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqmRrR<s\]s\wRzRRtnegatetbodyRcsOd��y-dj�fd�tj|�jD��SWntk
rJdSXdS(s�
    Helper to easily define string ranges for use in Word construction.  Borrows
    syntax from regexp '[]' string range definitions::
        srange("[0-9]")   -> "0123456789"
        srange("[a-z]")   -> "abcdefghijklmnopqrstuvwxyz"
        srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_"
    The input string must be enclosed in []'s, and the returned string is the expanded
    character set joined into a single string.
    The values enclosed in the []'s may be:
     - a single character
     - an escaped character with a leading backslash (such as C{\-} or C{\]})
     - an escaped hex character with a leading C{'\x'} (C{\x21}, which is a C{'!'} character) 
         (C{\0x##} is also supported for backwards compatibility) 
     - an escaped octal character with a leading C{'\0'} (C{\041}, which is a C{'!'} character)
     - a range of any of the above, separated by a dash (C{'a-z'}, etc.)
     - any combination of the above (C{'aeiouy'}, C{'a-zA-Z0-9_$'}, etc.)
    cSsKt|t�s|Sdjd�tt|d�t|d�d�D��S(NRrcss|]}t|�VqdS(N(R�(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�sii(RsR R�R�tord(tp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq�RrRrc3s|]}�|�VqdS(N((R�tpart(t	_expanded(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�sN(R�t_reBracketExprR�R�Ra(R�((R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR]rs
	-
cs�fd�}|S(st
    Helper method for defining parse actions that require matching at a specific
    column in the input text.
    cs2t||��kr.t||d���ndS(Nsmatched token not at column %d(R7R(R@tlocnRJ(R�(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt	verifyCol�s((R�R�((R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRK�scs
�fd�S(s�
    Helper method for common parse actions that simply return a literal value.  Especially
    useful when used with C{L{transformString<ParserElement.transformString>}()}.

    Example::
        num = Word(nums).setParseAction(lambda toks: int(toks[0]))
        na = oneOf("N/A NA").setParseAction(replaceWith(math.nan))
        term = na | num
        
        OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234]
    cs�gS(N((R�RNRp(treplStr(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq�Rr((R�((R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRZ�scCs|ddd!S(s
    Helper parse action for removing quotation marks from parsed quoted strings.

    Example::
        # by default, quotation marks are included in parsed results
        quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"]

        # use removeQuotes to strip quotation marks from parsed results
        quotedString.setParseAction(removeQuotes)
        quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"]
    iii����((R�RNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRX�scsa��fd�}y"t�dt�d�j�}Wntk
rSt��}nX||_|S(sG
    Helper to define a parse action by mapping a function to all elements of a ParseResults list.If any additional 
    args are passed, they are forwarded to the given function as additional arguments after
    the token, as in C{hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))}, which will convert the
    parsed data to an integer using base 16.

    Example (compare the last to example in L{ParserElement.transformString}::
        hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16))
        hex_ints.runTests('''
            00 11 22 aa FF 0a 0d 1a
            ''')
        
        upperword = Word(alphas).setParseAction(tokenMap(str.upper))
        OneOrMore(upperword).runTests('''
            my kingdom for a horse
            ''')

        wd = Word(alphas).setParseAction(tokenMap(str.title))
        OneOrMore(wd).setParseAction(' '.join).runTests('''
            now is the winter of our discontent made glorious summer by this sun of york
            ''')
    prints::
        00 11 22 aa FF 0a 0d 1a
        [0, 17, 34, 170, 255, 10, 13, 26]

        my kingdom for a horse
        ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE']

        now is the winter of our discontent made glorious summer by this sun of york
        ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York']
    cs g|D]}�|��^qS(N((R�RNRpttokn(R�RO(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��sR�R^(R`R�RaRu(ROR�R�Rd((R�ROs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRk�s 	
	cCst|�j�S(N(RR,(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq�RrcCst|�j�S(N(Rtlower(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq�RrcCs<t|t�r+|}t|d|�}n	|j}tttd�}|r�tj�j	t
�}td�|d�tt
t|td�|���tddtg�jd�j	d	��td
�}n�djd�tD��}tj�j	t
�t|�B}td�|d�tt
t|j	t�ttd�|����tddtg�jd�j	d
��td
�}ttd�|d
�}|jddj|jdd�j�j���jd|�}|jddj|jdd�j�j���jd|�}||_||_||fS(sRInternal helper to construct opening and closing tag expressions, given a tag nameR+s_-:Rttagt=t/R�RAcSs|ddkS(NiR�((R�RNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq�RrR Rrcss!|]}|dkr|VqdS(R N((R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�scSs|ddkS(NiR�((R�RNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq�Rrs</R5t:Rs<%s>RLs</%s>(RsR�RR�R-R2R1R<R�RzRXR)R	R0RRR�R�R�RTRWR@Rt_LR�ttitleR�R�R�(ttagStrtxmltresnamettagAttrNamettagAttrValuetopenTagtprintablesLessRAbracktcloseTag((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt	_makeTags�s"	o{AA		cCs
t|t�S(s 
    Helper to construct opening and closing tag expressions for HTML, given a tag name. Matches
    tags in either upper or lower case, attributes with namespaces and with quoted or unquoted values.

    Example::
        text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>'
        # makeHTMLTags returns pyparsing expressions for the opening and closing tags as a 2-tuple
        a,a_end = makeHTMLTags("A")
        link_expr = a + SkipTo(a_end)("link_text") + a_end
        
        for link in link_expr.searchString(text):
            # attributes in the <A> tag (like "href" shown here) are also accessible as named results
            print(link.link_text, '->', link.href)
    prints::
        pyparsing -> http://pyparsing.wikispaces.com
    (RR�(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRI�scCs
t|t�S(s�
    Helper to construct opening and closing tag expressions for XML, given a tag name. Matches
    tags only in the given upper/lower case.

    Example: similar to L{makeHTMLTags}
    (RR�(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRJscsT|r|�n|j��g�D]\}}||f^q#��fd�}|S(s<
    Helper to create a validating parse action to be used with start tags created
    with C{L{makeXMLTags}} or C{L{makeHTMLTags}}. Use C{withAttribute} to qualify a starting tag
    with a required attribute value, to avoid false matches on common tags such as
    C{<TD>} or C{<DIV>}.

    Call C{withAttribute} with a series of attribute names and values. Specify the list
    of filter attributes names and values as:
     - keyword arguments, as in C{(align="right")}, or
     - as an explicit dict with C{**} operator, when an attribute name is also a Python
          reserved word, as in C{**{"class":"Customer", "align":"right"}}
     - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") )
    For attribute names with a namespace prefix, you must use the second form.  Attribute
    names are matched insensitive to upper/lower case.
       
    If just testing for C{class} (with or without a namespace), use C{L{withClass}}.

    To verify that the attribute exists, but without specifying a value, pass
    C{withAttribute.ANY_VALUE} as the value.

    Example::
        html = '''
            <div>
            Some text
            <div type="grid">1 4 0 1 0</div>
            <div type="graph">1,3 2,3 1,1</div>
            <div>this has no type</div>
            </div>
                
        '''
        div,div_end = makeHTMLTags("div")

        # only match div tag having a type attribute with value "grid"
        div_grid = div().setParseAction(withAttribute(type="grid"))
        grid_expr = div_grid + SkipTo(div | div_end)("body")
        for grid_header in grid_expr.searchString(html):
            print(grid_header.body)
        
        # construct a match with any div tag having a type attribute, regardless of the value
        div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE))
        div_expr = div_any_type + SkipTo(div | div_end)("body")
        for div_header in div_expr.searchString(html):
            print(div_header.body)
    prints::
        1 4 0 1 0

        1 4 0 1 0
        1,3 2,3 1,1
    cs�x~�D]v\}}||kr8t||d|��n|tjkr|||krt||d||||f��qqWdS(Nsno matching attribute s+attribute '%s' has value '%s', must be '%s'(RRct	ANY_VALUE(R�RNR�tattrNamet	attrValue(tattrs(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�Rs(R�(R�tattrDictR�R�R�((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRcs2
%cCs'|rd|nd}ti||6�S(s�
    Simplified version of C{L{withAttribute}} when matching on a div class - made
    difficult because C{class} is a reserved word in Python.

    Example::
        html = '''
            <div>
            Some text
            <div class="grid">1 4 0 1 0</div>
            <div class="graph">1,3 2,3 1,1</div>
            <div>this &lt;div&gt; has no class</div>
            </div>
                
        '''
        div,div_end = makeHTMLTags("div")
        div_grid = div().setParseAction(withClass("grid"))
        
        grid_expr = div_grid + SkipTo(div | div_end)("body")
        for grid_header in grid_expr.searchString(html):
            print(grid_header.body)
        
        div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE))
        div_expr = div_any_type + SkipTo(div | div_end)("body")
        for div_header in div_expr.searchString(html):
            print(div_header.body)
    prints::
        1 4 0 1 0

        1 4 0 1 0
        1,3 2,3 1,1
    s%s:classtclass(Rc(t	classnamet	namespacet	classattr((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRi\s t(RYcCs<t�}||||B}xt|�D]\}}|dd \}}	}
}|	dkrdd|nd|}|	dkr�|d
ks�t|�dkr�td��n|\}
}nt�j|�}|
tjkr�|	dkr
t||�t	|t
|��}q�|	dkrx|d
k	rQt|||�t	|t
||��}q�t||�t	|t
|��}q�|	dkr�t||
|||�t	||
|||�}q�td��n+|
tjkr�|	dkr)t|t
�st
|�}nt|j|�t	||�}q�|	dkr�|d
k	rpt|||�t	|t
||��}q�t||�t	|t
|��}q�|	dkr�t||
|||�t	||
|||�}q�td��ntd	��|r
|j|�n||j|�|BK}|}q(W||K}|S(s�	
    Helper method for constructing grammars of expressions made up of
    operators working in a precedence hierarchy.  Operators may be unary or
    binary, left- or right-associative.  Parse actions can also be attached
    to operator expressions. The generated parser will also recognize the use 
    of parentheses to override operator precedences (see example below).
    
    Note: if you define a deep operator list, you may see performance issues
    when using infixNotation. See L{ParserElement.enablePackrat} for a
    mechanism to potentially improve your parser performance.

    Parameters:
     - baseExpr - expression representing the most basic element for the nested
     - opList - list of tuples, one for each operator precedence level in the
      expression grammar; each tuple is of the form
      (opExpr, numTerms, rightLeftAssoc, parseAction), where:
       - opExpr is the pyparsing expression for the operator;
          may also be a string, which will be converted to a Literal;
          if numTerms is 3, opExpr is a tuple of two expressions, for the
          two operators separating the 3 terms
       - numTerms is the number of terms for this operator (must
          be 1, 2, or 3)
       - rightLeftAssoc is the indicator whether the operator is
          right or left associative, using the pyparsing-defined
          constants C{opAssoc.RIGHT} and C{opAssoc.LEFT}.
       - parseAction is the parse action to be associated with
          expressions matching this operator expression (the
          parse action tuple member may be omitted)
     - lpar - expression for matching left-parentheses (default=C{Suppress('(')})
     - rpar - expression for matching right-parentheses (default=C{Suppress(')')})

    Example::
        # simple example of four-function arithmetic with ints and variable names
        integer = pyparsing_common.signed_integer
        varname = pyparsing_common.identifier 
        
        arith_expr = infixNotation(integer | varname,
            [
            ('-', 1, opAssoc.RIGHT),
            (oneOf('* /'), 2, opAssoc.LEFT),
            (oneOf('+ -'), 2, opAssoc.LEFT),
            ])
        
        arith_expr.runTests('''
            5+3*6
            (5+3)*6
            -2--11
            ''', fullDump=False)
    prints::
        5+3*6
        [[5, '+', [3, '*', 6]]]

        (5+3)*6
        [[[5, '+', 3], '*', 6]]

        -2--11
        [[['-', 2], '-', ['-', 11]]]
    iis%s terms	%s%s termis@if numterms=3, opExpr must be a tuple or list of two expressionsis6operator must be unary (1), binary (2), or ternary (3)s2operator must indicate right or left associativityN(N(R
R�R�R�R�R�RRtLEFTRRRtRIGHTRsRRFRz(tbaseExprtopListtlpartrparR}tlastExprR�toperDeftopExprtaritytrightLeftAssocR�ttermNametopExpr1topExpr2tthisExprR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRg�sR;	 '/' $/' 

s4"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*t"s string enclosed in double quotess4'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*t's string enclosed in single quotess*quotedString using single or double quotestusunicode string literalcCs!||krtd��n|d
kr�t|t�rt|t�rt|�dkr�t|�dkr�|d
k	r�tt|t||tj	dd���j
d��}q|tj�t||tj	�j
d��}q�|d
k	r9tt|t
|�t
|�ttj	dd���j
d��}q�ttt
|�t
|�ttj	dd���j
d��}q�td��nt�}|d
k	r�|tt|�t||B|B�t|��K}n.|tt|�t||B�t|��K}|jd	||f�|S(s~	
    Helper method for defining nested lists enclosed in opening and closing
    delimiters ("(" and ")" are the default).

    Parameters:
     - opener - opening character for a nested list (default=C{"("}); can also be a pyparsing expression
     - closer - closing character for a nested list (default=C{")"}); can also be a pyparsing expression
     - content - expression for items within the nested lists (default=C{None})
     - ignoreExpr - expression for ignoring opening and closing delimiters (default=C{quotedString})

    If an expression is not provided for the content argument, the nested
    expression will capture all whitespace-delimited content between delimiters
    as a list of separate values.

    Use the C{ignoreExpr} argument to define expressions that may contain
    opening or closing characters that should not be treated as opening
    or closing characters for nesting, such as quotedString or a comment
    expression.  Specify multiple expressions using an C{L{Or}} or C{L{MatchFirst}}.
    The default is L{quotedString}, but if no expressions are to be ignored,
    then pass C{None} for this argument.

    Example::
        data_type = oneOf("void int short long char float double")
        decl_data_type = Combine(data_type + Optional(Word('*')))
        ident = Word(alphas+'_', alphanums+'_')
        number = pyparsing_common.number
        arg = Group(decl_data_type + ident)
        LPAR,RPAR = map(Suppress, "()")

        code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment))

        c_function = (decl_data_type("type") 
                      + ident("name")
                      + LPAR + Optional(delimitedList(arg), [])("args") + RPAR 
                      + code_body("body"))
        c_function.ignore(cStyleComment)
        
        source_code = '''
            int is_odd(int x) { 
                return (x%2); 
            }
                
            int dec_to_hex(char hchar) { 
                if (hchar >= '0' && hchar <= '9') { 
                    return (ord(hchar)-ord('0')); 
                } else { 
                    return (10+ord(hchar)-ord('A'));
                } 
            }
        '''
        for func in c_function.searchString(source_code):
            print("%(name)s (%(type)s) args: %(args)s" % func)

    prints::
        is_odd (int) args: [['int', 'x']]
        dec_to_hex (int) args: [['char', 'hchar']]
    s.opening and closing strings cannot be the sameiRKcSs|dj�S(Ni(R�(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq9RrcSs|dj�S(Ni(R�(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq<RrcSs|dj�S(Ni(R�(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqBRrcSs|dj�S(Ni(R�(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqFRrsOopening and closing arguments must be strings if no content expression is givensnested %s%s expressionN(R�R�RsR�R�RRRR"RfRzRAR�RR
RR)R0R�(topenertclosertcontentR�R}((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRN�s4:$
$ 	5.cs5�fd�}�fd�}�fd�}tt�jd�j��}t�t�j|�jd�}t�j|�jd�}t�j|�jd�}	|r�tt|�|t|t|�t|��|	�}
n0tt|�t|t|�t|���}
|j	t
t��|
jd�S(	s
	
    Helper method for defining space-delimited indentation blocks, such as
    those used to define block statements in Python source code.

    Parameters:
     - blockStatementExpr - expression defining syntax of statement that
            is repeated within the indented block
     - indentStack - list created by caller to manage indentation stack
            (multiple statementWithIndentedBlock expressions within a single grammar
            should share a common indentStack)
     - indent - boolean indicating whether block must be indented beyond the
            the current level; set to False for block of left-most statements
            (default=C{True})

    A valid block must contain at least one C{blockStatement}.

    Example::
        data = '''
        def A(z):
          A1
          B = 100
          G = A2
          A2
          A3
        B
        def BB(a,b,c):
          BB1
          def BBA():
            bba1
            bba2
            bba3
        C
        D
        def spam(x,y):
             def eggs(z):
                 pass
        '''


        indentStack = [1]
        stmt = Forward()

        identifier = Word(alphas, alphanums)
        funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":")
        func_body = indentedBlock(stmt, indentStack)
        funcDef = Group( funcDecl + func_body )

        rvalue = Forward()
        funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")")
        rvalue << (funcCall | identifier | Word(nums))
        assignment = Group(identifier + "=" + rvalue)
        stmt << ( funcDef | assignment | identifier )

        module_body = OneOrMore(stmt)

        parseTree = module_body.parseString(data)
        parseTree.pprint()
    prints::
        [['def',
          'A',
          ['(', 'z', ')'],
          ':',
          [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]],
         'B',
         ['def',
          'BB',
          ['(', 'a', 'b', 'c', ')'],
          ':',
          [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]],
         'C',
         'D',
         ['def',
          'spam',
          ['(', 'x', 'y', ')'],
          ':',
          [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] 
    css|t|�krdSt||�}|�dkro|�dkrZt||d��nt||d��ndS(Ni����sillegal nestingsnot a peer entry(R�R7RR(R�RNRptcurCol(tindentStack(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytcheckPeerIndent�scsEt||�}|�dkr/�j|�nt||d��dS(Ni����snot a subentry(R7RR(R�RNRpR+(R,(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytcheckSubIndent�scsn|t|�krdSt||�}�oH|�dkoH|�dks`t||d��n�j�dS(Ni����i����snot an unindent(R�R7RR�(R�RNRpR+(R,(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
checkUnindent�s&s	 tINDENTRrtUNINDENTsindented block(RRR�R�RRzR�RRR�R�(tblockStatementExprR,R$R-R.R/R7R0tPEERtUNDENTtsmExpr((R,s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRdQsN"8$s#[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]s[\0xa1-\0xbf\0xd7\0xf7]s_:sany tagsgt lt amp nbsp quot aposs><& "'s&(?P<entity>R�s);scommon HTML entitycCstj|j�S(sRHelper parser action to replace common HTML entities with their special characters(t_htmlEntityMapR�tentity(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRY�ss/\*(?:[^*]|\*(?!/))*s*/sC style comments<!--[\s\S]*?-->sHTML comments.*srest of lines//(?:\\\n|[^\n])*s
// commentsC++ style comments#.*sPython style comments 	t	commaItemR�cBs�eZdZee�Zee�Zee	�j
d�je�Zee
�j
d�jeed��Zed�j
d�je�Ze�je�de�je�j
d�Zejd��eeeed	�j�e�Bj
d
�Zeje�ed�j
d�je�Zed
�j
d�je�ZeeBeBj�Zed�j
d�je�Zeeded�j
d�Zed�j
d�Zed�j
d�Z e de dj
d�Z!ee de d8�dee de d9�j
d�Z"e"j#d��dej
d �Z$e%e!e$Be"Bj
d!��j
d!�Z&ed"�j
d#�Z'e(d$d%��Z)e(d&d'��Z*ed(�j
d)�Z+ed*�j
d+�Z,ed,�j
d-�Z-e.j�e/j�BZ0e(d.��Z1e%e2e3d/�e4�ee5d0d/�ee6d1����j�j
d2�Z7e8ee9j:�e7Bd3d4��j
d5�Z;e(ed6���Z<e(ed7���Z=RS(:s�

    Here are some common low-level expressions that may be useful in jump-starting parser development:
     - numeric forms (L{integers<integer>}, L{reals<real>}, L{scientific notation<sci_real>})
     - common L{programming identifiers<identifier>}
     - network addresses (L{MAC<mac_address>}, L{IPv4<ipv4_address>}, L{IPv6<ipv6_address>})
     - ISO8601 L{dates<iso8601_date>} and L{datetime<iso8601_datetime>}
     - L{UUID<uuid>}
     - L{comma-separated list<comma_separated_list>}
    Parse actions:
     - C{L{convertToInteger}}
     - C{L{convertToFloat}}
     - C{L{convertToDate}}
     - C{L{convertToDatetime}}
     - C{L{stripHTMLTags}}
     - C{L{upcaseTokens}}
     - C{L{downcaseTokens}}

    Example::
        pyparsing_common.number.runTests('''
            # any int or real number, returned as the appropriate type
            100
            -100
            +100
            3.14159
            6.02e23
            1e-12
            ''')

        pyparsing_common.fnumber.runTests('''
            # any int or real number, returned as float
            100
            -100
            +100
            3.14159
            6.02e23
            1e-12
            ''')

        pyparsing_common.hex_integer.runTests('''
            # hex numbers
            100
            FF
            ''')

        pyparsing_common.fraction.runTests('''
            # fractions
            1/2
            -3/4
            ''')

        pyparsing_common.mixed_integer.runTests('''
            # mixed fractions
            1
            1/2
            -3/4
            1-3/4
            ''')

        import uuid
        pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID))
        pyparsing_common.uuid.runTests('''
            # uuid
            12345678-1234-5678-1234-567812345678
            ''')
    prints::
        # any int or real number, returned as the appropriate type
        100
        [100]

        -100
        [-100]

        +100
        [100]

        3.14159
        [3.14159]

        6.02e23
        [6.02e+23]

        1e-12
        [1e-12]

        # any int or real number, returned as float
        100
        [100.0]

        -100
        [-100.0]

        +100
        [100.0]

        3.14159
        [3.14159]

        6.02e23
        [6.02e+23]

        1e-12
        [1e-12]

        # hex numbers
        100
        [256]

        FF
        [255]

        # fractions
        1/2
        [0.5]

        -3/4
        [-0.75]

        # mixed fractions
        1
        [1]

        1/2
        [0.5]

        -3/4
        [-0.75]

        1-3/4
        [1.75]

        # uuid
        12345678-1234-5678-1234-567812345678
        [UUID('12345678-1234-5678-1234-567812345678')]
    tintegershex integeris[+-]?\d+ssigned integerR�tfractioncCs|d|dS(Nii����((Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq�RrRzs"fraction or mixed integer-fractions
[+-]?\d+\.\d*sreal numbers+[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)s$real number with scientific notations[+-]?\d+\.?\d*([eE][+-]?\d+)?tfnumberR�t
identifiersK(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}sIPv4 addresss[0-9a-fA-F]{1,4}thex_integerRisfull IPv6 addressiis::sshort IPv6 addresscCstd�|D��dkS(Ncss'|]}tjj|�rdVqdS(iN(Rlt
_ipv6_partR�(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�si(R�(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq�Rrs::ffff:smixed IPv6 addresssIPv6 addresss:[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}sMAC addresss%Y-%m-%dcs�fd�}|S(s�
        Helper to create a parse action for converting parsed date string to Python datetime.date

        Params -
         - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%d"})

        Example::
            date_expr = pyparsing_common.iso8601_date.copy()
            date_expr.setParseAction(pyparsing_common.convertToDate())
            print(date_expr.parseString("1999-12-31"))
        prints::
            [datetime.date(1999, 12, 31)]
        csPytj|d��j�SWn+tk
rK}t||t|���nXdS(Ni(RtstrptimetdateR�RRu(R�RNRptve(tfmt(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytcvt_fn�s((RBRC((RBs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
convertToDate�ss%Y-%m-%dT%H:%M:%S.%fcs�fd�}|S(s
        Helper to create a parse action for converting parsed datetime string to Python datetime.datetime

        Params -
         - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%dT%H:%M:%S.%f"})

        Example::
            dt_expr = pyparsing_common.iso8601_datetime.copy()
            dt_expr.setParseAction(pyparsing_common.convertToDatetime())
            print(dt_expr.parseString("1999-12-31T23:59:59.999"))
        prints::
            [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)]
        csJytj|d��SWn+tk
rE}t||t|���nXdS(Ni(RR?R�RRu(R�RNRpRA(RB(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRC�s((RBRC((RBs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytconvertToDatetime�ss7(?P<year>\d{4})(?:-(?P<month>\d\d)(?:-(?P<day>\d\d))?)?sISO8601 dates�(?P<year>\d{4})-(?P<month>\d\d)-(?P<day>\d\d)[T ](?P<hour>\d\d):(?P<minute>\d\d)(:(?P<second>\d\d(\.\d*)?)?)?(?P<tz>Z|[+-]\d\d:?\d\d)?sISO8601 datetimes2[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}tUUIDcCstjj|d�S(s
        Parse action to remove HTML tags from web page HTML source

        Example::
            # strip HTML links from normal text 
            text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>'
            td,td_end = makeHTMLTags("TD")
            table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end
            
            print(table_text.parseString(text).body) # -> 'More info at the pyparsing wiki page'
        i(Rlt_html_stripperR{(R�RNR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
stripHTMLTags�s
R�R<s 	R8R�Rrscomma separated listcCst|�j�S(N(RR,(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq�RrcCst|�j�S(N(RR�(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq�Rr(ii(ii(>R�R�R�RkRotconvertToIntegertfloattconvertToFloatR-RPR�RzR9RBR=R%tsigned_integerR:R�RR�t
mixed_integerR�trealtsci_realR�tnumberR;R2R1R<tipv4_addressR>t_full_ipv6_addresst_short_ipv6_addressR�t_mixed_ipv6_addressRtipv6_addresstmac_addressR#RDREtiso8601_datetiso8601_datetimetuuidR5R4RGRHRRRRTR,t
_commasepitemR>RWR�tcomma_separated_listRbR@(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRl�sL�'/-
 ;&J+t__main__tselecttfroms_$R�R�tcolumnsR�ttablestcommandsK
        # '*' as column list and dotted table name
        select * from SYS.XYZZY

        # caseless match on "SELECT", and casts back to "select"
        SELECT * from XYZZY, ABC

        # list of column names, and mixed case SELECT keyword
        Select AA,BB,CC from Sys.dual

        # multiple tables
        Select A, B, C from Sys.dual, Table2

        # invalid SELECT keyword - should fail
        Xelect A, B, C from Sys.dual

        # incomplete command - should fail
        Select

        # invalid column name - should fail
        Select ^^^ frox Sys.dual

        s]
        100
        -100
        +100
        3.14159
        6.02e23
        1e-12
        s 
        100
        FF
        s6
        12345678-1234-5678-1234-567812345678
        (�R�t__version__t__versionTime__t
__author__R�tweakrefRR�R�RxR�R|RSR�R8RRR�Rt_threadRtImportErrort	threadingRR�tordereddictR�t__all__R�tversion_infoRQRtmaxsizeR$RuR�tchrR�RR�R�R2treversedR�R�R4RxRIRJR_tmaxinttxrangeR�t__builtin__R�tfnameRR`R�R�R�R�R�R�tascii_uppercasetascii_lowercaseR2RPRBR1R�R�t	printableRTRaRRRR!R$R�R tMutableMappingtregisterR7RHRERGRKRMROReR"R*RRRRRiRRRRjR-R%R#RR,RpRRRR(R'R/R.RRRRR
RRRR�RR0R�R�RR&R
R�R+RRR	R)RR`R�R>R:R�RMRLRER�RQR?ReRfRhR�RARGRFR_R^Rzt_escapedPunct_escapedHexChart_escapedOctChartUNICODEt_singleChart
_charRangeR�R�R]RKRZRXRkRbR@RRIRJRcRRiRRRRRgRSR<R\RWRaRNRdR3RUR5R4R�R�R6R�R9RYR6RCR�R[R=R;RDRVR�RZR8RlR�tselectTokent	fromTokentidentt
columnNametcolumnNameListt
columnSpect	tableNamet
tableNameListt	simpleSQLR"RPR;R=RYRF(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt<module>=s�


	*		
	


8
���	
		
				@�����&	A=�I�G3pLOD|M &#	@sQ,A	,					I	#%		!4@		
			,					?#	k%Zr(,	#8+�
$				_vendor/pyparsing.py000064400000700753151733474000010606 0ustar00# module pyparsing.py
#
# Copyright (c) 2003-2016  Paul T. McGuire
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#

__doc__ = \
"""
pyparsing module - Classes and methods to define and execute parsing grammars

The pyparsing module is an alternative approach to creating and executing simple grammars,
vs. the traditional lex/yacc approach, or the use of regular expressions.  With pyparsing, you
don't need to learn a new syntax for defining grammars or matching expressions - the parsing module
provides a library of classes that you use to construct the grammar directly in Python.

Here is a program to parse "Hello, World!" (or any greeting of the form 
C{"<salutation>, <addressee>!"}), built up using L{Word}, L{Literal}, and L{And} elements 
(L{'+'<ParserElement.__add__>} operator gives L{And} expressions, strings are auto-converted to
L{Literal} expressions)::

    from pyparsing import Word, alphas

    # define grammar of a greeting
    greet = Word(alphas) + "," + Word(alphas) + "!"

    hello = "Hello, World!"
    print (hello, "->", greet.parseString(hello))

The program outputs the following::

    Hello, World! -> ['Hello', ',', 'World', '!']

The Python representation of the grammar is quite readable, owing to the self-explanatory
class names, and the use of '+', '|' and '^' operators.

The L{ParseResults} object returned from L{ParserElement.parseString<ParserElement.parseString>} can be accessed as a nested list, a dictionary, or an
object with named attributes.

The pyparsing module handles some of the problems that are typically vexing when writing text parsers:
 - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello  ,  World  !", etc.)
 - quoted strings
 - embedded comments
"""

__version__ = "2.1.10"
__versionTime__ = "07 Oct 2016 01:31 UTC"
__author__ = "Paul McGuire <ptmcg@users.sourceforge.net>"

import string
from weakref import ref as wkref
import copy
import sys
import warnings
import re
import sre_constants
import collections
import pprint
import traceback
import types
from datetime import datetime

try:
    from _thread import RLock
except ImportError:
    from threading import RLock

try:
    from collections import OrderedDict as _OrderedDict
except ImportError:
    try:
        from ordereddict import OrderedDict as _OrderedDict
    except ImportError:
        _OrderedDict = None

#~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) )

__all__ = [
'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty',
'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal',
'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or',
'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException',
'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException',
'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', 
'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore',
'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col',
'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString',
'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'hexnums',
'htmlComment', 'javaStyleComment', 'line', 'lineEnd', 'lineStart', 'lineno',
'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral',
'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables',
'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', 
'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd',
'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute',
'indentedBlock', 'originalTextFor', 'ungroup', 'infixNotation','locatedExpr', 'withClass',
'CloseMatch', 'tokenMap', 'pyparsing_common',
]

system_version = tuple(sys.version_info)[:3]
PY_3 = system_version[0] == 3
if PY_3:
    _MAX_INT = sys.maxsize
    basestring = str
    unichr = chr
    _ustr = str

    # build list of single arg builtins, that can be used as parse actions
    singleArgBuiltins = [sum, len, sorted, reversed, list, tuple, set, any, all, min, max]

else:
    _MAX_INT = sys.maxint
    range = xrange

    def _ustr(obj):
        """Drop-in replacement for str(obj) that tries to be Unicode friendly. It first tries
           str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It
           then < returns the unicode object | encodes it with the default encoding | ... >.
        """
        if isinstance(obj,unicode):
            return obj

        try:
            # If this works, then _ustr(obj) has the same behaviour as str(obj), so
            # it won't break any existing code.
            return str(obj)

        except UnicodeEncodeError:
            # Else encode it
            ret = unicode(obj).encode(sys.getdefaultencoding(), 'xmlcharrefreplace')
            xmlcharref = Regex('&#\d+;')
            xmlcharref.setParseAction(lambda t: '\\u' + hex(int(t[0][2:-1]))[2:])
            return xmlcharref.transformString(ret)

    # build list of single arg builtins, tolerant of Python version, that can be used as parse actions
    singleArgBuiltins = []
    import __builtin__
    for fname in "sum len sorted reversed list tuple set any all min max".split():
        try:
            singleArgBuiltins.append(getattr(__builtin__,fname))
        except AttributeError:
            continue
            
_generatorType = type((y for y in range(1)))
 
def _xml_escape(data):
    """Escape &, <, >, ", ', etc. in a string of data."""

    # ampersand must be replaced first
    from_symbols = '&><"\''
    to_symbols = ('&'+s+';' for s in "amp gt lt quot apos".split())
    for from_,to_ in zip(from_symbols, to_symbols):
        data = data.replace(from_, to_)
    return data

class _Constants(object):
    pass

alphas     = string.ascii_uppercase + string.ascii_lowercase
nums       = "0123456789"
hexnums    = nums + "ABCDEFabcdef"
alphanums  = alphas + nums
_bslash    = chr(92)
printables = "".join(c for c in string.printable if c not in string.whitespace)

class ParseBaseException(Exception):
    """base exception class for all parsing runtime exceptions"""
    # Performance tuning: we construct a *lot* of these, so keep this
    # constructor as small and fast as possible
    def __init__( self, pstr, loc=0, msg=None, elem=None ):
        self.loc = loc
        if msg is None:
            self.msg = pstr
            self.pstr = ""
        else:
            self.msg = msg
            self.pstr = pstr
        self.parserElement = elem
        self.args = (pstr, loc, msg)

    @classmethod
    def _from_exception(cls, pe):
        """
        internal factory method to simplify creating one type of ParseException 
        from another - avoids having __init__ signature conflicts among subclasses
        """
        return cls(pe.pstr, pe.loc, pe.msg, pe.parserElement)

    def __getattr__( self, aname ):
        """supported attributes by name are:
            - lineno - returns the line number of the exception text
            - col - returns the column number of the exception text
            - line - returns the line containing the exception text
        """
        if( aname == "lineno" ):
            return lineno( self.loc, self.pstr )
        elif( aname in ("col", "column") ):
            return col( self.loc, self.pstr )
        elif( aname == "line" ):
            return line( self.loc, self.pstr )
        else:
            raise AttributeError(aname)

    def __str__( self ):
        return "%s (at char %d), (line:%d, col:%d)" % \
                ( self.msg, self.loc, self.lineno, self.column )
    def __repr__( self ):
        return _ustr(self)
    def markInputline( self, markerString = ">!<" ):
        """Extracts the exception line from the input string, and marks
           the location of the exception with a special symbol.
        """
        line_str = self.line
        line_column = self.column - 1
        if markerString:
            line_str = "".join((line_str[:line_column],
                                markerString, line_str[line_column:]))
        return line_str.strip()
    def __dir__(self):
        return "lineno col line".split() + dir(type(self))

class ParseException(ParseBaseException):
    """
    Exception thrown when parse expressions don't match class;
    supported attributes by name are:
     - lineno - returns the line number of the exception text
     - col - returns the column number of the exception text
     - line - returns the line containing the exception text
        
    Example::
        try:
            Word(nums).setName("integer").parseString("ABC")
        except ParseException as pe:
            print(pe)
            print("column: {}".format(pe.col))
            
    prints::
       Expected integer (at char 0), (line:1, col:1)
        column: 1
    """
    pass

class ParseFatalException(ParseBaseException):
    """user-throwable exception thrown when inconsistent parse content
       is found; stops all parsing immediately"""
    pass

class ParseSyntaxException(ParseFatalException):
    """just like L{ParseFatalException}, but thrown internally when an
       L{ErrorStop<And._ErrorStop>} ('-' operator) indicates that parsing is to stop 
       immediately because an unbacktrackable syntax error has been found"""
    pass

#~ class ReparseException(ParseBaseException):
    #~ """Experimental class - parse actions can raise this exception to cause
       #~ pyparsing to reparse the input string:
        #~ - with a modified input string, and/or
        #~ - with a modified start location
       #~ Set the values of the ReparseException in the constructor, and raise the
       #~ exception in a parse action to cause pyparsing to use the new string/location.
       #~ Setting the values as None causes no change to be made.
       #~ """
    #~ def __init_( self, newstring, restartLoc ):
        #~ self.newParseText = newstring
        #~ self.reparseLoc = restartLoc

class RecursiveGrammarException(Exception):
    """exception thrown by L{ParserElement.validate} if the grammar could be improperly recursive"""
    def __init__( self, parseElementList ):
        self.parseElementTrace = parseElementList

    def __str__( self ):
        return "RecursiveGrammarException: %s" % self.parseElementTrace

class _ParseResultsWithOffset(object):
    def __init__(self,p1,p2):
        self.tup = (p1,p2)
    def __getitem__(self,i):
        return self.tup[i]
    def __repr__(self):
        return repr(self.tup[0])
    def setOffset(self,i):
        self.tup = (self.tup[0],i)

class ParseResults(object):
    """
    Structured parse results, to provide multiple means of access to the parsed data:
       - as a list (C{len(results)})
       - by list index (C{results[0], results[1]}, etc.)
       - by attribute (C{results.<resultsName>} - see L{ParserElement.setResultsName})

    Example::
        integer = Word(nums)
        date_str = (integer.setResultsName("year") + '/' 
                        + integer.setResultsName("month") + '/' 
                        + integer.setResultsName("day"))
        # equivalent form:
        # date_str = integer("year") + '/' + integer("month") + '/' + integer("day")

        # parseString returns a ParseResults object
        result = date_str.parseString("1999/12/31")

        def test(s, fn=repr):
            print("%s -> %s" % (s, fn(eval(s))))
        test("list(result)")
        test("result[0]")
        test("result['month']")
        test("result.day")
        test("'month' in result")
        test("'minutes' in result")
        test("result.dump()", str)
    prints::
        list(result) -> ['1999', '/', '12', '/', '31']
        result[0] -> '1999'
        result['month'] -> '12'
        result.day -> '31'
        'month' in result -> True
        'minutes' in result -> False
        result.dump() -> ['1999', '/', '12', '/', '31']
        - day: 31
        - month: 12
        - year: 1999
    """
    def __new__(cls, toklist=None, name=None, asList=True, modal=True ):
        if isinstance(toklist, cls):
            return toklist
        retobj = object.__new__(cls)
        retobj.__doinit = True
        return retobj

    # Performance tuning: we construct a *lot* of these, so keep this
    # constructor as small and fast as possible
    def __init__( self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance ):
        if self.__doinit:
            self.__doinit = False
            self.__name = None
            self.__parent = None
            self.__accumNames = {}
            self.__asList = asList
            self.__modal = modal
            if toklist is None:
                toklist = []
            if isinstance(toklist, list):
                self.__toklist = toklist[:]
            elif isinstance(toklist, _generatorType):
                self.__toklist = list(toklist)
            else:
                self.__toklist = [toklist]
            self.__tokdict = dict()

        if name is not None and name:
            if not modal:
                self.__accumNames[name] = 0
            if isinstance(name,int):
                name = _ustr(name) # will always return a str, but use _ustr for consistency
            self.__name = name
            if not (isinstance(toklist, (type(None), basestring, list)) and toklist in (None,'',[])):
                if isinstance(toklist,basestring):
                    toklist = [ toklist ]
                if asList:
                    if isinstance(toklist,ParseResults):
                        self[name] = _ParseResultsWithOffset(toklist.copy(),0)
                    else:
                        self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]),0)
                    self[name].__name = name
                else:
                    try:
                        self[name] = toklist[0]
                    except (KeyError,TypeError,IndexError):
                        self[name] = toklist

    def __getitem__( self, i ):
        if isinstance( i, (int,slice) ):
            return self.__toklist[i]
        else:
            if i not in self.__accumNames:
                return self.__tokdict[i][-1][0]
            else:
                return ParseResults([ v[0] for v in self.__tokdict[i] ])

    def __setitem__( self, k, v, isinstance=isinstance ):
        if isinstance(v,_ParseResultsWithOffset):
            self.__tokdict[k] = self.__tokdict.get(k,list()) + [v]
            sub = v[0]
        elif isinstance(k,(int,slice)):
            self.__toklist[k] = v
            sub = v
        else:
            self.__tokdict[k] = self.__tokdict.get(k,list()) + [_ParseResultsWithOffset(v,0)]
            sub = v
        if isinstance(sub,ParseResults):
            sub.__parent = wkref(self)

    def __delitem__( self, i ):
        if isinstance(i,(int,slice)):
            mylen = len( self.__toklist )
            del self.__toklist[i]

            # convert int to slice
            if isinstance(i, int):
                if i < 0:
                    i += mylen
                i = slice(i, i+1)
            # get removed indices
            removed = list(range(*i.indices(mylen)))
            removed.reverse()
            # fixup indices in token dictionary
            for name,occurrences in self.__tokdict.items():
                for j in removed:
                    for k, (value, position) in enumerate(occurrences):
                        occurrences[k] = _ParseResultsWithOffset(value, position - (position > j))
        else:
            del self.__tokdict[i]

    def __contains__( self, k ):
        return k in self.__tokdict

    def __len__( self ): return len( self.__toklist )
    def __bool__(self): return ( not not self.__toklist )
    __nonzero__ = __bool__
    def __iter__( self ): return iter( self.__toklist )
    def __reversed__( self ): return iter( self.__toklist[::-1] )
    def _iterkeys( self ):
        if hasattr(self.__tokdict, "iterkeys"):
            return self.__tokdict.iterkeys()
        else:
            return iter(self.__tokdict)

    def _itervalues( self ):
        return (self[k] for k in self._iterkeys())
            
    def _iteritems( self ):
        return ((k, self[k]) for k in self._iterkeys())

    if PY_3:
        keys = _iterkeys       
        """Returns an iterator of all named result keys (Python 3.x only)."""

        values = _itervalues
        """Returns an iterator of all named result values (Python 3.x only)."""

        items = _iteritems
        """Returns an iterator of all named result key-value tuples (Python 3.x only)."""

    else:
        iterkeys = _iterkeys
        """Returns an iterator of all named result keys (Python 2.x only)."""

        itervalues = _itervalues
        """Returns an iterator of all named result values (Python 2.x only)."""

        iteritems = _iteritems
        """Returns an iterator of all named result key-value tuples (Python 2.x only)."""

        def keys( self ):
            """Returns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x)."""
            return list(self.iterkeys())

        def values( self ):
            """Returns all named result values (as a list in Python 2.x, as an iterator in Python 3.x)."""
            return list(self.itervalues())
                
        def items( self ):
            """Returns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x)."""
            return list(self.iteritems())

    def haskeys( self ):
        """Since keys() returns an iterator, this method is helpful in bypassing
           code that looks for the existence of any defined results names."""
        return bool(self.__tokdict)
        
    def pop( self, *args, **kwargs):
        """
        Removes and returns item at specified index (default=C{last}).
        Supports both C{list} and C{dict} semantics for C{pop()}. If passed no
        argument or an integer argument, it will use C{list} semantics
        and pop tokens from the list of parsed tokens. If passed a 
        non-integer argument (most likely a string), it will use C{dict}
        semantics and pop the corresponding value from any defined 
        results names. A second default return value argument is 
        supported, just as in C{dict.pop()}.

        Example::
            def remove_first(tokens):
                tokens.pop(0)
            print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321']
            print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321']

            label = Word(alphas)
            patt = label("LABEL") + OneOrMore(Word(nums))
            print(patt.parseString("AAB 123 321").dump())

            # Use pop() in a parse action to remove named result (note that corresponding value is not
            # removed from list form of results)
            def remove_LABEL(tokens):
                tokens.pop("LABEL")
                return tokens
            patt.addParseAction(remove_LABEL)
            print(patt.parseString("AAB 123 321").dump())
        prints::
            ['AAB', '123', '321']
            - LABEL: AAB

            ['AAB', '123', '321']
        """
        if not args:
            args = [-1]
        for k,v in kwargs.items():
            if k == 'default':
                args = (args[0], v)
            else:
                raise TypeError("pop() got an unexpected keyword argument '%s'" % k)
        if (isinstance(args[0], int) or 
                        len(args) == 1 or 
                        args[0] in self):
            index = args[0]
            ret = self[index]
            del self[index]
            return ret
        else:
            defaultvalue = args[1]
            return defaultvalue

    def get(self, key, defaultValue=None):
        """
        Returns named result matching the given key, or if there is no
        such name, then returns the given C{defaultValue} or C{None} if no
        C{defaultValue} is specified.

        Similar to C{dict.get()}.
        
        Example::
            integer = Word(nums)
            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")           

            result = date_str.parseString("1999/12/31")
            print(result.get("year")) # -> '1999'
            print(result.get("hour", "not specified")) # -> 'not specified'
            print(result.get("hour")) # -> None
        """
        if key in self:
            return self[key]
        else:
            return defaultValue

    def insert( self, index, insStr ):
        """
        Inserts new element at location index in the list of parsed tokens.
        
        Similar to C{list.insert()}.

        Example::
            print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321']

            # use a parse action to insert the parse location in the front of the parsed results
            def insert_locn(locn, tokens):
                tokens.insert(0, locn)
            print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321']
        """
        self.__toklist.insert(index, insStr)
        # fixup indices in token dictionary
        for name,occurrences in self.__tokdict.items():
            for k, (value, position) in enumerate(occurrences):
                occurrences[k] = _ParseResultsWithOffset(value, position + (position > index))

    def append( self, item ):
        """
        Add single element to end of ParseResults list of elements.

        Example::
            print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321']
            
            # use a parse action to compute the sum of the parsed integers, and add it to the end
            def append_sum(tokens):
                tokens.append(sum(map(int, tokens)))
            print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444]
        """
        self.__toklist.append(item)

    def extend( self, itemseq ):
        """
        Add sequence of elements to end of ParseResults list of elements.

        Example::
            patt = OneOrMore(Word(alphas))
            
            # use a parse action to append the reverse of the matched strings, to make a palindrome
            def make_palindrome(tokens):
                tokens.extend(reversed([t[::-1] for t in tokens]))
                return ''.join(tokens)
            print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl'
        """
        if isinstance(itemseq, ParseResults):
            self += itemseq
        else:
            self.__toklist.extend(itemseq)

    def clear( self ):
        """
        Clear all elements and results names.
        """
        del self.__toklist[:]
        self.__tokdict.clear()

    def __getattr__( self, name ):
        try:
            return self[name]
        except KeyError:
            return ""
            
        if name in self.__tokdict:
            if name not in self.__accumNames:
                return self.__tokdict[name][-1][0]
            else:
                return ParseResults([ v[0] for v in self.__tokdict[name] ])
        else:
            return ""

    def __add__( self, other ):
        ret = self.copy()
        ret += other
        return ret

    def __iadd__( self, other ):
        if other.__tokdict:
            offset = len(self.__toklist)
            addoffset = lambda a: offset if a<0 else a+offset
            otheritems = other.__tokdict.items()
            otherdictitems = [(k, _ParseResultsWithOffset(v[0],addoffset(v[1])) )
                                for (k,vlist) in otheritems for v in vlist]
            for k,v in otherdictitems:
                self[k] = v
                if isinstance(v[0],ParseResults):
                    v[0].__parent = wkref(self)
            
        self.__toklist += other.__toklist
        self.__accumNames.update( other.__accumNames )
        return self

    def __radd__(self, other):
        if isinstance(other,int) and other == 0:
            # useful for merging many ParseResults using sum() builtin
            return self.copy()
        else:
            # this may raise a TypeError - so be it
            return other + self
        
    def __repr__( self ):
        return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) )

    def __str__( self ):
        return '[' + ', '.join(_ustr(i) if isinstance(i, ParseResults) else repr(i) for i in self.__toklist) + ']'

    def _asStringList( self, sep='' ):
        out = []
        for item in self.__toklist:
            if out and sep:
                out.append(sep)
            if isinstance( item, ParseResults ):
                out += item._asStringList()
            else:
                out.append( _ustr(item) )
        return out

    def asList( self ):
        """
        Returns the parse results as a nested list of matching tokens, all converted to strings.

        Example::
            patt = OneOrMore(Word(alphas))
            result = patt.parseString("sldkj lsdkj sldkj")
            # even though the result prints in string-like form, it is actually a pyparsing ParseResults
            print(type(result), result) # -> <class 'pyparsing.ParseResults'> ['sldkj', 'lsdkj', 'sldkj']
            
            # Use asList() to create an actual list
            result_list = result.asList()
            print(type(result_list), result_list) # -> <class 'list'> ['sldkj', 'lsdkj', 'sldkj']
        """
        return [res.asList() if isinstance(res,ParseResults) else res for res in self.__toklist]

    def asDict( self ):
        """
        Returns the named parse results as a nested dictionary.

        Example::
            integer = Word(nums)
            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
            
            result = date_str.parseString('12/31/1999')
            print(type(result), repr(result)) # -> <class 'pyparsing.ParseResults'> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]})
            
            result_dict = result.asDict()
            print(type(result_dict), repr(result_dict)) # -> <class 'dict'> {'day': '1999', 'year': '12', 'month': '31'}

            # even though a ParseResults supports dict-like access, sometime you just need to have a dict
            import json
            print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable
            print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"}
        """
        if PY_3:
            item_fn = self.items
        else:
            item_fn = self.iteritems
            
        def toItem(obj):
            if isinstance(obj, ParseResults):
                if obj.haskeys():
                    return obj.asDict()
                else:
                    return [toItem(v) for v in obj]
            else:
                return obj
                
        return dict((k,toItem(v)) for k,v in item_fn())

    def copy( self ):
        """
        Returns a new copy of a C{ParseResults} object.
        """
        ret = ParseResults( self.__toklist )
        ret.__tokdict = self.__tokdict.copy()
        ret.__parent = self.__parent
        ret.__accumNames.update( self.__accumNames )
        ret.__name = self.__name
        return ret

    def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ):
        """
        (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names.
        """
        nl = "\n"
        out = []
        namedItems = dict((v[1],k) for (k,vlist) in self.__tokdict.items()
                                                            for v in vlist)
        nextLevelIndent = indent + "  "

        # collapse out indents if formatting is not desired
        if not formatted:
            indent = ""
            nextLevelIndent = ""
            nl = ""

        selfTag = None
        if doctag is not None:
            selfTag = doctag
        else:
            if self.__name:
                selfTag = self.__name

        if not selfTag:
            if namedItemsOnly:
                return ""
            else:
                selfTag = "ITEM"

        out += [ nl, indent, "<", selfTag, ">" ]

        for i,res in enumerate(self.__toklist):
            if isinstance(res,ParseResults):
                if i in namedItems:
                    out += [ res.asXML(namedItems[i],
                                        namedItemsOnly and doctag is None,
                                        nextLevelIndent,
                                        formatted)]
                else:
                    out += [ res.asXML(None,
                                        namedItemsOnly and doctag is None,
                                        nextLevelIndent,
                                        formatted)]
            else:
                # individual token, see if there is a name for it
                resTag = None
                if i in namedItems:
                    resTag = namedItems[i]
                if not resTag:
                    if namedItemsOnly:
                        continue
                    else:
                        resTag = "ITEM"
                xmlBodyText = _xml_escape(_ustr(res))
                out += [ nl, nextLevelIndent, "<", resTag, ">",
                                                xmlBodyText,
                                                "</", resTag, ">" ]

        out += [ nl, indent, "</", selfTag, ">" ]
        return "".join(out)

    def __lookup(self,sub):
        for k,vlist in self.__tokdict.items():
            for v,loc in vlist:
                if sub is v:
                    return k
        return None

    def getName(self):
        """
        Returns the results name for this token expression. Useful when several 
        different expressions might match at a particular location.

        Example::
            integer = Word(nums)
            ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d")
            house_number_expr = Suppress('#') + Word(nums, alphanums)
            user_data = (Group(house_number_expr)("house_number") 
                        | Group(ssn_expr)("ssn")
                        | Group(integer)("age"))
            user_info = OneOrMore(user_data)
            
            result = user_info.parseString("22 111-22-3333 #221B")
            for item in result:
                print(item.getName(), ':', item[0])
        prints::
            age : 22
            ssn : 111-22-3333
            house_number : 221B
        """
        if self.__name:
            return self.__name
        elif self.__parent:
            par = self.__parent()
            if par:
                return par.__lookup(self)
            else:
                return None
        elif (len(self) == 1 and
               len(self.__tokdict) == 1 and
               next(iter(self.__tokdict.values()))[0][1] in (0,-1)):
            return next(iter(self.__tokdict.keys()))
        else:
            return None

    def dump(self, indent='', depth=0, full=True):
        """
        Diagnostic method for listing out the contents of a C{ParseResults}.
        Accepts an optional C{indent} argument so that this string can be embedded
        in a nested display of other data.

        Example::
            integer = Word(nums)
            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
            
            result = date_str.parseString('12/31/1999')
            print(result.dump())
        prints::
            ['12', '/', '31', '/', '1999']
            - day: 1999
            - month: 31
            - year: 12
        """
        out = []
        NL = '\n'
        out.append( indent+_ustr(self.asList()) )
        if full:
            if self.haskeys():
                items = sorted((str(k), v) for k,v in self.items())
                for k,v in items:
                    if out:
                        out.append(NL)
                    out.append( "%s%s- %s: " % (indent,('  '*depth), k) )
                    if isinstance(v,ParseResults):
                        if v:
                            out.append( v.dump(indent,depth+1) )
                        else:
                            out.append(_ustr(v))
                    else:
                        out.append(repr(v))
            elif any(isinstance(vv,ParseResults) for vv in self):
                v = self
                for i,vv in enumerate(v):
                    if isinstance(vv,ParseResults):
                        out.append("\n%s%s[%d]:\n%s%s%s" % (indent,('  '*(depth)),i,indent,('  '*(depth+1)),vv.dump(indent,depth+1) ))
                    else:
                        out.append("\n%s%s[%d]:\n%s%s%s" % (indent,('  '*(depth)),i,indent,('  '*(depth+1)),_ustr(vv)))
            
        return "".join(out)

    def pprint(self, *args, **kwargs):
        """
        Pretty-printer for parsed results as a list, using the C{pprint} module.
        Accepts additional positional or keyword args as defined for the 
        C{pprint.pprint} method. (U{http://docs.python.org/3/library/pprint.html#pprint.pprint})

        Example::
            ident = Word(alphas, alphanums)
            num = Word(nums)
            func = Forward()
            term = ident | num | Group('(' + func + ')')
            func <<= ident + Group(Optional(delimitedList(term)))
            result = func.parseString("fna a,b,(fnb c,d,200),100")
            result.pprint(width=40)
        prints::
            ['fna',
             ['a',
              'b',
              ['(', 'fnb', ['c', 'd', '200'], ')'],
              '100']]
        """
        pprint.pprint(self.asList(), *args, **kwargs)

    # add support for pickle protocol
    def __getstate__(self):
        return ( self.__toklist,
                 ( self.__tokdict.copy(),
                   self.__parent is not None and self.__parent() or None,
                   self.__accumNames,
                   self.__name ) )

    def __setstate__(self,state):
        self.__toklist = state[0]
        (self.__tokdict,
         par,
         inAccumNames,
         self.__name) = state[1]
        self.__accumNames = {}
        self.__accumNames.update(inAccumNames)
        if par is not None:
            self.__parent = wkref(par)
        else:
            self.__parent = None

    def __getnewargs__(self):
        return self.__toklist, self.__name, self.__asList, self.__modal

    def __dir__(self):
        return (dir(type(self)) + list(self.keys()))

collections.MutableMapping.register(ParseResults)

def col (loc,strg):
    """Returns current column within a string, counting newlines as line separators.
   The first column is number 1.

   Note: the default parsing behavior is to expand tabs in the input string
   before starting the parsing process.  See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information
   on parsing strings containing C{<TAB>}s, and suggested methods to maintain a
   consistent view of the parsed string, the parse location, and line and column
   positions within the parsed string.
   """
    s = strg
    return 1 if 0<loc<len(s) and s[loc-1] == '\n' else loc - s.rfind("\n", 0, loc)

def lineno(loc,strg):
    """Returns current line number within a string, counting newlines as line separators.
   The first line is number 1.

   Note: the default parsing behavior is to expand tabs in the input string
   before starting the parsing process.  See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information
   on parsing strings containing C{<TAB>}s, and suggested methods to maintain a
   consistent view of the parsed string, the parse location, and line and column
   positions within the parsed string.
   """
    return strg.count("\n",0,loc) + 1

def line( loc, strg ):
    """Returns the line of text containing loc within a string, counting newlines as line separators.
       """
    lastCR = strg.rfind("\n", 0, loc)
    nextCR = strg.find("\n", loc)
    if nextCR >= 0:
        return strg[lastCR+1:nextCR]
    else:
        return strg[lastCR+1:]

def _defaultStartDebugAction( instring, loc, expr ):
    print (("Match " + _ustr(expr) + " at loc " + _ustr(loc) + "(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )))

def _defaultSuccessDebugAction( instring, startloc, endloc, expr, toks ):
    print ("Matched " + _ustr(expr) + " -> " + str(toks.asList()))

def _defaultExceptionDebugAction( instring, loc, expr, exc ):
    print ("Exception raised:" + _ustr(exc))

def nullDebugAction(*args):
    """'Do-nothing' debug action, to suppress debugging output during parsing."""
    pass

# Only works on Python 3.x - nonlocal is toxic to Python 2 installs
#~ 'decorator to trim function calls to match the arity of the target'
#~ def _trim_arity(func, maxargs=3):
    #~ if func in singleArgBuiltins:
        #~ return lambda s,l,t: func(t)
    #~ limit = 0
    #~ foundArity = False
    #~ def wrapper(*args):
        #~ nonlocal limit,foundArity
        #~ while 1:
            #~ try:
                #~ ret = func(*args[limit:])
                #~ foundArity = True
                #~ return ret
            #~ except TypeError:
                #~ if limit == maxargs or foundArity:
                    #~ raise
                #~ limit += 1
                #~ continue
    #~ return wrapper

# this version is Python 2.x-3.x cross-compatible
'decorator to trim function calls to match the arity of the target'
def _trim_arity(func, maxargs=2):
    if func in singleArgBuiltins:
        return lambda s,l,t: func(t)
    limit = [0]
    foundArity = [False]
    
    # traceback return data structure changed in Py3.5 - normalize back to plain tuples
    if system_version[:2] >= (3,5):
        def extract_stack(limit=0):
            # special handling for Python 3.5.0 - extra deep call stack by 1
            offset = -3 if system_version == (3,5,0) else -2
            frame_summary = traceback.extract_stack(limit=-offset+limit-1)[offset]
            return [(frame_summary.filename, frame_summary.lineno)]
        def extract_tb(tb, limit=0):
            frames = traceback.extract_tb(tb, limit=limit)
            frame_summary = frames[-1]
            return [(frame_summary.filename, frame_summary.lineno)]
    else:
        extract_stack = traceback.extract_stack
        extract_tb = traceback.extract_tb
    
    # synthesize what would be returned by traceback.extract_stack at the call to 
    # user's parse action 'func', so that we don't incur call penalty at parse time
    
    LINE_DIFF = 6
    # IF ANY CODE CHANGES, EVEN JUST COMMENTS OR BLANK LINES, BETWEEN THE NEXT LINE AND 
    # THE CALL TO FUNC INSIDE WRAPPER, LINE_DIFF MUST BE MODIFIED!!!!
    this_line = extract_stack(limit=2)[-1]
    pa_call_line_synth = (this_line[0], this_line[1]+LINE_DIFF)

    def wrapper(*args):
        while 1:
            try:
                ret = func(*args[limit[0]:])
                foundArity[0] = True
                return ret
            except TypeError:
                # re-raise TypeErrors if they did not come from our arity testing
                if foundArity[0]:
                    raise
                else:
                    try:
                        tb = sys.exc_info()[-1]
                        if not extract_tb(tb, limit=2)[-1][:2] == pa_call_line_synth:
                            raise
                    finally:
                        del tb

                if limit[0] <= maxargs:
                    limit[0] += 1
                    continue
                raise

    # copy func name to wrapper for sensible debug output
    func_name = "<parse action>"
    try:
        func_name = getattr(func, '__name__', 
                            getattr(func, '__class__').__name__)
    except Exception:
        func_name = str(func)
    wrapper.__name__ = func_name

    return wrapper

class ParserElement(object):
    """Abstract base level parser element class."""
    DEFAULT_WHITE_CHARS = " \n\t\r"
    verbose_stacktrace = False

    @staticmethod
    def setDefaultWhitespaceChars( chars ):
        r"""
        Overrides the default whitespace chars

        Example::
            # default whitespace chars are space, <TAB> and newline
            OneOrMore(Word(alphas)).parseString("abc def\nghi jkl")  # -> ['abc', 'def', 'ghi', 'jkl']
            
            # change to just treat newline as significant
            ParserElement.setDefaultWhitespaceChars(" \t")
            OneOrMore(Word(alphas)).parseString("abc def\nghi jkl")  # -> ['abc', 'def']
        """
        ParserElement.DEFAULT_WHITE_CHARS = chars

    @staticmethod
    def inlineLiteralsUsing(cls):
        """
        Set class to be used for inclusion of string literals into a parser.
        
        Example::
            # default literal class used is Literal
            integer = Word(nums)
            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")           

            date_str.parseString("1999/12/31")  # -> ['1999', '/', '12', '/', '31']


            # change to Suppress
            ParserElement.inlineLiteralsUsing(Suppress)
            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")           

            date_str.parseString("1999/12/31")  # -> ['1999', '12', '31']
        """
        ParserElement._literalStringClass = cls

    def __init__( self, savelist=False ):
        self.parseAction = list()
        self.failAction = None
        #~ self.name = "<unknown>"  # don't define self.name, let subclasses try/except upcall
        self.strRepr = None
        self.resultsName = None
        self.saveAsList = savelist
        self.skipWhitespace = True
        self.whiteChars = ParserElement.DEFAULT_WHITE_CHARS
        self.copyDefaultWhiteChars = True
        self.mayReturnEmpty = False # used when checking for left-recursion
        self.keepTabs = False
        self.ignoreExprs = list()
        self.debug = False
        self.streamlined = False
        self.mayIndexError = True # used to optimize exception handling for subclasses that don't advance parse index
        self.errmsg = ""
        self.modalResults = True # used to mark results names as modal (report only last) or cumulative (list all)
        self.debugActions = ( None, None, None ) #custom debug actions
        self.re = None
        self.callPreparse = True # used to avoid redundant calls to preParse
        self.callDuringTry = False

    def copy( self ):
        """
        Make a copy of this C{ParserElement}.  Useful for defining different parse actions
        for the same parsing pattern, using copies of the original parse element.
        
        Example::
            integer = Word(nums).setParseAction(lambda toks: int(toks[0]))
            integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K")
            integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M")
            
            print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M"))
        prints::
            [5120, 100, 655360, 268435456]
        Equivalent form of C{expr.copy()} is just C{expr()}::
            integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M")
        """
        cpy = copy.copy( self )
        cpy.parseAction = self.parseAction[:]
        cpy.ignoreExprs = self.ignoreExprs[:]
        if self.copyDefaultWhiteChars:
            cpy.whiteChars = ParserElement.DEFAULT_WHITE_CHARS
        return cpy

    def setName( self, name ):
        """
        Define name for this expression, makes debugging and exception messages clearer.
        
        Example::
            Word(nums).parseString("ABC")  # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1)
            Word(nums).setName("integer").parseString("ABC")  # -> Exception: Expected integer (at char 0), (line:1, col:1)
        """
        self.name = name
        self.errmsg = "Expected " + self.name
        if hasattr(self,"exception"):
            self.exception.msg = self.errmsg
        return self

    def setResultsName( self, name, listAllMatches=False ):
        """
        Define name for referencing matching tokens as a nested attribute
        of the returned parse results.
        NOTE: this returns a *copy* of the original C{ParserElement} object;
        this is so that the client can define a basic element, such as an
        integer, and reference it in multiple places with different names.

        You can also set results names using the abbreviated syntax,
        C{expr("name")} in place of C{expr.setResultsName("name")} - 
        see L{I{__call__}<__call__>}.

        Example::
            date_str = (integer.setResultsName("year") + '/' 
                        + integer.setResultsName("month") + '/' 
                        + integer.setResultsName("day"))

            # equivalent form:
            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
        """
        newself = self.copy()
        if name.endswith("*"):
            name = name[:-1]
            listAllMatches=True
        newself.resultsName = name
        newself.modalResults = not listAllMatches
        return newself

    def setBreak(self,breakFlag = True):
        """Method to invoke the Python pdb debugger when this element is
           about to be parsed. Set C{breakFlag} to True to enable, False to
           disable.
        """
        if breakFlag:
            _parseMethod = self._parse
            def breaker(instring, loc, doActions=True, callPreParse=True):
                import pdb
                pdb.set_trace()
                return _parseMethod( instring, loc, doActions, callPreParse )
            breaker._originalParseMethod = _parseMethod
            self._parse = breaker
        else:
            if hasattr(self._parse,"_originalParseMethod"):
                self._parse = self._parse._originalParseMethod
        return self

    def setParseAction( self, *fns, **kwargs ):
        """
        Define action to perform when successfully matching parse element definition.
        Parse action fn is a callable method with 0-3 arguments, called as C{fn(s,loc,toks)},
        C{fn(loc,toks)}, C{fn(toks)}, or just C{fn()}, where:
         - s   = the original string being parsed (see note below)
         - loc = the location of the matching substring
         - toks = a list of the matched tokens, packaged as a C{L{ParseResults}} object
        If the functions in fns modify the tokens, they can return them as the return
        value from fn, and the modified list of tokens will replace the original.
        Otherwise, fn does not need to return any value.

        Optional keyword arguments:
         - callDuringTry = (default=C{False}) indicate if parse action should be run during lookaheads and alternate testing

        Note: the default parsing behavior is to expand tabs in the input string
        before starting the parsing process.  See L{I{parseString}<parseString>} for more information
        on parsing strings containing C{<TAB>}s, and suggested methods to maintain a
        consistent view of the parsed string, the parse location, and line and column
        positions within the parsed string.
        
        Example::
            integer = Word(nums)
            date_str = integer + '/' + integer + '/' + integer

            date_str.parseString("1999/12/31")  # -> ['1999', '/', '12', '/', '31']

            # use parse action to convert to ints at parse time
            integer = Word(nums).setParseAction(lambda toks: int(toks[0]))
            date_str = integer + '/' + integer + '/' + integer

            # note that integer fields are now ints, not strings
            date_str.parseString("1999/12/31")  # -> [1999, '/', 12, '/', 31]
        """
        self.parseAction = list(map(_trim_arity, list(fns)))
        self.callDuringTry = kwargs.get("callDuringTry", False)
        return self

    def addParseAction( self, *fns, **kwargs ):
        """
        Add parse action to expression's list of parse actions. See L{I{setParseAction}<setParseAction>}.
        
        See examples in L{I{copy}<copy>}.
        """
        self.parseAction += list(map(_trim_arity, list(fns)))
        self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False)
        return self

    def addCondition(self, *fns, **kwargs):
        """Add a boolean predicate function to expression's list of parse actions. See 
        L{I{setParseAction}<setParseAction>} for function call signatures. Unlike C{setParseAction}, 
        functions passed to C{addCondition} need to return boolean success/fail of the condition.

        Optional keyword arguments:
         - message = define a custom message to be used in the raised exception
         - fatal   = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException
         
        Example::
            integer = Word(nums).setParseAction(lambda toks: int(toks[0]))
            year_int = integer.copy()
            year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later")
            date_str = year_int + '/' + integer + '/' + integer

            result = date_str.parseString("1999/12/31")  # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1)
        """
        msg = kwargs.get("message", "failed user-defined condition")
        exc_type = ParseFatalException if kwargs.get("fatal", False) else ParseException
        for fn in fns:
            def pa(s,l,t):
                if not bool(_trim_arity(fn)(s,l,t)):
                    raise exc_type(s,l,msg)
            self.parseAction.append(pa)
        self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False)
        return self

    def setFailAction( self, fn ):
        """Define action to perform if parsing fails at this expression.
           Fail acton fn is a callable function that takes the arguments
           C{fn(s,loc,expr,err)} where:
            - s = string being parsed
            - loc = location where expression match was attempted and failed
            - expr = the parse expression that failed
            - err = the exception thrown
           The function returns no value.  It may throw C{L{ParseFatalException}}
           if it is desired to stop parsing immediately."""
        self.failAction = fn
        return self

    def _skipIgnorables( self, instring, loc ):
        exprsFound = True
        while exprsFound:
            exprsFound = False
            for e in self.ignoreExprs:
                try:
                    while 1:
                        loc,dummy = e._parse( instring, loc )
                        exprsFound = True
                except ParseException:
                    pass
        return loc

    def preParse( self, instring, loc ):
        if self.ignoreExprs:
            loc = self._skipIgnorables( instring, loc )

        if self.skipWhitespace:
            wt = self.whiteChars
            instrlen = len(instring)
            while loc < instrlen and instring[loc] in wt:
                loc += 1

        return loc

    def parseImpl( self, instring, loc, doActions=True ):
        return loc, []

    def postParse( self, instring, loc, tokenlist ):
        return tokenlist

    #~ @profile
    def _parseNoCache( self, instring, loc, doActions=True, callPreParse=True ):
        debugging = ( self.debug ) #and doActions )

        if debugging or self.failAction:
            #~ print ("Match",self,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) ))
            if (self.debugActions[0] ):
                self.debugActions[0]( instring, loc, self )
            if callPreParse and self.callPreparse:
                preloc = self.preParse( instring, loc )
            else:
                preloc = loc
            tokensStart = preloc
            try:
                try:
                    loc,tokens = self.parseImpl( instring, preloc, doActions )
                except IndexError:
                    raise ParseException( instring, len(instring), self.errmsg, self )
            except ParseBaseException as err:
                #~ print ("Exception raised:", err)
                if self.debugActions[2]:
                    self.debugActions[2]( instring, tokensStart, self, err )
                if self.failAction:
                    self.failAction( instring, tokensStart, self, err )
                raise
        else:
            if callPreParse and self.callPreparse:
                preloc = self.preParse( instring, loc )
            else:
                preloc = loc
            tokensStart = preloc
            if self.mayIndexError or loc >= len(instring):
                try:
                    loc,tokens = self.parseImpl( instring, preloc, doActions )
                except IndexError:
                    raise ParseException( instring, len(instring), self.errmsg, self )
            else:
                loc,tokens = self.parseImpl( instring, preloc, doActions )

        tokens = self.postParse( instring, loc, tokens )

        retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults )
        if self.parseAction and (doActions or self.callDuringTry):
            if debugging:
                try:
                    for fn in self.parseAction:
                        tokens = fn( instring, tokensStart, retTokens )
                        if tokens is not None:
                            retTokens = ParseResults( tokens,
                                                      self.resultsName,
                                                      asList=self.saveAsList and isinstance(tokens,(ParseResults,list)),
                                                      modal=self.modalResults )
                except ParseBaseException as err:
                    #~ print "Exception raised in user parse action:", err
                    if (self.debugActions[2] ):
                        self.debugActions[2]( instring, tokensStart, self, err )
                    raise
            else:
                for fn in self.parseAction:
                    tokens = fn( instring, tokensStart, retTokens )
                    if tokens is not None:
                        retTokens = ParseResults( tokens,
                                                  self.resultsName,
                                                  asList=self.saveAsList and isinstance(tokens,(ParseResults,list)),
                                                  modal=self.modalResults )

        if debugging:
            #~ print ("Matched",self,"->",retTokens.asList())
            if (self.debugActions[1] ):
                self.debugActions[1]( instring, tokensStart, loc, self, retTokens )

        return loc, retTokens

    def tryParse( self, instring, loc ):
        try:
            return self._parse( instring, loc, doActions=False )[0]
        except ParseFatalException:
            raise ParseException( instring, loc, self.errmsg, self)
    
    def canParseNext(self, instring, loc):
        try:
            self.tryParse(instring, loc)
        except (ParseException, IndexError):
            return False
        else:
            return True

    class _UnboundedCache(object):
        def __init__(self):
            cache = {}
            self.not_in_cache = not_in_cache = object()

            def get(self, key):
                return cache.get(key, not_in_cache)

            def set(self, key, value):
                cache[key] = value

            def clear(self):
                cache.clear()

            self.get = types.MethodType(get, self)
            self.set = types.MethodType(set, self)
            self.clear = types.MethodType(clear, self)

    if _OrderedDict is not None:
        class _FifoCache(object):
            def __init__(self, size):
                self.not_in_cache = not_in_cache = object()

                cache = _OrderedDict()

                def get(self, key):
                    return cache.get(key, not_in_cache)

                def set(self, key, value):
                    cache[key] = value
                    if len(cache) > size:
                        cache.popitem(False)

                def clear(self):
                    cache.clear()

                self.get = types.MethodType(get, self)
                self.set = types.MethodType(set, self)
                self.clear = types.MethodType(clear, self)

    else:
        class _FifoCache(object):
            def __init__(self, size):
                self.not_in_cache = not_in_cache = object()

                cache = {}
                key_fifo = collections.deque([], size)

                def get(self, key):
                    return cache.get(key, not_in_cache)

                def set(self, key, value):
                    cache[key] = value
                    if len(cache) > size:
                        cache.pop(key_fifo.popleft(), None)
                    key_fifo.append(key)

                def clear(self):
                    cache.clear()
                    key_fifo.clear()

                self.get = types.MethodType(get, self)
                self.set = types.MethodType(set, self)
                self.clear = types.MethodType(clear, self)

    # argument cache for optimizing repeated calls when backtracking through recursive expressions
    packrat_cache = {} # this is set later by enabledPackrat(); this is here so that resetCache() doesn't fail
    packrat_cache_lock = RLock()
    packrat_cache_stats = [0, 0]

    # this method gets repeatedly called during backtracking with the same arguments -
    # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression
    def _parseCache( self, instring, loc, doActions=True, callPreParse=True ):
        HIT, MISS = 0, 1
        lookup = (self, instring, loc, callPreParse, doActions)
        with ParserElement.packrat_cache_lock:
            cache = ParserElement.packrat_cache
            value = cache.get(lookup)
            if value is cache.not_in_cache:
                ParserElement.packrat_cache_stats[MISS] += 1
                try:
                    value = self._parseNoCache(instring, loc, doActions, callPreParse)
                except ParseBaseException as pe:
                    # cache a copy of the exception, without the traceback
                    cache.set(lookup, pe.__class__(*pe.args))
                    raise
                else:
                    cache.set(lookup, (value[0], value[1].copy()))
                    return value
            else:
                ParserElement.packrat_cache_stats[HIT] += 1
                if isinstance(value, Exception):
                    raise value
                return (value[0], value[1].copy())

    _parse = _parseNoCache

    @staticmethod
    def resetCache():
        ParserElement.packrat_cache.clear()
        ParserElement.packrat_cache_stats[:] = [0] * len(ParserElement.packrat_cache_stats)

    _packratEnabled = False
    @staticmethod
    def enablePackrat(cache_size_limit=128):
        """Enables "packrat" parsing, which adds memoizing to the parsing logic.
           Repeated parse attempts at the same string location (which happens
           often in many complex grammars) can immediately return a cached value,
           instead of re-executing parsing/validating code.  Memoizing is done of
           both valid results and parsing exceptions.
           
           Parameters:
            - cache_size_limit - (default=C{128}) - if an integer value is provided
              will limit the size of the packrat cache; if None is passed, then
              the cache size will be unbounded; if 0 is passed, the cache will
              be effectively disabled.
            
           This speedup may break existing programs that use parse actions that
           have side-effects.  For this reason, packrat parsing is disabled when
           you first import pyparsing.  To activate the packrat feature, your
           program must call the class method C{ParserElement.enablePackrat()}.  If
           your program uses C{psyco} to "compile as you go", you must call
           C{enablePackrat} before calling C{psyco.full()}.  If you do not do this,
           Python will crash.  For best results, call C{enablePackrat()} immediately
           after importing pyparsing.
           
           Example::
               import pyparsing
               pyparsing.ParserElement.enablePackrat()
        """
        if not ParserElement._packratEnabled:
            ParserElement._packratEnabled = True
            if cache_size_limit is None:
                ParserElement.packrat_cache = ParserElement._UnboundedCache()
            else:
                ParserElement.packrat_cache = ParserElement._FifoCache(cache_size_limit)
            ParserElement._parse = ParserElement._parseCache

    def parseString( self, instring, parseAll=False ):
        """
        Execute the parse expression with the given string.
        This is the main interface to the client code, once the complete
        expression has been built.

        If you want the grammar to require that the entire input string be
        successfully parsed, then set C{parseAll} to True (equivalent to ending
        the grammar with C{L{StringEnd()}}).

        Note: C{parseString} implicitly calls C{expandtabs()} on the input string,
        in order to report proper column numbers in parse actions.
        If the input string contains tabs and
        the grammar uses parse actions that use the C{loc} argument to index into the
        string being parsed, you can ensure you have a consistent view of the input
        string by:
         - calling C{parseWithTabs} on your grammar before calling C{parseString}
           (see L{I{parseWithTabs}<parseWithTabs>})
         - define your parse action using the full C{(s,loc,toks)} signature, and
           reference the input string using the parse action's C{s} argument
         - explictly expand the tabs in your input string before calling
           C{parseString}
        
        Example::
            Word('a').parseString('aaaaabaaa')  # -> ['aaaaa']
            Word('a').parseString('aaaaabaaa', parseAll=True)  # -> Exception: Expected end of text
        """
        ParserElement.resetCache()
        if not self.streamlined:
            self.streamline()
            #~ self.saveAsList = True
        for e in self.ignoreExprs:
            e.streamline()
        if not self.keepTabs:
            instring = instring.expandtabs()
        try:
            loc, tokens = self._parse( instring, 0 )
            if parseAll:
                loc = self.preParse( instring, loc )
                se = Empty() + StringEnd()
                se._parse( instring, loc )
        except ParseBaseException as exc:
            if ParserElement.verbose_stacktrace:
                raise
            else:
                # catch and re-raise exception from here, clears out pyparsing internal stack trace
                raise exc
        else:
            return tokens

    def scanString( self, instring, maxMatches=_MAX_INT, overlap=False ):
        """
        Scan the input string for expression matches.  Each match will return the
        matching tokens, start location, and end location.  May be called with optional
        C{maxMatches} argument, to clip scanning after 'n' matches are found.  If
        C{overlap} is specified, then overlapping matches will be reported.

        Note that the start and end locations are reported relative to the string
        being parsed.  See L{I{parseString}<parseString>} for more information on parsing
        strings with embedded tabs.

        Example::
            source = "sldjf123lsdjjkf345sldkjf879lkjsfd987"
            print(source)
            for tokens,start,end in Word(alphas).scanString(source):
                print(' '*start + '^'*(end-start))
                print(' '*start + tokens[0])
        
        prints::
        
            sldjf123lsdjjkf345sldkjf879lkjsfd987
            ^^^^^
            sldjf
                    ^^^^^^^
                    lsdjjkf
                              ^^^^^^
                              sldkjf
                                       ^^^^^^
                                       lkjsfd
        """
        if not self.streamlined:
            self.streamline()
        for e in self.ignoreExprs:
            e.streamline()

        if not self.keepTabs:
            instring = _ustr(instring).expandtabs()
        instrlen = len(instring)
        loc = 0
        preparseFn = self.preParse
        parseFn = self._parse
        ParserElement.resetCache()
        matches = 0
        try:
            while loc <= instrlen and matches < maxMatches:
                try:
                    preloc = preparseFn( instring, loc )
                    nextLoc,tokens = parseFn( instring, preloc, callPreParse=False )
                except ParseException:
                    loc = preloc+1
                else:
                    if nextLoc > loc:
                        matches += 1
                        yield tokens, preloc, nextLoc
                        if overlap:
                            nextloc = preparseFn( instring, loc )
                            if nextloc > loc:
                                loc = nextLoc
                            else:
                                loc += 1
                        else:
                            loc = nextLoc
                    else:
                        loc = preloc+1
        except ParseBaseException as exc:
            if ParserElement.verbose_stacktrace:
                raise
            else:
                # catch and re-raise exception from here, clears out pyparsing internal stack trace
                raise exc

    def transformString( self, instring ):
        """
        Extension to C{L{scanString}}, to modify matching text with modified tokens that may
        be returned from a parse action.  To use C{transformString}, define a grammar and
        attach a parse action to it that modifies the returned token list.
        Invoking C{transformString()} on a target string will then scan for matches,
        and replace the matched text patterns according to the logic in the parse
        action.  C{transformString()} returns the resulting transformed string.
        
        Example::
            wd = Word(alphas)
            wd.setParseAction(lambda toks: toks[0].title())
            
            print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york."))
        Prints::
            Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York.
        """
        out = []
        lastE = 0
        # force preservation of <TAB>s, to minimize unwanted transformation of string, and to
        # keep string locs straight between transformString and scanString
        self.keepTabs = True
        try:
            for t,s,e in self.scanString( instring ):
                out.append( instring[lastE:s] )
                if t:
                    if isinstance(t,ParseResults):
                        out += t.asList()
                    elif isinstance(t,list):
                        out += t
                    else:
                        out.append(t)
                lastE = e
            out.append(instring[lastE:])
            out = [o for o in out if o]
            return "".join(map(_ustr,_flatten(out)))
        except ParseBaseException as exc:
            if ParserElement.verbose_stacktrace:
                raise
            else:
                # catch and re-raise exception from here, clears out pyparsing internal stack trace
                raise exc

    def searchString( self, instring, maxMatches=_MAX_INT ):
        """
        Another extension to C{L{scanString}}, simplifying the access to the tokens found
        to match the given parse expression.  May be called with optional
        C{maxMatches} argument, to clip searching after 'n' matches are found.
        
        Example::
            # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters
            cap_word = Word(alphas.upper(), alphas.lower())
            
            print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity"))
        prints::
            ['More', 'Iron', 'Lead', 'Gold', 'I']
        """
        try:
            return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ])
        except ParseBaseException as exc:
            if ParserElement.verbose_stacktrace:
                raise
            else:
                # catch and re-raise exception from here, clears out pyparsing internal stack trace
                raise exc

    def split(self, instring, maxsplit=_MAX_INT, includeSeparators=False):
        """
        Generator method to split a string using the given expression as a separator.
        May be called with optional C{maxsplit} argument, to limit the number of splits;
        and the optional C{includeSeparators} argument (default=C{False}), if the separating
        matching text should be included in the split results.
        
        Example::        
            punc = oneOf(list(".,;:/-!?"))
            print(list(punc.split("This, this?, this sentence, is badly punctuated!")))
        prints::
            ['This', ' this', '', ' this sentence', ' is badly punctuated', '']
        """
        splits = 0
        last = 0
        for t,s,e in self.scanString(instring, maxMatches=maxsplit):
            yield instring[last:s]
            if includeSeparators:
                yield t[0]
            last = e
        yield instring[last:]

    def __add__(self, other ):
        """
        Implementation of + operator - returns C{L{And}}. Adding strings to a ParserElement
        converts them to L{Literal}s by default.
        
        Example::
            greet = Word(alphas) + "," + Word(alphas) + "!"
            hello = "Hello, World!"
            print (hello, "->", greet.parseString(hello))
        Prints::
            Hello, World! -> ['Hello', ',', 'World', '!']
        """
        if isinstance( other, basestring ):
            other = ParserElement._literalStringClass( other )
        if not isinstance( other, ParserElement ):
            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
                    SyntaxWarning, stacklevel=2)
            return None
        return And( [ self, other ] )

    def __radd__(self, other ):
        """
        Implementation of + operator when left operand is not a C{L{ParserElement}}
        """
        if isinstance( other, basestring ):
            other = ParserElement._literalStringClass( other )
        if not isinstance( other, ParserElement ):
            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
                    SyntaxWarning, stacklevel=2)
            return None
        return other + self

    def __sub__(self, other):
        """
        Implementation of - operator, returns C{L{And}} with error stop
        """
        if isinstance( other, basestring ):
            other = ParserElement._literalStringClass( other )
        if not isinstance( other, ParserElement ):
            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
                    SyntaxWarning, stacklevel=2)
            return None
        return And( [ self, And._ErrorStop(), other ] )

    def __rsub__(self, other ):
        """
        Implementation of - operator when left operand is not a C{L{ParserElement}}
        """
        if isinstance( other, basestring ):
            other = ParserElement._literalStringClass( other )
        if not isinstance( other, ParserElement ):
            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
                    SyntaxWarning, stacklevel=2)
            return None
        return other - self

    def __mul__(self,other):
        """
        Implementation of * operator, allows use of C{expr * 3} in place of
        C{expr + expr + expr}.  Expressions may also me multiplied by a 2-integer
        tuple, similar to C{{min,max}} multipliers in regular expressions.  Tuples
        may also include C{None} as in:
         - C{expr*(n,None)} or C{expr*(n,)} is equivalent
              to C{expr*n + L{ZeroOrMore}(expr)}
              (read as "at least n instances of C{expr}")
         - C{expr*(None,n)} is equivalent to C{expr*(0,n)}
              (read as "0 to n instances of C{expr}")
         - C{expr*(None,None)} is equivalent to C{L{ZeroOrMore}(expr)}
         - C{expr*(1,None)} is equivalent to C{L{OneOrMore}(expr)}

        Note that C{expr*(None,n)} does not raise an exception if
        more than n exprs exist in the input stream; that is,
        C{expr*(None,n)} does not enforce a maximum number of expr
        occurrences.  If this behavior is desired, then write
        C{expr*(None,n) + ~expr}
        """
        if isinstance(other,int):
            minElements, optElements = other,0
        elif isinstance(other,tuple):
            other = (other + (None, None))[:2]
            if other[0] is None:
                other = (0, other[1])
            if isinstance(other[0],int) and other[1] is None:
                if other[0] == 0:
                    return ZeroOrMore(self)
                if other[0] == 1:
                    return OneOrMore(self)
                else:
                    return self*other[0] + ZeroOrMore(self)
            elif isinstance(other[0],int) and isinstance(other[1],int):
                minElements, optElements = other
                optElements -= minElements
            else:
                raise TypeError("cannot multiply 'ParserElement' and ('%s','%s') objects", type(other[0]),type(other[1]))
        else:
            raise TypeError("cannot multiply 'ParserElement' and '%s' objects", type(other))

        if minElements < 0:
            raise ValueError("cannot multiply ParserElement by negative value")
        if optElements < 0:
            raise ValueError("second tuple value must be greater or equal to first tuple value")
        if minElements == optElements == 0:
            raise ValueError("cannot multiply ParserElement by 0 or (0,0)")

        if (optElements):
            def makeOptionalList(n):
                if n>1:
                    return Optional(self + makeOptionalList(n-1))
                else:
                    return Optional(self)
            if minElements:
                if minElements == 1:
                    ret = self + makeOptionalList(optElements)
                else:
                    ret = And([self]*minElements) + makeOptionalList(optElements)
            else:
                ret = makeOptionalList(optElements)
        else:
            if minElements == 1:
                ret = self
            else:
                ret = And([self]*minElements)
        return ret

    def __rmul__(self, other):
        return self.__mul__(other)

    def __or__(self, other ):
        """
        Implementation of | operator - returns C{L{MatchFirst}}
        """
        if isinstance( other, basestring ):
            other = ParserElement._literalStringClass( other )
        if not isinstance( other, ParserElement ):
            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
                    SyntaxWarning, stacklevel=2)
            return None
        return MatchFirst( [ self, other ] )

    def __ror__(self, other ):
        """
        Implementation of | operator when left operand is not a C{L{ParserElement}}
        """
        if isinstance( other, basestring ):
            other = ParserElement._literalStringClass( other )
        if not isinstance( other, ParserElement ):
            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
                    SyntaxWarning, stacklevel=2)
            return None
        return other | self

    def __xor__(self, other ):
        """
        Implementation of ^ operator - returns C{L{Or}}
        """
        if isinstance( other, basestring ):
            other = ParserElement._literalStringClass( other )
        if not isinstance( other, ParserElement ):
            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
                    SyntaxWarning, stacklevel=2)
            return None
        return Or( [ self, other ] )

    def __rxor__(self, other ):
        """
        Implementation of ^ operator when left operand is not a C{L{ParserElement}}
        """
        if isinstance( other, basestring ):
            other = ParserElement._literalStringClass( other )
        if not isinstance( other, ParserElement ):
            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
                    SyntaxWarning, stacklevel=2)
            return None
        return other ^ self

    def __and__(self, other ):
        """
        Implementation of & operator - returns C{L{Each}}
        """
        if isinstance( other, basestring ):
            other = ParserElement._literalStringClass( other )
        if not isinstance( other, ParserElement ):
            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
                    SyntaxWarning, stacklevel=2)
            return None
        return Each( [ self, other ] )

    def __rand__(self, other ):
        """
        Implementation of & operator when left operand is not a C{L{ParserElement}}
        """
        if isinstance( other, basestring ):
            other = ParserElement._literalStringClass( other )
        if not isinstance( other, ParserElement ):
            warnings.warn("Cannot combine element of type %s with ParserElement" % type(other),
                    SyntaxWarning, stacklevel=2)
            return None
        return other & self

    def __invert__( self ):
        """
        Implementation of ~ operator - returns C{L{NotAny}}
        """
        return NotAny( self )

    def __call__(self, name=None):
        """
        Shortcut for C{L{setResultsName}}, with C{listAllMatches=False}.
        
        If C{name} is given with a trailing C{'*'} character, then C{listAllMatches} will be
        passed as C{True}.
           
        If C{name} is omitted, same as calling C{L{copy}}.

        Example::
            # these are equivalent
            userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno")
            userdata = Word(alphas)("name") + Word(nums+"-")("socsecno")             
        """
        if name is not None:
            return self.setResultsName(name)
        else:
            return self.copy()

    def suppress( self ):
        """
        Suppresses the output of this C{ParserElement}; useful to keep punctuation from
        cluttering up returned output.
        """
        return Suppress( self )

    def leaveWhitespace( self ):
        """
        Disables the skipping of whitespace before matching the characters in the
        C{ParserElement}'s defined pattern.  This is normally only used internally by
        the pyparsing module, but may be needed in some whitespace-sensitive grammars.
        """
        self.skipWhitespace = False
        return self

    def setWhitespaceChars( self, chars ):
        """
        Overrides the default whitespace chars
        """
        self.skipWhitespace = True
        self.whiteChars = chars
        self.copyDefaultWhiteChars = False
        return self

    def parseWithTabs( self ):
        """
        Overrides default behavior to expand C{<TAB>}s to spaces before parsing the input string.
        Must be called before C{parseString} when the input grammar contains elements that
        match C{<TAB>} characters.
        """
        self.keepTabs = True
        return self

    def ignore( self, other ):
        """
        Define expression to be ignored (e.g., comments) while doing pattern
        matching; may be called repeatedly, to define multiple comment or other
        ignorable patterns.
        
        Example::
            patt = OneOrMore(Word(alphas))
            patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj']
            
            patt.ignore(cStyleComment)
            patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd']
        """
        if isinstance(other, basestring):
            other = Suppress(other)

        if isinstance( other, Suppress ):
            if other not in self.ignoreExprs:
                self.ignoreExprs.append(other)
        else:
            self.ignoreExprs.append( Suppress( other.copy() ) )
        return self

    def setDebugActions( self, startAction, successAction, exceptionAction ):
        """
        Enable display of debugging messages while doing pattern matching.
        """
        self.debugActions = (startAction or _defaultStartDebugAction,
                             successAction or _defaultSuccessDebugAction,
                             exceptionAction or _defaultExceptionDebugAction)
        self.debug = True
        return self

    def setDebug( self, flag=True ):
        """
        Enable display of debugging messages while doing pattern matching.
        Set C{flag} to True to enable, False to disable.

        Example::
            wd = Word(alphas).setName("alphaword")
            integer = Word(nums).setName("numword")
            term = wd | integer
            
            # turn on debugging for wd
            wd.setDebug()

            OneOrMore(term).parseString("abc 123 xyz 890")
        
        prints::
            Match alphaword at loc 0(1,1)
            Matched alphaword -> ['abc']
            Match alphaword at loc 3(1,4)
            Exception raised:Expected alphaword (at char 4), (line:1, col:5)
            Match alphaword at loc 7(1,8)
            Matched alphaword -> ['xyz']
            Match alphaword at loc 11(1,12)
            Exception raised:Expected alphaword (at char 12), (line:1, col:13)
            Match alphaword at loc 15(1,16)
            Exception raised:Expected alphaword (at char 15), (line:1, col:16)

        The output shown is that produced by the default debug actions - custom debug actions can be
        specified using L{setDebugActions}. Prior to attempting
        to match the C{wd} expression, the debugging message C{"Match <exprname> at loc <n>(<line>,<col>)"}
        is shown. Then if the parse succeeds, a C{"Matched"} message is shown, or an C{"Exception raised"}
        message is shown. Also note the use of L{setName} to assign a human-readable name to the expression,
        which makes debugging and exception messages easier to understand - for instance, the default
        name created for the C{Word} expression without calling C{setName} is C{"W:(ABCD...)"}.
        """
        if flag:
            self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction )
        else:
            self.debug = False
        return self

    def __str__( self ):
        return self.name

    def __repr__( self ):
        return _ustr(self)

    def streamline( self ):
        self.streamlined = True
        self.strRepr = None
        return self

    def checkRecursion( self, parseElementList ):
        pass

    def validate( self, validateTrace=[] ):
        """
        Check defined expressions for valid structure, check for infinite recursive definitions.
        """
        self.checkRecursion( [] )

    def parseFile( self, file_or_filename, parseAll=False ):
        """
        Execute the parse expression on the given file or filename.
        If a filename is specified (instead of a file object),
        the entire file is opened, read, and closed before parsing.
        """
        try:
            file_contents = file_or_filename.read()
        except AttributeError:
            with open(file_or_filename, "r") as f:
                file_contents = f.read()
        try:
            return self.parseString(file_contents, parseAll)
        except ParseBaseException as exc:
            if ParserElement.verbose_stacktrace:
                raise
            else:
                # catch and re-raise exception from here, clears out pyparsing internal stack trace
                raise exc

    def __eq__(self,other):
        if isinstance(other, ParserElement):
            return self is other or vars(self) == vars(other)
        elif isinstance(other, basestring):
            return self.matches(other)
        else:
            return super(ParserElement,self)==other

    def __ne__(self,other):
        return not (self == other)

    def __hash__(self):
        return hash(id(self))

    def __req__(self,other):
        return self == other

    def __rne__(self,other):
        return not (self == other)

    def matches(self, testString, parseAll=True):
        """
        Method for quick testing of a parser against a test string. Good for simple 
        inline microtests of sub expressions while building up larger parser.
           
        Parameters:
         - testString - to test against this expression for a match
         - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests
            
        Example::
            expr = Word(nums)
            assert expr.matches("100")
        """
        try:
            self.parseString(_ustr(testString), parseAll=parseAll)
            return True
        except ParseBaseException:
            return False
                
    def runTests(self, tests, parseAll=True, comment='#', fullDump=True, printResults=True, failureTests=False):
        """
        Execute the parse expression on a series of test strings, showing each
        test, the parsed results or where the parse failed. Quick and easy way to
        run a parse expression against a list of sample strings.
           
        Parameters:
         - tests - a list of separate test strings, or a multiline string of test strings
         - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests           
         - comment - (default=C{'#'}) - expression for indicating embedded comments in the test 
              string; pass None to disable comment filtering
         - fullDump - (default=C{True}) - dump results as list followed by results names in nested outline;
              if False, only dump nested list
         - printResults - (default=C{True}) prints test output to stdout
         - failureTests - (default=C{False}) indicates if these tests are expected to fail parsing

        Returns: a (success, results) tuple, where success indicates that all tests succeeded
        (or failed if C{failureTests} is True), and the results contain a list of lines of each 
        test's output
        
        Example::
            number_expr = pyparsing_common.number.copy()

            result = number_expr.runTests('''
                # unsigned integer
                100
                # negative integer
                -100
                # float with scientific notation
                6.02e23
                # integer with scientific notation
                1e-12
                ''')
            print("Success" if result[0] else "Failed!")

            result = number_expr.runTests('''
                # stray character
                100Z
                # missing leading digit before '.'
                -.100
                # too many '.'
                3.14.159
                ''', failureTests=True)
            print("Success" if result[0] else "Failed!")
        prints::
            # unsigned integer
            100
            [100]

            # negative integer
            -100
            [-100]

            # float with scientific notation
            6.02e23
            [6.02e+23]

            # integer with scientific notation
            1e-12
            [1e-12]

            Success
            
            # stray character
            100Z
               ^
            FAIL: Expected end of text (at char 3), (line:1, col:4)

            # missing leading digit before '.'
            -.100
            ^
            FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1)

            # too many '.'
            3.14.159
                ^
            FAIL: Expected end of text (at char 4), (line:1, col:5)

            Success

        Each test string must be on a single line. If you want to test a string that spans multiple
        lines, create a test like this::

            expr.runTest(r"this is a test\\n of strings that spans \\n 3 lines")
        
        (Note that this is a raw string literal, you must include the leading 'r'.)
        """
        if isinstance(tests, basestring):
            tests = list(map(str.strip, tests.rstrip().splitlines()))
        if isinstance(comment, basestring):
            comment = Literal(comment)
        allResults = []
        comments = []
        success = True
        for t in tests:
            if comment is not None and comment.matches(t, False) or comments and not t:
                comments.append(t)
                continue
            if not t:
                continue
            out = ['\n'.join(comments), t]
            comments = []
            try:
                t = t.replace(r'\n','\n')
                result = self.parseString(t, parseAll=parseAll)
                out.append(result.dump(full=fullDump))
                success = success and not failureTests
            except ParseBaseException as pe:
                fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else ""
                if '\n' in t:
                    out.append(line(pe.loc, t))
                    out.append(' '*(col(pe.loc,t)-1) + '^' + fatal)
                else:
                    out.append(' '*pe.loc + '^' + fatal)
                out.append("FAIL: " + str(pe))
                success = success and failureTests
                result = pe
            except Exception as exc:
                out.append("FAIL-EXCEPTION: " + str(exc))
                success = success and failureTests
                result = exc

            if printResults:
                if fullDump:
                    out.append('')
                print('\n'.join(out))

            allResults.append((t, result))
        
        return success, allResults

        
class Token(ParserElement):
    """
    Abstract C{ParserElement} subclass, for defining atomic matching patterns.
    """
    def __init__( self ):
        super(Token,self).__init__( savelist=False )


class Empty(Token):
    """
    An empty token, will always match.
    """
    def __init__( self ):
        super(Empty,self).__init__()
        self.name = "Empty"
        self.mayReturnEmpty = True
        self.mayIndexError = False


class NoMatch(Token):
    """
    A token that will never match.
    """
    def __init__( self ):
        super(NoMatch,self).__init__()
        self.name = "NoMatch"
        self.mayReturnEmpty = True
        self.mayIndexError = False
        self.errmsg = "Unmatchable token"

    def parseImpl( self, instring, loc, doActions=True ):
        raise ParseException(instring, loc, self.errmsg, self)


class Literal(Token):
    """
    Token to exactly match a specified string.
    
    Example::
        Literal('blah').parseString('blah')  # -> ['blah']
        Literal('blah').parseString('blahfooblah')  # -> ['blah']
        Literal('blah').parseString('bla')  # -> Exception: Expected "blah"
    
    For case-insensitive matching, use L{CaselessLiteral}.
    
    For keyword matching (force word break before and after the matched string),
    use L{Keyword} or L{CaselessKeyword}.
    """
    def __init__( self, matchString ):
        super(Literal,self).__init__()
        self.match = matchString
        self.matchLen = len(matchString)
        try:
            self.firstMatchChar = matchString[0]
        except IndexError:
            warnings.warn("null string passed to Literal; use Empty() instead",
                            SyntaxWarning, stacklevel=2)
            self.__class__ = Empty
        self.name = '"%s"' % _ustr(self.match)
        self.errmsg = "Expected " + self.name
        self.mayReturnEmpty = False
        self.mayIndexError = False

    # Performance tuning: this routine gets called a *lot*
    # if this is a single character match string  and the first character matches,
    # short-circuit as quickly as possible, and avoid calling startswith
    #~ @profile
    def parseImpl( self, instring, loc, doActions=True ):
        if (instring[loc] == self.firstMatchChar and
            (self.matchLen==1 or instring.startswith(self.match,loc)) ):
            return loc+self.matchLen, self.match
        raise ParseException(instring, loc, self.errmsg, self)
_L = Literal
ParserElement._literalStringClass = Literal

class Keyword(Token):
    """
    Token to exactly match a specified string as a keyword, that is, it must be
    immediately followed by a non-keyword character.  Compare with C{L{Literal}}:
     - C{Literal("if")} will match the leading C{'if'} in C{'ifAndOnlyIf'}.
     - C{Keyword("if")} will not; it will only match the leading C{'if'} in C{'if x=1'}, or C{'if(y==2)'}
    Accepts two optional constructor arguments in addition to the keyword string:
     - C{identChars} is a string of characters that would be valid identifier characters,
          defaulting to all alphanumerics + "_" and "$"
     - C{caseless} allows case-insensitive matching, default is C{False}.
       
    Example::
        Keyword("start").parseString("start")  # -> ['start']
        Keyword("start").parseString("starting")  # -> Exception

    For case-insensitive matching, use L{CaselessKeyword}.
    """
    DEFAULT_KEYWORD_CHARS = alphanums+"_$"

    def __init__( self, matchString, identChars=None, caseless=False ):
        super(Keyword,self).__init__()
        if identChars is None:
            identChars = Keyword.DEFAULT_KEYWORD_CHARS
        self.match = matchString
        self.matchLen = len(matchString)
        try:
            self.firstMatchChar = matchString[0]
        except IndexError:
            warnings.warn("null string passed to Keyword; use Empty() instead",
                            SyntaxWarning, stacklevel=2)
        self.name = '"%s"' % self.match
        self.errmsg = "Expected " + self.name
        self.mayReturnEmpty = False
        self.mayIndexError = False
        self.caseless = caseless
        if caseless:
            self.caselessmatch = matchString.upper()
            identChars = identChars.upper()
        self.identChars = set(identChars)

    def parseImpl( self, instring, loc, doActions=True ):
        if self.caseless:
            if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and
                 (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) and
                 (loc == 0 or instring[loc-1].upper() not in self.identChars) ):
                return loc+self.matchLen, self.match
        else:
            if (instring[loc] == self.firstMatchChar and
                (self.matchLen==1 or instring.startswith(self.match,loc)) and
                (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen] not in self.identChars) and
                (loc == 0 or instring[loc-1] not in self.identChars) ):
                return loc+self.matchLen, self.match
        raise ParseException(instring, loc, self.errmsg, self)

    def copy(self):
        c = super(Keyword,self).copy()
        c.identChars = Keyword.DEFAULT_KEYWORD_CHARS
        return c

    @staticmethod
    def setDefaultKeywordChars( chars ):
        """Overrides the default Keyword chars
        """
        Keyword.DEFAULT_KEYWORD_CHARS = chars

class CaselessLiteral(Literal):
    """
    Token to match a specified string, ignoring case of letters.
    Note: the matched results will always be in the case of the given
    match string, NOT the case of the input text.

    Example::
        OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD']
        
    (Contrast with example for L{CaselessKeyword}.)
    """
    def __init__( self, matchString ):
        super(CaselessLiteral,self).__init__( matchString.upper() )
        # Preserve the defining literal.
        self.returnString = matchString
        self.name = "'%s'" % self.returnString
        self.errmsg = "Expected " + self.name

    def parseImpl( self, instring, loc, doActions=True ):
        if instring[ loc:loc+self.matchLen ].upper() == self.match:
            return loc+self.matchLen, self.returnString
        raise ParseException(instring, loc, self.errmsg, self)

class CaselessKeyword(Keyword):
    """
    Caseless version of L{Keyword}.

    Example::
        OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD']
        
    (Contrast with example for L{CaselessLiteral}.)
    """
    def __init__( self, matchString, identChars=None ):
        super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True )

    def parseImpl( self, instring, loc, doActions=True ):
        if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and
             (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) ):
            return loc+self.matchLen, self.match
        raise ParseException(instring, loc, self.errmsg, self)

class CloseMatch(Token):
    """
    A variation on L{Literal} which matches "close" matches, that is, 
    strings with at most 'n' mismatching characters. C{CloseMatch} takes parameters:
     - C{match_string} - string to be matched
     - C{maxMismatches} - (C{default=1}) maximum number of mismatches allowed to count as a match
    
    The results from a successful parse will contain the matched text from the input string and the following named results:
     - C{mismatches} - a list of the positions within the match_string where mismatches were found
     - C{original} - the original match_string used to compare against the input string
    
    If C{mismatches} is an empty list, then the match was an exact match.
    
    Example::
        patt = CloseMatch("ATCATCGAATGGA")
        patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']})
        patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1)

        # exact match
        patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']})

        # close match allowing up to 2 mismatches
        patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2)
        patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']})
    """
    def __init__(self, match_string, maxMismatches=1):
        super(CloseMatch,self).__init__()
        self.name = match_string
        self.match_string = match_string
        self.maxMismatches = maxMismatches
        self.errmsg = "Expected %r (with up to %d mismatches)" % (self.match_string, self.maxMismatches)
        self.mayIndexError = False
        self.mayReturnEmpty = False

    def parseImpl( self, instring, loc, doActions=True ):
        start = loc
        instrlen = len(instring)
        maxloc = start + len(self.match_string)

        if maxloc <= instrlen:
            match_string = self.match_string
            match_stringloc = 0
            mismatches = []
            maxMismatches = self.maxMismatches

            for match_stringloc,s_m in enumerate(zip(instring[loc:maxloc], self.match_string)):
                src,mat = s_m
                if src != mat:
                    mismatches.append(match_stringloc)
                    if len(mismatches) > maxMismatches:
                        break
            else:
                loc = match_stringloc + 1
                results = ParseResults([instring[start:loc]])
                results['original'] = self.match_string
                results['mismatches'] = mismatches
                return loc, results

        raise ParseException(instring, loc, self.errmsg, self)


class Word(Token):
    """
    Token for matching words composed of allowed character sets.
    Defined with string containing all allowed initial characters,
    an optional string containing allowed body characters (if omitted,
    defaults to the initial character set), and an optional minimum,
    maximum, and/or exact length.  The default value for C{min} is 1 (a
    minimum value < 1 is not valid); the default values for C{max} and C{exact}
    are 0, meaning no maximum or exact length restriction. An optional
    C{excludeChars} parameter can list characters that might be found in 
    the input C{bodyChars} string; useful to define a word of all printables
    except for one or two characters, for instance.
    
    L{srange} is useful for defining custom character set strings for defining 
    C{Word} expressions, using range notation from regular expression character sets.
    
    A common mistake is to use C{Word} to match a specific literal string, as in 
    C{Word("Address")}. Remember that C{Word} uses the string argument to define
    I{sets} of matchable characters. This expression would match "Add", "AAA",
    "dAred", or any other word made up of the characters 'A', 'd', 'r', 'e', and 's'.
    To match an exact literal string, use L{Literal} or L{Keyword}.

    pyparsing includes helper strings for building Words:
     - L{alphas}
     - L{nums}
     - L{alphanums}
     - L{hexnums}
     - L{alphas8bit} (alphabetic characters in ASCII range 128-255 - accented, tilded, umlauted, etc.)
     - L{punc8bit} (non-alphabetic characters in ASCII range 128-255 - currency, symbols, superscripts, diacriticals, etc.)
     - L{printables} (any non-whitespace character)

    Example::
        # a word composed of digits
        integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9"))
        
        # a word with a leading capital, and zero or more lowercase
        capital_word = Word(alphas.upper(), alphas.lower())

        # hostnames are alphanumeric, with leading alpha, and '-'
        hostname = Word(alphas, alphanums+'-')
        
        # roman numeral (not a strict parser, accepts invalid mix of characters)
        roman = Word("IVXLCDM")
        
        # any string of non-whitespace characters, except for ','
        csv_value = Word(printables, excludeChars=",")
    """
    def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None ):
        super(Word,self).__init__()
        if excludeChars:
            initChars = ''.join(c for c in initChars if c not in excludeChars)
            if bodyChars:
                bodyChars = ''.join(c for c in bodyChars if c not in excludeChars)
        self.initCharsOrig = initChars
        self.initChars = set(initChars)
        if bodyChars :
            self.bodyCharsOrig = bodyChars
            self.bodyChars = set(bodyChars)
        else:
            self.bodyCharsOrig = initChars
            self.bodyChars = set(initChars)

        self.maxSpecified = max > 0

        if min < 1:
            raise ValueError("cannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitted")

        self.minLen = min

        if max > 0:
            self.maxLen = max
        else:
            self.maxLen = _MAX_INT

        if exact > 0:
            self.maxLen = exact
            self.minLen = exact

        self.name = _ustr(self)
        self.errmsg = "Expected " + self.name
        self.mayIndexError = False
        self.asKeyword = asKeyword

        if ' ' not in self.initCharsOrig+self.bodyCharsOrig and (min==1 and max==0 and exact==0):
            if self.bodyCharsOrig == self.initCharsOrig:
                self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig)
            elif len(self.initCharsOrig) == 1:
                self.reString = "%s[%s]*" % \
                                      (re.escape(self.initCharsOrig),
                                      _escapeRegexRangeChars(self.bodyCharsOrig),)
            else:
                self.reString = "[%s][%s]*" % \
                                      (_escapeRegexRangeChars(self.initCharsOrig),
                                      _escapeRegexRangeChars(self.bodyCharsOrig),)
            if self.asKeyword:
                self.reString = r"\b"+self.reString+r"\b"
            try:
                self.re = re.compile( self.reString )
            except Exception:
                self.re = None

    def parseImpl( self, instring, loc, doActions=True ):
        if self.re:
            result = self.re.match(instring,loc)
            if not result:
                raise ParseException(instring, loc, self.errmsg, self)

            loc = result.end()
            return loc, result.group()

        if not(instring[ loc ] in self.initChars):
            raise ParseException(instring, loc, self.errmsg, self)

        start = loc
        loc += 1
        instrlen = len(instring)
        bodychars = self.bodyChars
        maxloc = start + self.maxLen
        maxloc = min( maxloc, instrlen )
        while loc < maxloc and instring[loc] in bodychars:
            loc += 1

        throwException = False
        if loc - start < self.minLen:
            throwException = True
        if self.maxSpecified and loc < instrlen and instring[loc] in bodychars:
            throwException = True
        if self.asKeyword:
            if (start>0 and instring[start-1] in bodychars) or (loc<instrlen and instring[loc] in bodychars):
                throwException = True

        if throwException:
            raise ParseException(instring, loc, self.errmsg, self)

        return loc, instring[start:loc]

    def __str__( self ):
        try:
            return super(Word,self).__str__()
        except Exception:
            pass


        if self.strRepr is None:

            def charsAsStr(s):
                if len(s)>4:
                    return s[:4]+"..."
                else:
                    return s

            if ( self.initCharsOrig != self.bodyCharsOrig ):
                self.strRepr = "W:(%s,%s)" % ( charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig) )
            else:
                self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig)

        return self.strRepr


class Regex(Token):
    """
    Token for matching strings that match a given regular expression.
    Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module.
    If the given regex contains named groups (defined using C{(?P<name>...)}), these will be preserved as 
    named parse results.

    Example::
        realnum = Regex(r"[+-]?\d+\.\d*")
        date = Regex(r'(?P<year>\d{4})-(?P<month>\d\d?)-(?P<day>\d\d?)')
        # ref: http://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression
        roman = Regex(r"M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})")
    """
    compiledREtype = type(re.compile("[A-Z]"))
    def __init__( self, pattern, flags=0):
        """The parameters C{pattern} and C{flags} are passed to the C{re.compile()} function as-is. See the Python C{re} module for an explanation of the acceptable patterns and flags."""
        super(Regex,self).__init__()

        if isinstance(pattern, basestring):
            if not pattern:
                warnings.warn("null string passed to Regex; use Empty() instead",
                        SyntaxWarning, stacklevel=2)

            self.pattern = pattern
            self.flags = flags

            try:
                self.re = re.compile(self.pattern, self.flags)
                self.reString = self.pattern
            except sre_constants.error:
                warnings.warn("invalid pattern (%s) passed to Regex" % pattern,
                    SyntaxWarning, stacklevel=2)
                raise

        elif isinstance(pattern, Regex.compiledREtype):
            self.re = pattern
            self.pattern = \
            self.reString = str(pattern)
            self.flags = flags
            
        else:
            raise ValueError("Regex may only be constructed with a string or a compiled RE object")

        self.name = _ustr(self)
        self.errmsg = "Expected " + self.name
        self.mayIndexError = False
        self.mayReturnEmpty = True

    def parseImpl( self, instring, loc, doActions=True ):
        result = self.re.match(instring,loc)
        if not result:
            raise ParseException(instring, loc, self.errmsg, self)

        loc = result.end()
        d = result.groupdict()
        ret = ParseResults(result.group())
        if d:
            for k in d:
                ret[k] = d[k]
        return loc,ret

    def __str__( self ):
        try:
            return super(Regex,self).__str__()
        except Exception:
            pass

        if self.strRepr is None:
            self.strRepr = "Re:(%s)" % repr(self.pattern)

        return self.strRepr


class QuotedString(Token):
    r"""
    Token for matching strings that are delimited by quoting characters.
    
    Defined with the following parameters:
        - quoteChar - string of one or more characters defining the quote delimiting string
        - escChar - character to escape quotes, typically backslash (default=C{None})
        - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=C{None})
        - multiline - boolean indicating whether quotes can span multiple lines (default=C{False})
        - unquoteResults - boolean indicating whether the matched text should be unquoted (default=C{True})
        - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=C{None} => same as quoteChar)
        - convertWhitespaceEscapes - convert escaped whitespace (C{'\t'}, C{'\n'}, etc.) to actual whitespace (default=C{True})

    Example::
        qs = QuotedString('"')
        print(qs.searchString('lsjdf "This is the quote" sldjf'))
        complex_qs = QuotedString('{{', endQuoteChar='}}')
        print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf'))
        sql_qs = QuotedString('"', escQuote='""')
        print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf'))
    prints::
        [['This is the quote']]
        [['This is the "quote"']]
        [['This is the quote with "embedded" quotes']]
    """
    def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None, convertWhitespaceEscapes=True):
        super(QuotedString,self).__init__()

        # remove white space from quote chars - wont work anyway
        quoteChar = quoteChar.strip()
        if not quoteChar:
            warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2)
            raise SyntaxError()

        if endQuoteChar is None:
            endQuoteChar = quoteChar
        else:
            endQuoteChar = endQuoteChar.strip()
            if not endQuoteChar:
                warnings.warn("endQuoteChar cannot be the empty string",SyntaxWarning,stacklevel=2)
                raise SyntaxError()

        self.quoteChar = quoteChar
        self.quoteCharLen = len(quoteChar)
        self.firstQuoteChar = quoteChar[0]
        self.endQuoteChar = endQuoteChar
        self.endQuoteCharLen = len(endQuoteChar)
        self.escChar = escChar
        self.escQuote = escQuote
        self.unquoteResults = unquoteResults
        self.convertWhitespaceEscapes = convertWhitespaceEscapes

        if multiline:
            self.flags = re.MULTILINE | re.DOTALL
            self.pattern = r'%s(?:[^%s%s]' % \
                ( re.escape(self.quoteChar),
                  _escapeRegexRangeChars(self.endQuoteChar[0]),
                  (escChar is not None and _escapeRegexRangeChars(escChar) or '') )
        else:
            self.flags = 0
            self.pattern = r'%s(?:[^%s\n\r%s]' % \
                ( re.escape(self.quoteChar),
                  _escapeRegexRangeChars(self.endQuoteChar[0]),
                  (escChar is not None and _escapeRegexRangeChars(escChar) or '') )
        if len(self.endQuoteChar) > 1:
            self.pattern += (
                '|(?:' + ')|(?:'.join("%s[^%s]" % (re.escape(self.endQuoteChar[:i]),
                                               _escapeRegexRangeChars(self.endQuoteChar[i]))
                                    for i in range(len(self.endQuoteChar)-1,0,-1)) + ')'
                )
        if escQuote:
            self.pattern += (r'|(?:%s)' % re.escape(escQuote))
        if escChar:
            self.pattern += (r'|(?:%s.)' % re.escape(escChar))
            self.escCharReplacePattern = re.escape(self.escChar)+"(.)"
        self.pattern += (r')*%s' % re.escape(self.endQuoteChar))

        try:
            self.re = re.compile(self.pattern, self.flags)
            self.reString = self.pattern
        except sre_constants.error:
            warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern,
                SyntaxWarning, stacklevel=2)
            raise

        self.name = _ustr(self)
        self.errmsg = "Expected " + self.name
        self.mayIndexError = False
        self.mayReturnEmpty = True

    def parseImpl( self, instring, loc, doActions=True ):
        result = instring[loc] == self.firstQuoteChar and self.re.match(instring,loc) or None
        if not result:
            raise ParseException(instring, loc, self.errmsg, self)

        loc = result.end()
        ret = result.group()

        if self.unquoteResults:

            # strip off quotes
            ret = ret[self.quoteCharLen:-self.endQuoteCharLen]

            if isinstance(ret,basestring):
                # replace escaped whitespace
                if '\\' in ret and self.convertWhitespaceEscapes:
                    ws_map = {
                        r'\t' : '\t',
                        r'\n' : '\n',
                        r'\f' : '\f',
                        r'\r' : '\r',
                    }
                    for wslit,wschar in ws_map.items():
                        ret = ret.replace(wslit, wschar)

                # replace escaped characters
                if self.escChar:
                    ret = re.sub(self.escCharReplacePattern,"\g<1>",ret)

                # replace escaped quotes
                if self.escQuote:
                    ret = ret.replace(self.escQuote, self.endQuoteChar)

        return loc, ret

    def __str__( self ):
        try:
            return super(QuotedString,self).__str__()
        except Exception:
            pass

        if self.strRepr is None:
            self.strRepr = "quoted string, starting with %s ending with %s" % (self.quoteChar, self.endQuoteChar)

        return self.strRepr


class CharsNotIn(Token):
    """
    Token for matching words composed of characters I{not} in a given set (will
    include whitespace in matched characters if not listed in the provided exclusion set - see example).
    Defined with string containing all disallowed characters, and an optional
    minimum, maximum, and/or exact length.  The default value for C{min} is 1 (a
    minimum value < 1 is not valid); the default values for C{max} and C{exact}
    are 0, meaning no maximum or exact length restriction.

    Example::
        # define a comma-separated-value as anything that is not a ','
        csv_value = CharsNotIn(',')
        print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213"))
    prints::
        ['dkls', 'lsdkjf', 's12 34', '@!#', '213']
    """
    def __init__( self, notChars, min=1, max=0, exact=0 ):
        super(CharsNotIn,self).__init__()
        self.skipWhitespace = False
        self.notChars = notChars

        if min < 1:
            raise ValueError("cannot specify a minimum length < 1; use Optional(CharsNotIn()) if zero-length char group is permitted")

        self.minLen = min

        if max > 0:
            self.maxLen = max
        else:
            self.maxLen = _MAX_INT

        if exact > 0:
            self.maxLen = exact
            self.minLen = exact

        self.name = _ustr(self)
        self.errmsg = "Expected " + self.name
        self.mayReturnEmpty = ( self.minLen == 0 )
        self.mayIndexError = False

    def parseImpl( self, instring, loc, doActions=True ):
        if instring[loc] in self.notChars:
            raise ParseException(instring, loc, self.errmsg, self)

        start = loc
        loc += 1
        notchars = self.notChars
        maxlen = min( start+self.maxLen, len(instring) )
        while loc < maxlen and \
              (instring[loc] not in notchars):
            loc += 1

        if loc - start < self.minLen:
            raise ParseException(instring, loc, self.errmsg, self)

        return loc, instring[start:loc]

    def __str__( self ):
        try:
            return super(CharsNotIn, self).__str__()
        except Exception:
            pass

        if self.strRepr is None:
            if len(self.notChars) > 4:
                self.strRepr = "!W:(%s...)" % self.notChars[:4]
            else:
                self.strRepr = "!W:(%s)" % self.notChars

        return self.strRepr

class White(Token):
    """
    Special matching class for matching whitespace.  Normally, whitespace is ignored
    by pyparsing grammars.  This class is included when some whitespace structures
    are significant.  Define with a string containing the whitespace characters to be
    matched; default is C{" \\t\\r\\n"}.  Also takes optional C{min}, C{max}, and C{exact} arguments,
    as defined for the C{L{Word}} class.
    """
    whiteStrs = {
        " " : "<SPC>",
        "\t": "<TAB>",
        "\n": "<LF>",
        "\r": "<CR>",
        "\f": "<FF>",
        }
    def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0):
        super(White,self).__init__()
        self.matchWhite = ws
        self.setWhitespaceChars( "".join(c for c in self.whiteChars if c not in self.matchWhite) )
        #~ self.leaveWhitespace()
        self.name = ("".join(White.whiteStrs[c] for c in self.matchWhite))
        self.mayReturnEmpty = True
        self.errmsg = "Expected " + self.name

        self.minLen = min

        if max > 0:
            self.maxLen = max
        else:
            self.maxLen = _MAX_INT

        if exact > 0:
            self.maxLen = exact
            self.minLen = exact

    def parseImpl( self, instring, loc, doActions=True ):
        if not(instring[ loc ] in self.matchWhite):
            raise ParseException(instring, loc, self.errmsg, self)
        start = loc
        loc += 1
        maxloc = start + self.maxLen
        maxloc = min( maxloc, len(instring) )
        while loc < maxloc and instring[loc] in self.matchWhite:
            loc += 1

        if loc - start < self.minLen:
            raise ParseException(instring, loc, self.errmsg, self)

        return loc, instring[start:loc]


class _PositionToken(Token):
    def __init__( self ):
        super(_PositionToken,self).__init__()
        self.name=self.__class__.__name__
        self.mayReturnEmpty = True
        self.mayIndexError = False

class GoToColumn(_PositionToken):
    """
    Token to advance to a specific column of input text; useful for tabular report scraping.
    """
    def __init__( self, colno ):
        super(GoToColumn,self).__init__()
        self.col = colno

    def preParse( self, instring, loc ):
        if col(loc,instring) != self.col:
            instrlen = len(instring)
            if self.ignoreExprs:
                loc = self._skipIgnorables( instring, loc )
            while loc < instrlen and instring[loc].isspace() and col( loc, instring ) != self.col :
                loc += 1
        return loc

    def parseImpl( self, instring, loc, doActions=True ):
        thiscol = col( loc, instring )
        if thiscol > self.col:
            raise ParseException( instring, loc, "Text not in expected column", self )
        newloc = loc + self.col - thiscol
        ret = instring[ loc: newloc ]
        return newloc, ret


class LineStart(_PositionToken):
    """
    Matches if current position is at the beginning of a line within the parse string
    
    Example::
    
        test = '''\
        AAA this line
        AAA and this line
          AAA but not this one
        B AAA and definitely not this one
        '''

        for t in (LineStart() + 'AAA' + restOfLine).searchString(test):
            print(t)
    
    Prints::
        ['AAA', ' this line']
        ['AAA', ' and this line']    

    """
    def __init__( self ):
        super(LineStart,self).__init__()
        self.errmsg = "Expected start of line"

    def parseImpl( self, instring, loc, doActions=True ):
        if col(loc, instring) == 1:
            return loc, []
        raise ParseException(instring, loc, self.errmsg, self)

class LineEnd(_PositionToken):
    """
    Matches if current position is at the end of a line within the parse string
    """
    def __init__( self ):
        super(LineEnd,self).__init__()
        self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") )
        self.errmsg = "Expected end of line"

    def parseImpl( self, instring, loc, doActions=True ):
        if loc<len(instring):
            if instring[loc] == "\n":
                return loc+1, "\n"
            else:
                raise ParseException(instring, loc, self.errmsg, self)
        elif loc == len(instring):
            return loc+1, []
        else:
            raise ParseException(instring, loc, self.errmsg, self)

class StringStart(_PositionToken):
    """
    Matches if current position is at the beginning of the parse string
    """
    def __init__( self ):
        super(StringStart,self).__init__()
        self.errmsg = "Expected start of text"

    def parseImpl( self, instring, loc, doActions=True ):
        if loc != 0:
            # see if entire string up to here is just whitespace and ignoreables
            if loc != self.preParse( instring, 0 ):
                raise ParseException(instring, loc, self.errmsg, self)
        return loc, []

class StringEnd(_PositionToken):
    """
    Matches if current position is at the end of the parse string
    """
    def __init__( self ):
        super(StringEnd,self).__init__()
        self.errmsg = "Expected end of text"

    def parseImpl( self, instring, loc, doActions=True ):
        if loc < len(instring):
            raise ParseException(instring, loc, self.errmsg, self)
        elif loc == len(instring):
            return loc+1, []
        elif loc > len(instring):
            return loc, []
        else:
            raise ParseException(instring, loc, self.errmsg, self)

class WordStart(_PositionToken):
    """
    Matches if the current position is at the beginning of a Word, and
    is not preceded by any character in a given set of C{wordChars}
    (default=C{printables}). To emulate the C{\b} behavior of regular expressions,
    use C{WordStart(alphanums)}. C{WordStart} will also match at the beginning of
    the string being parsed, or at the beginning of a line.
    """
    def __init__(self, wordChars = printables):
        super(WordStart,self).__init__()
        self.wordChars = set(wordChars)
        self.errmsg = "Not at the start of a word"

    def parseImpl(self, instring, loc, doActions=True ):
        if loc != 0:
            if (instring[loc-1] in self.wordChars or
                instring[loc] not in self.wordChars):
                raise ParseException(instring, loc, self.errmsg, self)
        return loc, []

class WordEnd(_PositionToken):
    """
    Matches if the current position is at the end of a Word, and
    is not followed by any character in a given set of C{wordChars}
    (default=C{printables}). To emulate the C{\b} behavior of regular expressions,
    use C{WordEnd(alphanums)}. C{WordEnd} will also match at the end of
    the string being parsed, or at the end of a line.
    """
    def __init__(self, wordChars = printables):
        super(WordEnd,self).__init__()
        self.wordChars = set(wordChars)
        self.skipWhitespace = False
        self.errmsg = "Not at the end of a word"

    def parseImpl(self, instring, loc, doActions=True ):
        instrlen = len(instring)
        if instrlen>0 and loc<instrlen:
            if (instring[loc] in self.wordChars or
                instring[loc-1] not in self.wordChars):
                raise ParseException(instring, loc, self.errmsg, self)
        return loc, []


class ParseExpression(ParserElement):
    """
    Abstract subclass of ParserElement, for combining and post-processing parsed tokens.
    """
    def __init__( self, exprs, savelist = False ):
        super(ParseExpression,self).__init__(savelist)
        if isinstance( exprs, _generatorType ):
            exprs = list(exprs)

        if isinstance( exprs, basestring ):
            self.exprs = [ ParserElement._literalStringClass( exprs ) ]
        elif isinstance( exprs, collections.Iterable ):
            exprs = list(exprs)
            # if sequence of strings provided, wrap with Literal
            if all(isinstance(expr, basestring) for expr in exprs):
                exprs = map(ParserElement._literalStringClass, exprs)
            self.exprs = list(exprs)
        else:
            try:
                self.exprs = list( exprs )
            except TypeError:
                self.exprs = [ exprs ]
        self.callPreparse = False

    def __getitem__( self, i ):
        return self.exprs[i]

    def append( self, other ):
        self.exprs.append( other )
        self.strRepr = None
        return self

    def leaveWhitespace( self ):
        """Extends C{leaveWhitespace} defined in base class, and also invokes C{leaveWhitespace} on
           all contained expressions."""
        self.skipWhitespace = False
        self.exprs = [ e.copy() for e in self.exprs ]
        for e in self.exprs:
            e.leaveWhitespace()
        return self

    def ignore( self, other ):
        if isinstance( other, Suppress ):
            if other not in self.ignoreExprs:
                super( ParseExpression, self).ignore( other )
                for e in self.exprs:
                    e.ignore( self.ignoreExprs[-1] )
        else:
            super( ParseExpression, self).ignore( other )
            for e in self.exprs:
                e.ignore( self.ignoreExprs[-1] )
        return self

    def __str__( self ):
        try:
            return super(ParseExpression,self).__str__()
        except Exception:
            pass

        if self.strRepr is None:
            self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.exprs) )
        return self.strRepr

    def streamline( self ):
        super(ParseExpression,self).streamline()

        for e in self.exprs:
            e.streamline()

        # collapse nested And's of the form And( And( And( a,b), c), d) to And( a,b,c,d )
        # but only if there are no parse actions or resultsNames on the nested And's
        # (likewise for Or's and MatchFirst's)
        if ( len(self.exprs) == 2 ):
            other = self.exprs[0]
            if ( isinstance( other, self.__class__ ) and
                  not(other.parseAction) and
                  other.resultsName is None and
                  not other.debug ):
                self.exprs = other.exprs[:] + [ self.exprs[1] ]
                self.strRepr = None
                self.mayReturnEmpty |= other.mayReturnEmpty
                self.mayIndexError  |= other.mayIndexError

            other = self.exprs[-1]
            if ( isinstance( other, self.__class__ ) and
                  not(other.parseAction) and
                  other.resultsName is None and
                  not other.debug ):
                self.exprs = self.exprs[:-1] + other.exprs[:]
                self.strRepr = None
                self.mayReturnEmpty |= other.mayReturnEmpty
                self.mayIndexError  |= other.mayIndexError

        self.errmsg = "Expected " + _ustr(self)
        
        return self

    def setResultsName( self, name, listAllMatches=False ):
        ret = super(ParseExpression,self).setResultsName(name,listAllMatches)
        return ret

    def validate( self, validateTrace=[] ):
        tmp = validateTrace[:]+[self]
        for e in self.exprs:
            e.validate(tmp)
        self.checkRecursion( [] )
        
    def copy(self):
        ret = super(ParseExpression,self).copy()
        ret.exprs = [e.copy() for e in self.exprs]
        return ret

class And(ParseExpression):
    """
    Requires all given C{ParseExpression}s to be found in the given order.
    Expressions may be separated by whitespace.
    May be constructed using the C{'+'} operator.
    May also be constructed using the C{'-'} operator, which will suppress backtracking.

    Example::
        integer = Word(nums)
        name_expr = OneOrMore(Word(alphas))

        expr = And([integer("id"),name_expr("name"),integer("age")])
        # more easily written as:
        expr = integer("id") + name_expr("name") + integer("age")
    """

    class _ErrorStop(Empty):
        def __init__(self, *args, **kwargs):
            super(And._ErrorStop,self).__init__(*args, **kwargs)
            self.name = '-'
            self.leaveWhitespace()

    def __init__( self, exprs, savelist = True ):
        super(And,self).__init__(exprs, savelist)
        self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs)
        self.setWhitespaceChars( self.exprs[0].whiteChars )
        self.skipWhitespace = self.exprs[0].skipWhitespace
        self.callPreparse = True

    def parseImpl( self, instring, loc, doActions=True ):
        # pass False as last arg to _parse for first element, since we already
        # pre-parsed the string as part of our And pre-parsing
        loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False )
        errorStop = False
        for e in self.exprs[1:]:
            if isinstance(e, And._ErrorStop):
                errorStop = True
                continue
            if errorStop:
                try:
                    loc, exprtokens = e._parse( instring, loc, doActions )
                except ParseSyntaxException:
                    raise
                except ParseBaseException as pe:
                    pe.__traceback__ = None
                    raise ParseSyntaxException._from_exception(pe)
                except IndexError:
                    raise ParseSyntaxException(instring, len(instring), self.errmsg, self)
            else:
                loc, exprtokens = e._parse( instring, loc, doActions )
            if exprtokens or exprtokens.haskeys():
                resultlist += exprtokens
        return loc, resultlist

    def __iadd__(self, other ):
        if isinstance( other, basestring ):
            other = ParserElement._literalStringClass( other )
        return self.append( other ) #And( [ self, other ] )

    def checkRecursion( self, parseElementList ):
        subRecCheckList = parseElementList[:] + [ self ]
        for e in self.exprs:
            e.checkRecursion( subRecCheckList )
            if not e.mayReturnEmpty:
                break

    def __str__( self ):
        if hasattr(self,"name"):
            return self.name

        if self.strRepr is None:
            self.strRepr = "{" + " ".join(_ustr(e) for e in self.exprs) + "}"

        return self.strRepr


class Or(ParseExpression):
    """
    Requires that at least one C{ParseExpression} is found.
    If two expressions match, the expression that matches the longest string will be used.
    May be constructed using the C{'^'} operator.

    Example::
        # construct Or using '^' operator
        
        number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums))
        print(number.searchString("123 3.1416 789"))
    prints::
        [['123'], ['3.1416'], ['789']]
    """
    def __init__( self, exprs, savelist = False ):
        super(Or,self).__init__(exprs, savelist)
        if self.exprs:
            self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs)
        else:
            self.mayReturnEmpty = True

    def parseImpl( self, instring, loc, doActions=True ):
        maxExcLoc = -1
        maxException = None
        matches = []
        for e in self.exprs:
            try:
                loc2 = e.tryParse( instring, loc )
            except ParseException as err:
                err.__traceback__ = None
                if err.loc > maxExcLoc:
                    maxException = err
                    maxExcLoc = err.loc
            except IndexError:
                if len(instring) > maxExcLoc:
                    maxException = ParseException(instring,len(instring),e.errmsg,self)
                    maxExcLoc = len(instring)
            else:
                # save match among all matches, to retry longest to shortest
                matches.append((loc2, e))

        if matches:
            matches.sort(key=lambda x: -x[0])
            for _,e in matches:
                try:
                    return e._parse( instring, loc, doActions )
                except ParseException as err:
                    err.__traceback__ = None
                    if err.loc > maxExcLoc:
                        maxException = err
                        maxExcLoc = err.loc

        if maxException is not None:
            maxException.msg = self.errmsg
            raise maxException
        else:
            raise ParseException(instring, loc, "no defined alternatives to match", self)


    def __ixor__(self, other ):
        if isinstance( other, basestring ):
            other = ParserElement._literalStringClass( other )
        return self.append( other ) #Or( [ self, other ] )

    def __str__( self ):
        if hasattr(self,"name"):
            return self.name

        if self.strRepr is None:
            self.strRepr = "{" + " ^ ".join(_ustr(e) for e in self.exprs) + "}"

        return self.strRepr

    def checkRecursion( self, parseElementList ):
        subRecCheckList = parseElementList[:] + [ self ]
        for e in self.exprs:
            e.checkRecursion( subRecCheckList )


class MatchFirst(ParseExpression):
    """
    Requires that at least one C{ParseExpression} is found.
    If two expressions match, the first one listed is the one that will match.
    May be constructed using the C{'|'} operator.

    Example::
        # construct MatchFirst using '|' operator
        
        # watch the order of expressions to match
        number = Word(nums) | Combine(Word(nums) + '.' + Word(nums))
        print(number.searchString("123 3.1416 789")) #  Fail! -> [['123'], ['3'], ['1416'], ['789']]

        # put more selective expression first
        number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums)
        print(number.searchString("123 3.1416 789")) #  Better -> [['123'], ['3.1416'], ['789']]
    """
    def __init__( self, exprs, savelist = False ):
        super(MatchFirst,self).__init__(exprs, savelist)
        if self.exprs:
            self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs)
        else:
            self.mayReturnEmpty = True

    def parseImpl( self, instring, loc, doActions=True ):
        maxExcLoc = -1
        maxException = None
        for e in self.exprs:
            try:
                ret = e._parse( instring, loc, doActions )
                return ret
            except ParseException as err:
                if err.loc > maxExcLoc:
                    maxException = err
                    maxExcLoc = err.loc
            except IndexError:
                if len(instring) > maxExcLoc:
                    maxException = ParseException(instring,len(instring),e.errmsg,self)
                    maxExcLoc = len(instring)

        # only got here if no expression matched, raise exception for match that made it the furthest
        else:
            if maxException is not None:
                maxException.msg = self.errmsg
                raise maxException
            else:
                raise ParseException(instring, loc, "no defined alternatives to match", self)

    def __ior__(self, other ):
        if isinstance( other, basestring ):
            other = ParserElement._literalStringClass( other )
        return self.append( other ) #MatchFirst( [ self, other ] )

    def __str__( self ):
        if hasattr(self,"name"):
            return self.name

        if self.strRepr is None:
            self.strRepr = "{" + " | ".join(_ustr(e) for e in self.exprs) + "}"

        return self.strRepr

    def checkRecursion( self, parseElementList ):
        subRecCheckList = parseElementList[:] + [ self ]
        for e in self.exprs:
            e.checkRecursion( subRecCheckList )


class Each(ParseExpression):
    """
    Requires all given C{ParseExpression}s to be found, but in any order.
    Expressions may be separated by whitespace.
    May be constructed using the C{'&'} operator.

    Example::
        color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN")
        shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON")
        integer = Word(nums)
        shape_attr = "shape:" + shape_type("shape")
        posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn")
        color_attr = "color:" + color("color")
        size_attr = "size:" + integer("size")

        # use Each (using operator '&') to accept attributes in any order 
        # (shape and posn are required, color and size are optional)
        shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr)

        shape_spec.runTests('''
            shape: SQUARE color: BLACK posn: 100, 120
            shape: CIRCLE size: 50 color: BLUE posn: 50,80
            color:GREEN size:20 shape:TRIANGLE posn:20,40
            '''
            )
    prints::
        shape: SQUARE color: BLACK posn: 100, 120
        ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']]
        - color: BLACK
        - posn: ['100', ',', '120']
          - x: 100
          - y: 120
        - shape: SQUARE


        shape: CIRCLE size: 50 color: BLUE posn: 50,80
        ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']]
        - color: BLUE
        - posn: ['50', ',', '80']
          - x: 50
          - y: 80
        - shape: CIRCLE
        - size: 50


        color: GREEN size: 20 shape: TRIANGLE posn: 20,40
        ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']]
        - color: GREEN
        - posn: ['20', ',', '40']
          - x: 20
          - y: 40
        - shape: TRIANGLE
        - size: 20
    """
    def __init__( self, exprs, savelist = True ):
        super(Each,self).__init__(exprs, savelist)
        self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs)
        self.skipWhitespace = True
        self.initExprGroups = True

    def parseImpl( self, instring, loc, doActions=True ):
        if self.initExprGroups:
            self.opt1map = dict((id(e.expr),e) for e in self.exprs if isinstance(e,Optional))
            opt1 = [ e.expr for e in self.exprs if isinstance(e,Optional) ]
            opt2 = [ e for e in self.exprs if e.mayReturnEmpty and not isinstance(e,Optional)]
            self.optionals = opt1 + opt2
            self.multioptionals = [ e.expr for e in self.exprs if isinstance(e,ZeroOrMore) ]
            self.multirequired = [ e.expr for e in self.exprs if isinstance(e,OneOrMore) ]
            self.required = [ e for e in self.exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ]
            self.required += self.multirequired
            self.initExprGroups = False
        tmpLoc = loc
        tmpReqd = self.required[:]
        tmpOpt  = self.optionals[:]
        matchOrder = []

        keepMatching = True
        while keepMatching:
            tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired
            failed = []
            for e in tmpExprs:
                try:
                    tmpLoc = e.tryParse( instring, tmpLoc )
                except ParseException:
                    failed.append(e)
                else:
                    matchOrder.append(self.opt1map.get(id(e),e))
                    if e in tmpReqd:
                        tmpReqd.remove(e)
                    elif e in tmpOpt:
                        tmpOpt.remove(e)
            if len(failed) == len(tmpExprs):
                keepMatching = False

        if tmpReqd:
            missing = ", ".join(_ustr(e) for e in tmpReqd)
            raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing )

        # add any unmatched Optionals, in case they have default values defined
        matchOrder += [e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt]

        resultlist = []
        for e in matchOrder:
            loc,results = e._parse(instring,loc,doActions)
            resultlist.append(results)

        finalResults = sum(resultlist, ParseResults([]))
        return loc, finalResults

    def __str__( self ):
        if hasattr(self,"name"):
            return self.name

        if self.strRepr is None:
            self.strRepr = "{" + " & ".join(_ustr(e) for e in self.exprs) + "}"

        return self.strRepr

    def checkRecursion( self, parseElementList ):
        subRecCheckList = parseElementList[:] + [ self ]
        for e in self.exprs:
            e.checkRecursion( subRecCheckList )


class ParseElementEnhance(ParserElement):
    """
    Abstract subclass of C{ParserElement}, for combining and post-processing parsed tokens.
    """
    def __init__( self, expr, savelist=False ):
        super(ParseElementEnhance,self).__init__(savelist)
        if isinstance( expr, basestring ):
            if issubclass(ParserElement._literalStringClass, Token):
                expr = ParserElement._literalStringClass(expr)
            else:
                expr = ParserElement._literalStringClass(Literal(expr))
        self.expr = expr
        self.strRepr = None
        if expr is not None:
            self.mayIndexError = expr.mayIndexError
            self.mayReturnEmpty = expr.mayReturnEmpty
            self.setWhitespaceChars( expr.whiteChars )
            self.skipWhitespace = expr.skipWhitespace
            self.saveAsList = expr.saveAsList
            self.callPreparse = expr.callPreparse
            self.ignoreExprs.extend(expr.ignoreExprs)

    def parseImpl( self, instring, loc, doActions=True ):
        if self.expr is not None:
            return self.expr._parse( instring, loc, doActions, callPreParse=False )
        else:
            raise ParseException("",loc,self.errmsg,self)

    def leaveWhitespace( self ):
        self.skipWhitespace = False
        self.expr = self.expr.copy()
        if self.expr is not None:
            self.expr.leaveWhitespace()
        return self

    def ignore( self, other ):
        if isinstance( other, Suppress ):
            if other not in self.ignoreExprs:
                super( ParseElementEnhance, self).ignore( other )
                if self.expr is not None:
                    self.expr.ignore( self.ignoreExprs[-1] )
        else:
            super( ParseElementEnhance, self).ignore( other )
            if self.expr is not None:
                self.expr.ignore( self.ignoreExprs[-1] )
        return self

    def streamline( self ):
        super(ParseElementEnhance,self).streamline()
        if self.expr is not None:
            self.expr.streamline()
        return self

    def checkRecursion( self, parseElementList ):
        if self in parseElementList:
            raise RecursiveGrammarException( parseElementList+[self] )
        subRecCheckList = parseElementList[:] + [ self ]
        if self.expr is not None:
            self.expr.checkRecursion( subRecCheckList )

    def validate( self, validateTrace=[] ):
        tmp = validateTrace[:]+[self]
        if self.expr is not None:
            self.expr.validate(tmp)
        self.checkRecursion( [] )

    def __str__( self ):
        try:
            return super(ParseElementEnhance,self).__str__()
        except Exception:
            pass

        if self.strRepr is None and self.expr is not None:
            self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.expr) )
        return self.strRepr


class FollowedBy(ParseElementEnhance):
    """
    Lookahead matching of the given parse expression.  C{FollowedBy}
    does I{not} advance the parsing position within the input string, it only
    verifies that the specified parse expression matches at the current
    position.  C{FollowedBy} always returns a null token list.

    Example::
        # use FollowedBy to match a label only if it is followed by a ':'
        data_word = Word(alphas)
        label = data_word + FollowedBy(':')
        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
        
        OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint()
    prints::
        [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']]
    """
    def __init__( self, expr ):
        super(FollowedBy,self).__init__(expr)
        self.mayReturnEmpty = True

    def parseImpl( self, instring, loc, doActions=True ):
        self.expr.tryParse( instring, loc )
        return loc, []


class NotAny(ParseElementEnhance):
    """
    Lookahead to disallow matching with the given parse expression.  C{NotAny}
    does I{not} advance the parsing position within the input string, it only
    verifies that the specified parse expression does I{not} match at the current
    position.  Also, C{NotAny} does I{not} skip over leading whitespace. C{NotAny}
    always returns a null token list.  May be constructed using the '~' operator.

    Example::
        
    """
    def __init__( self, expr ):
        super(NotAny,self).__init__(expr)
        #~ self.leaveWhitespace()
        self.skipWhitespace = False  # do NOT use self.leaveWhitespace(), don't want to propagate to exprs
        self.mayReturnEmpty = True
        self.errmsg = "Found unwanted token, "+_ustr(self.expr)

    def parseImpl( self, instring, loc, doActions=True ):
        if self.expr.canParseNext(instring, loc):
            raise ParseException(instring, loc, self.errmsg, self)
        return loc, []

    def __str__( self ):
        if hasattr(self,"name"):
            return self.name

        if self.strRepr is None:
            self.strRepr = "~{" + _ustr(self.expr) + "}"

        return self.strRepr

class _MultipleMatch(ParseElementEnhance):
    def __init__( self, expr, stopOn=None):
        super(_MultipleMatch, self).__init__(expr)
        self.saveAsList = True
        ender = stopOn
        if isinstance(ender, basestring):
            ender = ParserElement._literalStringClass(ender)
        self.not_ender = ~ender if ender is not None else None

    def parseImpl( self, instring, loc, doActions=True ):
        self_expr_parse = self.expr._parse
        self_skip_ignorables = self._skipIgnorables
        check_ender = self.not_ender is not None
        if check_ender:
            try_not_ender = self.not_ender.tryParse
        
        # must be at least one (but first see if we are the stopOn sentinel;
        # if so, fail)
        if check_ender:
            try_not_ender(instring, loc)
        loc, tokens = self_expr_parse( instring, loc, doActions, callPreParse=False )
        try:
            hasIgnoreExprs = (not not self.ignoreExprs)
            while 1:
                if check_ender:
                    try_not_ender(instring, loc)
                if hasIgnoreExprs:
                    preloc = self_skip_ignorables( instring, loc )
                else:
                    preloc = loc
                loc, tmptokens = self_expr_parse( instring, preloc, doActions )
                if tmptokens or tmptokens.haskeys():
                    tokens += tmptokens
        except (ParseException,IndexError):
            pass

        return loc, tokens
        
class OneOrMore(_MultipleMatch):
    """
    Repetition of one or more of the given expression.
    
    Parameters:
     - expr - expression that must match one or more times
     - stopOn - (default=C{None}) - expression for a terminating sentinel
          (only required if the sentinel would ordinarily match the repetition 
          expression)          

    Example::
        data_word = Word(alphas)
        label = data_word + FollowedBy(':')
        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join))

        text = "shape: SQUARE posn: upper left color: BLACK"
        OneOrMore(attr_expr).parseString(text).pprint()  # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']]

        # use stopOn attribute for OneOrMore to avoid reading label string as part of the data
        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
        OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']]
        
        # could also be written as
        (attr_expr * (1,)).parseString(text).pprint()
    """

    def __str__( self ):
        if hasattr(self,"name"):
            return self.name

        if self.strRepr is None:
            self.strRepr = "{" + _ustr(self.expr) + "}..."

        return self.strRepr

class ZeroOrMore(_MultipleMatch):
    """
    Optional repetition of zero or more of the given expression.
    
    Parameters:
     - expr - expression that must match zero or more times
     - stopOn - (default=C{None}) - expression for a terminating sentinel
          (only required if the sentinel would ordinarily match the repetition 
          expression)          

    Example: similar to L{OneOrMore}
    """
    def __init__( self, expr, stopOn=None):
        super(ZeroOrMore,self).__init__(expr, stopOn=stopOn)
        self.mayReturnEmpty = True
        
    def parseImpl( self, instring, loc, doActions=True ):
        try:
            return super(ZeroOrMore, self).parseImpl(instring, loc, doActions)
        except (ParseException,IndexError):
            return loc, []

    def __str__( self ):
        if hasattr(self,"name"):
            return self.name

        if self.strRepr is None:
            self.strRepr = "[" + _ustr(self.expr) + "]..."

        return self.strRepr

class _NullToken(object):
    def __bool__(self):
        return False
    __nonzero__ = __bool__
    def __str__(self):
        return ""

_optionalNotMatched = _NullToken()
class Optional(ParseElementEnhance):
    """
    Optional matching of the given expression.

    Parameters:
     - expr - expression that must match zero or more times
     - default (optional) - value to be returned if the optional expression is not found.

    Example::
        # US postal code can be a 5-digit zip, plus optional 4-digit qualifier
        zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4)))
        zip.runTests('''
            # traditional ZIP code
            12345
            
            # ZIP+4 form
            12101-0001
            
            # invalid ZIP
            98765-
            ''')
    prints::
        # traditional ZIP code
        12345
        ['12345']

        # ZIP+4 form
        12101-0001
        ['12101-0001']

        # invalid ZIP
        98765-
             ^
        FAIL: Expected end of text (at char 5), (line:1, col:6)
    """
    def __init__( self, expr, default=_optionalNotMatched ):
        super(Optional,self).__init__( expr, savelist=False )
        self.saveAsList = self.expr.saveAsList
        self.defaultValue = default
        self.mayReturnEmpty = True

    def parseImpl( self, instring, loc, doActions=True ):
        try:
            loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False )
        except (ParseException,IndexError):
            if self.defaultValue is not _optionalNotMatched:
                if self.expr.resultsName:
                    tokens = ParseResults([ self.defaultValue ])
                    tokens[self.expr.resultsName] = self.defaultValue
                else:
                    tokens = [ self.defaultValue ]
            else:
                tokens = []
        return loc, tokens

    def __str__( self ):
        if hasattr(self,"name"):
            return self.name

        if self.strRepr is None:
            self.strRepr = "[" + _ustr(self.expr) + "]"

        return self.strRepr

class SkipTo(ParseElementEnhance):
    """
    Token for skipping over all undefined text until the matched expression is found.

    Parameters:
     - expr - target expression marking the end of the data to be skipped
     - include - (default=C{False}) if True, the target expression is also parsed 
          (the skipped text and target expression are returned as a 2-element list).
     - ignore - (default=C{None}) used to define grammars (typically quoted strings and 
          comments) that might contain false matches to the target expression
     - failOn - (default=C{None}) define expressions that are not allowed to be 
          included in the skipped test; if found before the target expression is found, 
          the SkipTo is not a match

    Example::
        report = '''
            Outstanding Issues Report - 1 Jan 2000

               # | Severity | Description                               |  Days Open
            -----+----------+-------------------------------------------+-----------
             101 | Critical | Intermittent system crash                 |          6
              94 | Cosmetic | Spelling error on Login ('log|n')         |         14
              79 | Minor    | System slow when running too many reports |         47
            '''
        integer = Word(nums)
        SEP = Suppress('|')
        # use SkipTo to simply match everything up until the next SEP
        # - ignore quoted strings, so that a '|' character inside a quoted string does not match
        # - parse action will call token.strip() for each matched token, i.e., the description body
        string_data = SkipTo(SEP, ignore=quotedString)
        string_data.setParseAction(tokenMap(str.strip))
        ticket_expr = (integer("issue_num") + SEP 
                      + string_data("sev") + SEP 
                      + string_data("desc") + SEP 
                      + integer("days_open"))
        
        for tkt in ticket_expr.searchString(report):
            print tkt.dump()
    prints::
        ['101', 'Critical', 'Intermittent system crash', '6']
        - days_open: 6
        - desc: Intermittent system crash
        - issue_num: 101
        - sev: Critical
        ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14']
        - days_open: 14
        - desc: Spelling error on Login ('log|n')
        - issue_num: 94
        - sev: Cosmetic
        ['79', 'Minor', 'System slow when running too many reports', '47']
        - days_open: 47
        - desc: System slow when running too many reports
        - issue_num: 79
        - sev: Minor
    """
    def __init__( self, other, include=False, ignore=None, failOn=None ):
        super( SkipTo, self ).__init__( other )
        self.ignoreExpr = ignore
        self.mayReturnEmpty = True
        self.mayIndexError = False
        self.includeMatch = include
        self.asList = False
        if isinstance(failOn, basestring):
            self.failOn = ParserElement._literalStringClass(failOn)
        else:
            self.failOn = failOn
        self.errmsg = "No match found for "+_ustr(self.expr)

    def parseImpl( self, instring, loc, doActions=True ):
        startloc = loc
        instrlen = len(instring)
        expr = self.expr
        expr_parse = self.expr._parse
        self_failOn_canParseNext = self.failOn.canParseNext if self.failOn is not None else None
        self_ignoreExpr_tryParse = self.ignoreExpr.tryParse if self.ignoreExpr is not None else None
        
        tmploc = loc
        while tmploc <= instrlen:
            if self_failOn_canParseNext is not None:
                # break if failOn expression matches
                if self_failOn_canParseNext(instring, tmploc):
                    break
                    
            if self_ignoreExpr_tryParse is not None:
                # advance past ignore expressions
                while 1:
                    try:
                        tmploc = self_ignoreExpr_tryParse(instring, tmploc)
                    except ParseBaseException:
                        break
            
            try:
                expr_parse(instring, tmploc, doActions=False, callPreParse=False)
            except (ParseException, IndexError):
                # no match, advance loc in string
                tmploc += 1
            else:
                # matched skipto expr, done
                break

        else:
            # ran off the end of the input string without matching skipto expr, fail
            raise ParseException(instring, loc, self.errmsg, self)

        # build up return values
        loc = tmploc
        skiptext = instring[startloc:loc]
        skipresult = ParseResults(skiptext)
        
        if self.includeMatch:
            loc, mat = expr_parse(instring,loc,doActions,callPreParse=False)
            skipresult += mat

        return loc, skipresult

class Forward(ParseElementEnhance):
    """
    Forward declaration of an expression to be defined later -
    used for recursive grammars, such as algebraic infix notation.
    When the expression is known, it is assigned to the C{Forward} variable using the '<<' operator.

    Note: take care when assigning to C{Forward} not to overlook precedence of operators.
    Specifically, '|' has a lower precedence than '<<', so that::
        fwdExpr << a | b | c
    will actually be evaluated as::
        (fwdExpr << a) | b | c
    thereby leaving b and c out as parseable alternatives.  It is recommended that you
    explicitly group the values inserted into the C{Forward}::
        fwdExpr << (a | b | c)
    Converting to use the '<<=' operator instead will avoid this problem.

    See L{ParseResults.pprint} for an example of a recursive parser created using
    C{Forward}.
    """
    def __init__( self, other=None ):
        super(Forward,self).__init__( other, savelist=False )

    def __lshift__( self, other ):
        if isinstance( other, basestring ):
            other = ParserElement._literalStringClass(other)
        self.expr = other
        self.strRepr = None
        self.mayIndexError = self.expr.mayIndexError
        self.mayReturnEmpty = self.expr.mayReturnEmpty
        self.setWhitespaceChars( self.expr.whiteChars )
        self.skipWhitespace = self.expr.skipWhitespace
        self.saveAsList = self.expr.saveAsList
        self.ignoreExprs.extend(self.expr.ignoreExprs)
        return self
        
    def __ilshift__(self, other):
        return self << other
    
    def leaveWhitespace( self ):
        self.skipWhitespace = False
        return self

    def streamline( self ):
        if not self.streamlined:
            self.streamlined = True
            if self.expr is not None:
                self.expr.streamline()
        return self

    def validate( self, validateTrace=[] ):
        if self not in validateTrace:
            tmp = validateTrace[:]+[self]
            if self.expr is not None:
                self.expr.validate(tmp)
        self.checkRecursion([])

    def __str__( self ):
        if hasattr(self,"name"):
            return self.name
        return self.__class__.__name__ + ": ..."

        # stubbed out for now - creates awful memory and perf issues
        self._revertClass = self.__class__
        self.__class__ = _ForwardNoRecurse
        try:
            if self.expr is not None:
                retString = _ustr(self.expr)
            else:
                retString = "None"
        finally:
            self.__class__ = self._revertClass
        return self.__class__.__name__ + ": " + retString

    def copy(self):
        if self.expr is not None:
            return super(Forward,self).copy()
        else:
            ret = Forward()
            ret <<= self
            return ret

class _ForwardNoRecurse(Forward):
    def __str__( self ):
        return "..."

class TokenConverter(ParseElementEnhance):
    """
    Abstract subclass of C{ParseExpression}, for converting parsed results.
    """
    def __init__( self, expr, savelist=False ):
        super(TokenConverter,self).__init__( expr )#, savelist )
        self.saveAsList = False

class Combine(TokenConverter):
    """
    Converter to concatenate all matching tokens to a single string.
    By default, the matching patterns must also be contiguous in the input string;
    this can be disabled by specifying C{'adjacent=False'} in the constructor.

    Example::
        real = Word(nums) + '.' + Word(nums)
        print(real.parseString('3.1416')) # -> ['3', '.', '1416']
        # will also erroneously match the following
        print(real.parseString('3. 1416')) # -> ['3', '.', '1416']

        real = Combine(Word(nums) + '.' + Word(nums))
        print(real.parseString('3.1416')) # -> ['3.1416']
        # no match when there are internal spaces
        print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...)
    """
    def __init__( self, expr, joinString="", adjacent=True ):
        super(Combine,self).__init__( expr )
        # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself
        if adjacent:
            self.leaveWhitespace()
        self.adjacent = adjacent
        self.skipWhitespace = True
        self.joinString = joinString
        self.callPreparse = True

    def ignore( self, other ):
        if self.adjacent:
            ParserElement.ignore(self, other)
        else:
            super( Combine, self).ignore( other )
        return self

    def postParse( self, instring, loc, tokenlist ):
        retToks = tokenlist.copy()
        del retToks[:]
        retToks += ParseResults([ "".join(tokenlist._asStringList(self.joinString)) ], modal=self.modalResults)

        if self.resultsName and retToks.haskeys():
            return [ retToks ]
        else:
            return retToks

class Group(TokenConverter):
    """
    Converter to return the matched tokens as a list - useful for returning tokens of C{L{ZeroOrMore}} and C{L{OneOrMore}} expressions.

    Example::
        ident = Word(alphas)
        num = Word(nums)
        term = ident | num
        func = ident + Optional(delimitedList(term))
        print(func.parseString("fn a,b,100"))  # -> ['fn', 'a', 'b', '100']

        func = ident + Group(Optional(delimitedList(term)))
        print(func.parseString("fn a,b,100"))  # -> ['fn', ['a', 'b', '100']]
    """
    def __init__( self, expr ):
        super(Group,self).__init__( expr )
        self.saveAsList = True

    def postParse( self, instring, loc, tokenlist ):
        return [ tokenlist ]

class Dict(TokenConverter):
    """
    Converter to return a repetitive expression as a list, but also as a dictionary.
    Each element can also be referenced using the first token in the expression as its key.
    Useful for tabular report scraping when the first column can be used as a item key.

    Example::
        data_word = Word(alphas)
        label = data_word + FollowedBy(':')
        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join))

        text = "shape: SQUARE posn: upper left color: light blue texture: burlap"
        attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
        
        # print attributes as plain groups
        print(OneOrMore(attr_expr).parseString(text).dump())
        
        # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names
        result = Dict(OneOrMore(Group(attr_expr))).parseString(text)
        print(result.dump())
        
        # access named fields as dict entries, or output as dict
        print(result['shape'])        
        print(result.asDict())
    prints::
        ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap']

        [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']]
        - color: light blue
        - posn: upper left
        - shape: SQUARE
        - texture: burlap
        SQUARE
        {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'}
    See more examples at L{ParseResults} of accessing fields by results name.
    """
    def __init__( self, expr ):
        super(Dict,self).__init__( expr )
        self.saveAsList = True

    def postParse( self, instring, loc, tokenlist ):
        for i,tok in enumerate(tokenlist):
            if len(tok) == 0:
                continue
            ikey = tok[0]
            if isinstance(ikey,int):
                ikey = _ustr(tok[0]).strip()
            if len(tok)==1:
                tokenlist[ikey] = _ParseResultsWithOffset("",i)
            elif len(tok)==2 and not isinstance(tok[1],ParseResults):
                tokenlist[ikey] = _ParseResultsWithOffset(tok[1],i)
            else:
                dictvalue = tok.copy() #ParseResults(i)
                del dictvalue[0]
                if len(dictvalue)!= 1 or (isinstance(dictvalue,ParseResults) and dictvalue.haskeys()):
                    tokenlist[ikey] = _ParseResultsWithOffset(dictvalue,i)
                else:
                    tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0],i)

        if self.resultsName:
            return [ tokenlist ]
        else:
            return tokenlist


class Suppress(TokenConverter):
    """
    Converter for ignoring the results of a parsed expression.

    Example::
        source = "a, b, c,d"
        wd = Word(alphas)
        wd_list1 = wd + ZeroOrMore(',' + wd)
        print(wd_list1.parseString(source))

        # often, delimiters that are useful during parsing are just in the
        # way afterward - use Suppress to keep them out of the parsed output
        wd_list2 = wd + ZeroOrMore(Suppress(',') + wd)
        print(wd_list2.parseString(source))
    prints::
        ['a', ',', 'b', ',', 'c', ',', 'd']
        ['a', 'b', 'c', 'd']
    (See also L{delimitedList}.)
    """
    def postParse( self, instring, loc, tokenlist ):
        return []

    def suppress( self ):
        return self


class OnlyOnce(object):
    """
    Wrapper for parse actions, to ensure they are only called once.
    """
    def __init__(self, methodCall):
        self.callable = _trim_arity(methodCall)
        self.called = False
    def __call__(self,s,l,t):
        if not self.called:
            results = self.callable(s,l,t)
            self.called = True
            return results
        raise ParseException(s,l,"")
    def reset(self):
        self.called = False

def traceParseAction(f):
    """
    Decorator for debugging parse actions. 
    
    When the parse action is called, this decorator will print C{">> entering I{method-name}(line:I{current_source_line}, I{parse_location}, I{matched_tokens})".}
    When the parse action completes, the decorator will print C{"<<"} followed by the returned value, or any exception that the parse action raised.

    Example::
        wd = Word(alphas)

        @traceParseAction
        def remove_duplicate_chars(tokens):
            return ''.join(sorted(set(''.join(tokens)))

        wds = OneOrMore(wd).setParseAction(remove_duplicate_chars)
        print(wds.parseString("slkdjs sld sldd sdlf sdljf"))
    prints::
        >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {}))
        <<leaving remove_duplicate_chars (ret: 'dfjkls')
        ['dfjkls']
    """
    f = _trim_arity(f)
    def z(*paArgs):
        thisFunc = f.__name__
        s,l,t = paArgs[-3:]
        if len(paArgs)>3:
            thisFunc = paArgs[0].__class__.__name__ + '.' + thisFunc
        sys.stderr.write( ">>entering %s(line: '%s', %d, %r)\n" % (thisFunc,line(l,s),l,t) )
        try:
            ret = f(*paArgs)
        except Exception as exc:
            sys.stderr.write( "<<leaving %s (exception: %s)\n" % (thisFunc,exc) )
            raise
        sys.stderr.write( "<<leaving %s (ret: %r)\n" % (thisFunc,ret) )
        return ret
    try:
        z.__name__ = f.__name__
    except AttributeError:
        pass
    return z

#
# global helpers
#
def delimitedList( expr, delim=",", combine=False ):
    """
    Helper to define a delimited list of expressions - the delimiter defaults to ','.
    By default, the list elements and delimiters can have intervening whitespace, and
    comments, but this can be overridden by passing C{combine=True} in the constructor.
    If C{combine} is set to C{True}, the matching tokens are returned as a single token
    string, with the delimiters included; otherwise, the matching tokens are returned
    as a list of tokens, with the delimiters suppressed.

    Example::
        delimitedList(Word(alphas)).parseString("aa,bb,cc") # -> ['aa', 'bb', 'cc']
        delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE']
    """
    dlName = _ustr(expr)+" ["+_ustr(delim)+" "+_ustr(expr)+"]..."
    if combine:
        return Combine( expr + ZeroOrMore( delim + expr ) ).setName(dlName)
    else:
        return ( expr + ZeroOrMore( Suppress( delim ) + expr ) ).setName(dlName)

def countedArray( expr, intExpr=None ):
    """
    Helper to define a counted list of expressions.
    This helper defines a pattern of the form::
        integer expr expr expr...
    where the leading integer tells how many expr expressions follow.
    The matched tokens returns the array of expr tokens as a list - the leading count token is suppressed.
    
    If C{intExpr} is specified, it should be a pyparsing expression that produces an integer value.

    Example::
        countedArray(Word(alphas)).parseString('2 ab cd ef')  # -> ['ab', 'cd']

        # in this parser, the leading integer value is given in binary,
        # '10' indicating that 2 values are in the array
        binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2))
        countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef')  # -> ['ab', 'cd']
    """
    arrayExpr = Forward()
    def countFieldParseAction(s,l,t):
        n = t[0]
        arrayExpr << (n and Group(And([expr]*n)) or Group(empty))
        return []
    if intExpr is None:
        intExpr = Word(nums).setParseAction(lambda t:int(t[0]))
    else:
        intExpr = intExpr.copy()
    intExpr.setName("arrayLen")
    intExpr.addParseAction(countFieldParseAction, callDuringTry=True)
    return ( intExpr + arrayExpr ).setName('(len) ' + _ustr(expr) + '...')

def _flatten(L):
    ret = []
    for i in L:
        if isinstance(i,list):
            ret.extend(_flatten(i))
        else:
            ret.append(i)
    return ret

def matchPreviousLiteral(expr):
    """
    Helper to define an expression that is indirectly defined from
    the tokens matched in a previous expression, that is, it looks
    for a 'repeat' of a previous expression.  For example::
        first = Word(nums)
        second = matchPreviousLiteral(first)
        matchExpr = first + ":" + second
    will match C{"1:1"}, but not C{"1:2"}.  Because this matches a
    previous literal, will also match the leading C{"1:1"} in C{"1:10"}.
    If this is not desired, use C{matchPreviousExpr}.
    Do I{not} use with packrat parsing enabled.
    """
    rep = Forward()
    def copyTokenToRepeater(s,l,t):
        if t:
            if len(t) == 1:
                rep << t[0]
            else:
                # flatten t tokens
                tflat = _flatten(t.asList())
                rep << And(Literal(tt) for tt in tflat)
        else:
            rep << Empty()
    expr.addParseAction(copyTokenToRepeater, callDuringTry=True)
    rep.setName('(prev) ' + _ustr(expr))
    return rep

def matchPreviousExpr(expr):
    """
    Helper to define an expression that is indirectly defined from
    the tokens matched in a previous expression, that is, it looks
    for a 'repeat' of a previous expression.  For example::
        first = Word(nums)
        second = matchPreviousExpr(first)
        matchExpr = first + ":" + second
    will match C{"1:1"}, but not C{"1:2"}.  Because this matches by
    expressions, will I{not} match the leading C{"1:1"} in C{"1:10"};
    the expressions are evaluated first, and then compared, so
    C{"1"} is compared with C{"10"}.
    Do I{not} use with packrat parsing enabled.
    """
    rep = Forward()
    e2 = expr.copy()
    rep <<= e2
    def copyTokenToRepeater(s,l,t):
        matchTokens = _flatten(t.asList())
        def mustMatchTheseTokens(s,l,t):
            theseTokens = _flatten(t.asList())
            if  theseTokens != matchTokens:
                raise ParseException("",0,"")
        rep.setParseAction( mustMatchTheseTokens, callDuringTry=True )
    expr.addParseAction(copyTokenToRepeater, callDuringTry=True)
    rep.setName('(prev) ' + _ustr(expr))
    return rep

def _escapeRegexRangeChars(s):
    #~  escape these chars: ^-]
    for c in r"\^-]":
        s = s.replace(c,_bslash+c)
    s = s.replace("\n",r"\n")
    s = s.replace("\t",r"\t")
    return _ustr(s)

def oneOf( strs, caseless=False, useRegex=True ):
    """
    Helper to quickly define a set of alternative Literals, and makes sure to do
    longest-first testing when there is a conflict, regardless of the input order,
    but returns a C{L{MatchFirst}} for best performance.

    Parameters:
     - strs - a string of space-delimited literals, or a collection of string literals
     - caseless - (default=C{False}) - treat all literals as caseless
     - useRegex - (default=C{True}) - as an optimization, will generate a Regex
          object; otherwise, will generate a C{MatchFirst} object (if C{caseless=True}, or
          if creating a C{Regex} raises an exception)

    Example::
        comp_oper = oneOf("< = > <= >= !=")
        var = Word(alphas)
        number = Word(nums)
        term = var | number
        comparison_expr = term + comp_oper + term
        print(comparison_expr.searchString("B = 12  AA=23 B<=AA AA>12"))
    prints::
        [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']]
    """
    if caseless:
        isequal = ( lambda a,b: a.upper() == b.upper() )
        masks = ( lambda a,b: b.upper().startswith(a.upper()) )
        parseElementClass = CaselessLiteral
    else:
        isequal = ( lambda a,b: a == b )
        masks = ( lambda a,b: b.startswith(a) )
        parseElementClass = Literal

    symbols = []
    if isinstance(strs,basestring):
        symbols = strs.split()
    elif isinstance(strs, collections.Iterable):
        symbols = list(strs)
    else:
        warnings.warn("Invalid argument to oneOf, expected string or iterable",
                SyntaxWarning, stacklevel=2)
    if not symbols:
        return NoMatch()

    i = 0
    while i < len(symbols)-1:
        cur = symbols[i]
        for j,other in enumerate(symbols[i+1:]):
            if ( isequal(other, cur) ):
                del symbols[i+j+1]
                break
            elif ( masks(cur, other) ):
                del symbols[i+j+1]
                symbols.insert(i,other)
                cur = other
                break
        else:
            i += 1

    if not caseless and useRegex:
        #~ print (strs,"->", "|".join( [ _escapeRegexChars(sym) for sym in symbols] ))
        try:
            if len(symbols)==len("".join(symbols)):
                return Regex( "[%s]" % "".join(_escapeRegexRangeChars(sym) for sym in symbols) ).setName(' | '.join(symbols))
            else:
                return Regex( "|".join(re.escape(sym) for sym in symbols) ).setName(' | '.join(symbols))
        except Exception:
            warnings.warn("Exception creating Regex for oneOf, building MatchFirst",
                    SyntaxWarning, stacklevel=2)


    # last resort, just use MatchFirst
    return MatchFirst(parseElementClass(sym) for sym in symbols).setName(' | '.join(symbols))

def dictOf( key, value ):
    """
    Helper to easily and clearly define a dictionary by specifying the respective patterns
    for the key and value.  Takes care of defining the C{L{Dict}}, C{L{ZeroOrMore}}, and C{L{Group}} tokens
    in the proper order.  The key pattern can include delimiting markers or punctuation,
    as long as they are suppressed, thereby leaving the significant key text.  The value
    pattern can include named results, so that the C{Dict} results can include named token
    fields.

    Example::
        text = "shape: SQUARE posn: upper left color: light blue texture: burlap"
        attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
        print(OneOrMore(attr_expr).parseString(text).dump())
        
        attr_label = label
        attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)

        # similar to Dict, but simpler call format
        result = dictOf(attr_label, attr_value).parseString(text)
        print(result.dump())
        print(result['shape'])
        print(result.shape)  # object attribute access works too
        print(result.asDict())
    prints::
        [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']]
        - color: light blue
        - posn: upper left
        - shape: SQUARE
        - texture: burlap
        SQUARE
        SQUARE
        {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'}
    """
    return Dict( ZeroOrMore( Group ( key + value ) ) )

def originalTextFor(expr, asString=True):
    """
    Helper to return the original, untokenized text for a given expression.  Useful to
    restore the parsed fields of an HTML start tag into the raw tag text itself, or to
    revert separate tokens with intervening whitespace back to the original matching
    input text. By default, returns astring containing the original parsed text.  
       
    If the optional C{asString} argument is passed as C{False}, then the return value is a 
    C{L{ParseResults}} containing any results names that were originally matched, and a 
    single token containing the original matched text from the input string.  So if 
    the expression passed to C{L{originalTextFor}} contains expressions with defined
    results names, you must set C{asString} to C{False} if you want to preserve those
    results name values.

    Example::
        src = "this is test <b> bold <i>text</i> </b> normal text "
        for tag in ("b","i"):
            opener,closer = makeHTMLTags(tag)
            patt = originalTextFor(opener + SkipTo(closer) + closer)
            print(patt.searchString(src)[0])
    prints::
        ['<b> bold <i>text</i> </b>']
        ['<i>text</i>']
    """
    locMarker = Empty().setParseAction(lambda s,loc,t: loc)
    endlocMarker = locMarker.copy()
    endlocMarker.callPreparse = False
    matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end")
    if asString:
        extractText = lambda s,l,t: s[t._original_start:t._original_end]
    else:
        def extractText(s,l,t):
            t[:] = [s[t.pop('_original_start'):t.pop('_original_end')]]
    matchExpr.setParseAction(extractText)
    matchExpr.ignoreExprs = expr.ignoreExprs
    return matchExpr

def ungroup(expr): 
    """
    Helper to undo pyparsing's default grouping of And expressions, even
    if all but one are non-empty.
    """
    return TokenConverter(expr).setParseAction(lambda t:t[0])

def locatedExpr(expr):
    """
    Helper to decorate a returned token with its starting and ending locations in the input string.
    This helper adds the following results names:
     - locn_start = location where matched expression begins
     - locn_end = location where matched expression ends
     - value = the actual parsed results

    Be careful if the input text contains C{<TAB>} characters, you may want to call
    C{L{ParserElement.parseWithTabs}}

    Example::
        wd = Word(alphas)
        for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"):
            print(match)
    prints::
        [[0, 'ljsdf', 5]]
        [[8, 'lksdjjf', 15]]
        [[18, 'lkkjj', 23]]
    """
    locator = Empty().setParseAction(lambda s,l,t: l)
    return Group(locator("locn_start") + expr("value") + locator.copy().leaveWhitespace()("locn_end"))


# convenience constants for positional expressions
empty       = Empty().setName("empty")
lineStart   = LineStart().setName("lineStart")
lineEnd     = LineEnd().setName("lineEnd")
stringStart = StringStart().setName("stringStart")
stringEnd   = StringEnd().setName("stringEnd")

_escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(lambda s,l,t:t[0][1])
_escapedHexChar = Regex(r"\\0?[xX][0-9a-fA-F]+").setParseAction(lambda s,l,t:unichr(int(t[0].lstrip(r'\0x'),16)))
_escapedOctChar = Regex(r"\\0[0-7]+").setParseAction(lambda s,l,t:unichr(int(t[0][1:],8)))
_singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | Word(printables, excludeChars=r'\]', exact=1) | Regex(r"\w", re.UNICODE)
_charRange = Group(_singleChar + Suppress("-") + _singleChar)
_reBracketExpr = Literal("[") + Optional("^").setResultsName("negate") + Group( OneOrMore( _charRange | _singleChar ) ).setResultsName("body") + "]"

def srange(s):
    r"""
    Helper to easily define string ranges for use in Word construction.  Borrows
    syntax from regexp '[]' string range definitions::
        srange("[0-9]")   -> "0123456789"
        srange("[a-z]")   -> "abcdefghijklmnopqrstuvwxyz"
        srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_"
    The input string must be enclosed in []'s, and the returned string is the expanded
    character set joined into a single string.
    The values enclosed in the []'s may be:
     - a single character
     - an escaped character with a leading backslash (such as C{\-} or C{\]})
     - an escaped hex character with a leading C{'\x'} (C{\x21}, which is a C{'!'} character) 
         (C{\0x##} is also supported for backwards compatibility) 
     - an escaped octal character with a leading C{'\0'} (C{\041}, which is a C{'!'} character)
     - a range of any of the above, separated by a dash (C{'a-z'}, etc.)
     - any combination of the above (C{'aeiouy'}, C{'a-zA-Z0-9_$'}, etc.)
    """
    _expanded = lambda p: p if not isinstance(p,ParseResults) else ''.join(unichr(c) for c in range(ord(p[0]),ord(p[1])+1))
    try:
        return "".join(_expanded(part) for part in _reBracketExpr.parseString(s).body)
    except Exception:
        return ""

def matchOnlyAtCol(n):
    """
    Helper method for defining parse actions that require matching at a specific
    column in the input text.
    """
    def verifyCol(strg,locn,toks):
        if col(locn,strg) != n:
            raise ParseException(strg,locn,"matched token not at column %d" % n)
    return verifyCol

def replaceWith(replStr):
    """
    Helper method for common parse actions that simply return a literal value.  Especially
    useful when used with C{L{transformString<ParserElement.transformString>}()}.

    Example::
        num = Word(nums).setParseAction(lambda toks: int(toks[0]))
        na = oneOf("N/A NA").setParseAction(replaceWith(math.nan))
        term = na | num
        
        OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234]
    """
    return lambda s,l,t: [replStr]

def removeQuotes(s,l,t):
    """
    Helper parse action for removing quotation marks from parsed quoted strings.

    Example::
        # by default, quotation marks are included in parsed results
        quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"]

        # use removeQuotes to strip quotation marks from parsed results
        quotedString.setParseAction(removeQuotes)
        quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"]
    """
    return t[0][1:-1]

def tokenMap(func, *args):
    """
    Helper to define a parse action by mapping a function to all elements of a ParseResults list.If any additional 
    args are passed, they are forwarded to the given function as additional arguments after
    the token, as in C{hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))}, which will convert the
    parsed data to an integer using base 16.

    Example (compare the last to example in L{ParserElement.transformString}::
        hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16))
        hex_ints.runTests('''
            00 11 22 aa FF 0a 0d 1a
            ''')
        
        upperword = Word(alphas).setParseAction(tokenMap(str.upper))
        OneOrMore(upperword).runTests('''
            my kingdom for a horse
            ''')

        wd = Word(alphas).setParseAction(tokenMap(str.title))
        OneOrMore(wd).setParseAction(' '.join).runTests('''
            now is the winter of our discontent made glorious summer by this sun of york
            ''')
    prints::
        00 11 22 aa FF 0a 0d 1a
        [0, 17, 34, 170, 255, 10, 13, 26]

        my kingdom for a horse
        ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE']

        now is the winter of our discontent made glorious summer by this sun of york
        ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York']
    """
    def pa(s,l,t):
        return [func(tokn, *args) for tokn in t]

    try:
        func_name = getattr(func, '__name__', 
                            getattr(func, '__class__').__name__)
    except Exception:
        func_name = str(func)
    pa.__name__ = func_name

    return pa

upcaseTokens = tokenMap(lambda t: _ustr(t).upper())
"""(Deprecated) Helper parse action to convert tokens to upper case. Deprecated in favor of L{pyparsing_common.upcaseTokens}"""

downcaseTokens = tokenMap(lambda t: _ustr(t).lower())
"""(Deprecated) Helper parse action to convert tokens to lower case. Deprecated in favor of L{pyparsing_common.downcaseTokens}"""
    
def _makeTags(tagStr, xml):
    """Internal helper to construct opening and closing tag expressions, given a tag name"""
    if isinstance(tagStr,basestring):
        resname = tagStr
        tagStr = Keyword(tagStr, caseless=not xml)
    else:
        resname = tagStr.name

    tagAttrName = Word(alphas,alphanums+"_-:")
    if (xml):
        tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes )
        openTag = Suppress("<") + tagStr("tag") + \
                Dict(ZeroOrMore(Group( tagAttrName + Suppress("=") + tagAttrValue ))) + \
                Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">")
    else:
        printablesLessRAbrack = "".join(c for c in printables if c not in ">")
        tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printablesLessRAbrack)
        openTag = Suppress("<") + tagStr("tag") + \
                Dict(ZeroOrMore(Group( tagAttrName.setParseAction(downcaseTokens) + \
                Optional( Suppress("=") + tagAttrValue ) ))) + \
                Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">")
    closeTag = Combine(_L("</") + tagStr + ">")

    openTag = openTag.setResultsName("start"+"".join(resname.replace(":"," ").title().split())).setName("<%s>" % resname)
    closeTag = closeTag.setResultsName("end"+"".join(resname.replace(":"," ").title().split())).setName("</%s>" % resname)
    openTag.tag = resname
    closeTag.tag = resname
    return openTag, closeTag

def makeHTMLTags(tagStr):
    """
    Helper to construct opening and closing tag expressions for HTML, given a tag name. Matches
    tags in either upper or lower case, attributes with namespaces and with quoted or unquoted values.

    Example::
        text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>'
        # makeHTMLTags returns pyparsing expressions for the opening and closing tags as a 2-tuple
        a,a_end = makeHTMLTags("A")
        link_expr = a + SkipTo(a_end)("link_text") + a_end
        
        for link in link_expr.searchString(text):
            # attributes in the <A> tag (like "href" shown here) are also accessible as named results
            print(link.link_text, '->', link.href)
    prints::
        pyparsing -> http://pyparsing.wikispaces.com
    """
    return _makeTags( tagStr, False )

def makeXMLTags(tagStr):
    """
    Helper to construct opening and closing tag expressions for XML, given a tag name. Matches
    tags only in the given upper/lower case.

    Example: similar to L{makeHTMLTags}
    """
    return _makeTags( tagStr, True )

def withAttribute(*args,**attrDict):
    """
    Helper to create a validating parse action to be used with start tags created
    with C{L{makeXMLTags}} or C{L{makeHTMLTags}}. Use C{withAttribute} to qualify a starting tag
    with a required attribute value, to avoid false matches on common tags such as
    C{<TD>} or C{<DIV>}.

    Call C{withAttribute} with a series of attribute names and values. Specify the list
    of filter attributes names and values as:
     - keyword arguments, as in C{(align="right")}, or
     - as an explicit dict with C{**} operator, when an attribute name is also a Python
          reserved word, as in C{**{"class":"Customer", "align":"right"}}
     - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") )
    For attribute names with a namespace prefix, you must use the second form.  Attribute
    names are matched insensitive to upper/lower case.
       
    If just testing for C{class} (with or without a namespace), use C{L{withClass}}.

    To verify that the attribute exists, but without specifying a value, pass
    C{withAttribute.ANY_VALUE} as the value.

    Example::
        html = '''
            <div>
            Some text
            <div type="grid">1 4 0 1 0</div>
            <div type="graph">1,3 2,3 1,1</div>
            <div>this has no type</div>
            </div>
                
        '''
        div,div_end = makeHTMLTags("div")

        # only match div tag having a type attribute with value "grid"
        div_grid = div().setParseAction(withAttribute(type="grid"))
        grid_expr = div_grid + SkipTo(div | div_end)("body")
        for grid_header in grid_expr.searchString(html):
            print(grid_header.body)
        
        # construct a match with any div tag having a type attribute, regardless of the value
        div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE))
        div_expr = div_any_type + SkipTo(div | div_end)("body")
        for div_header in div_expr.searchString(html):
            print(div_header.body)
    prints::
        1 4 0 1 0

        1 4 0 1 0
        1,3 2,3 1,1
    """
    if args:
        attrs = args[:]
    else:
        attrs = attrDict.items()
    attrs = [(k,v) for k,v in attrs]
    def pa(s,l,tokens):
        for attrName,attrValue in attrs:
            if attrName not in tokens:
                raise ParseException(s,l,"no matching attribute " + attrName)
            if attrValue != withAttribute.ANY_VALUE and tokens[attrName] != attrValue:
                raise ParseException(s,l,"attribute '%s' has value '%s', must be '%s'" %
                                            (attrName, tokens[attrName], attrValue))
    return pa
withAttribute.ANY_VALUE = object()

def withClass(classname, namespace=''):
    """
    Simplified version of C{L{withAttribute}} when matching on a div class - made
    difficult because C{class} is a reserved word in Python.

    Example::
        html = '''
            <div>
            Some text
            <div class="grid">1 4 0 1 0</div>
            <div class="graph">1,3 2,3 1,1</div>
            <div>this &lt;div&gt; has no class</div>
            </div>
                
        '''
        div,div_end = makeHTMLTags("div")
        div_grid = div().setParseAction(withClass("grid"))
        
        grid_expr = div_grid + SkipTo(div | div_end)("body")
        for grid_header in grid_expr.searchString(html):
            print(grid_header.body)
        
        div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE))
        div_expr = div_any_type + SkipTo(div | div_end)("body")
        for div_header in div_expr.searchString(html):
            print(div_header.body)
    prints::
        1 4 0 1 0

        1 4 0 1 0
        1,3 2,3 1,1
    """
    classattr = "%s:class" % namespace if namespace else "class"
    return withAttribute(**{classattr : classname})        

opAssoc = _Constants()
opAssoc.LEFT = object()
opAssoc.RIGHT = object()

def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ):
    """
    Helper method for constructing grammars of expressions made up of
    operators working in a precedence hierarchy.  Operators may be unary or
    binary, left- or right-associative.  Parse actions can also be attached
    to operator expressions. The generated parser will also recognize the use 
    of parentheses to override operator precedences (see example below).
    
    Note: if you define a deep operator list, you may see performance issues
    when using infixNotation. See L{ParserElement.enablePackrat} for a
    mechanism to potentially improve your parser performance.

    Parameters:
     - baseExpr - expression representing the most basic element for the nested
     - opList - list of tuples, one for each operator precedence level in the
      expression grammar; each tuple is of the form
      (opExpr, numTerms, rightLeftAssoc, parseAction), where:
       - opExpr is the pyparsing expression for the operator;
          may also be a string, which will be converted to a Literal;
          if numTerms is 3, opExpr is a tuple of two expressions, for the
          two operators separating the 3 terms
       - numTerms is the number of terms for this operator (must
          be 1, 2, or 3)
       - rightLeftAssoc is the indicator whether the operator is
          right or left associative, using the pyparsing-defined
          constants C{opAssoc.RIGHT} and C{opAssoc.LEFT}.
       - parseAction is the parse action to be associated with
          expressions matching this operator expression (the
          parse action tuple member may be omitted)
     - lpar - expression for matching left-parentheses (default=C{Suppress('(')})
     - rpar - expression for matching right-parentheses (default=C{Suppress(')')})

    Example::
        # simple example of four-function arithmetic with ints and variable names
        integer = pyparsing_common.signed_integer
        varname = pyparsing_common.identifier 
        
        arith_expr = infixNotation(integer | varname,
            [
            ('-', 1, opAssoc.RIGHT),
            (oneOf('* /'), 2, opAssoc.LEFT),
            (oneOf('+ -'), 2, opAssoc.LEFT),
            ])
        
        arith_expr.runTests('''
            5+3*6
            (5+3)*6
            -2--11
            ''', fullDump=False)
    prints::
        5+3*6
        [[5, '+', [3, '*', 6]]]

        (5+3)*6
        [[[5, '+', 3], '*', 6]]

        -2--11
        [[['-', 2], '-', ['-', 11]]]
    """
    ret = Forward()
    lastExpr = baseExpr | ( lpar + ret + rpar )
    for i,operDef in enumerate(opList):
        opExpr,arity,rightLeftAssoc,pa = (operDef + (None,))[:4]
        termName = "%s term" % opExpr if arity < 3 else "%s%s term" % opExpr
        if arity == 3:
            if opExpr is None or len(opExpr) != 2:
                raise ValueError("if numterms=3, opExpr must be a tuple or list of two expressions")
            opExpr1, opExpr2 = opExpr
        thisExpr = Forward().setName(termName)
        if rightLeftAssoc == opAssoc.LEFT:
            if arity == 1:
                matchExpr = FollowedBy(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) )
            elif arity == 2:
                if opExpr is not None:
                    matchExpr = FollowedBy(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) )
                else:
                    matchExpr = FollowedBy(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) )
            elif arity == 3:
                matchExpr = FollowedBy(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \
                            Group( lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr )
            else:
                raise ValueError("operator must be unary (1), binary (2), or ternary (3)")
        elif rightLeftAssoc == opAssoc.RIGHT:
            if arity == 1:
                # try to avoid LR with this extra test
                if not isinstance(opExpr, Optional):
                    opExpr = Optional(opExpr)
                matchExpr = FollowedBy(opExpr.expr + thisExpr) + Group( opExpr + thisExpr )
            elif arity == 2:
                if opExpr is not None:
                    matchExpr = FollowedBy(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) )
                else:
                    matchExpr = FollowedBy(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) )
            elif arity == 3:
                matchExpr = FollowedBy(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \
                            Group( lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr )
            else:
                raise ValueError("operator must be unary (1), binary (2), or ternary (3)")
        else:
            raise ValueError("operator must indicate right or left associativity")
        if pa:
            matchExpr.setParseAction( pa )
        thisExpr <<= ( matchExpr.setName(termName) | lastExpr )
        lastExpr = thisExpr
    ret <<= lastExpr
    return ret

operatorPrecedence = infixNotation
"""(Deprecated) Former name of C{L{infixNotation}}, will be dropped in a future release."""

dblQuotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"').setName("string enclosed in double quotes")
sglQuotedString = Combine(Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("string enclosed in single quotes")
quotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"'|
                       Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("quotedString using single or double quotes")
unicodeString = Combine(_L('u') + quotedString.copy()).setName("unicode string literal")

def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()):
    """
    Helper method for defining nested lists enclosed in opening and closing
    delimiters ("(" and ")" are the default).

    Parameters:
     - opener - opening character for a nested list (default=C{"("}); can also be a pyparsing expression
     - closer - closing character for a nested list (default=C{")"}); can also be a pyparsing expression
     - content - expression for items within the nested lists (default=C{None})
     - ignoreExpr - expression for ignoring opening and closing delimiters (default=C{quotedString})

    If an expression is not provided for the content argument, the nested
    expression will capture all whitespace-delimited content between delimiters
    as a list of separate values.

    Use the C{ignoreExpr} argument to define expressions that may contain
    opening or closing characters that should not be treated as opening
    or closing characters for nesting, such as quotedString or a comment
    expression.  Specify multiple expressions using an C{L{Or}} or C{L{MatchFirst}}.
    The default is L{quotedString}, but if no expressions are to be ignored,
    then pass C{None} for this argument.

    Example::
        data_type = oneOf("void int short long char float double")
        decl_data_type = Combine(data_type + Optional(Word('*')))
        ident = Word(alphas+'_', alphanums+'_')
        number = pyparsing_common.number
        arg = Group(decl_data_type + ident)
        LPAR,RPAR = map(Suppress, "()")

        code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment))

        c_function = (decl_data_type("type") 
                      + ident("name")
                      + LPAR + Optional(delimitedList(arg), [])("args") + RPAR 
                      + code_body("body"))
        c_function.ignore(cStyleComment)
        
        source_code = '''
            int is_odd(int x) { 
                return (x%2); 
            }
                
            int dec_to_hex(char hchar) { 
                if (hchar >= '0' && hchar <= '9') { 
                    return (ord(hchar)-ord('0')); 
                } else { 
                    return (10+ord(hchar)-ord('A'));
                } 
            }
        '''
        for func in c_function.searchString(source_code):
            print("%(name)s (%(type)s) args: %(args)s" % func)

    prints::
        is_odd (int) args: [['int', 'x']]
        dec_to_hex (int) args: [['char', 'hchar']]
    """
    if opener == closer:
        raise ValueError("opening and closing strings cannot be the same")
    if content is None:
        if isinstance(opener,basestring) and isinstance(closer,basestring):
            if len(opener) == 1 and len(closer)==1:
                if ignoreExpr is not None:
                    content = (Combine(OneOrMore(~ignoreExpr +
                                    CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS,exact=1))
                                ).setParseAction(lambda t:t[0].strip()))
                else:
                    content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS
                                ).setParseAction(lambda t:t[0].strip()))
            else:
                if ignoreExpr is not None:
                    content = (Combine(OneOrMore(~ignoreExpr + 
                                    ~Literal(opener) + ~Literal(closer) +
                                    CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1))
                                ).setParseAction(lambda t:t[0].strip()))
                else:
                    content = (Combine(OneOrMore(~Literal(opener) + ~Literal(closer) +
                                    CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1))
                                ).setParseAction(lambda t:t[0].strip()))
        else:
            raise ValueError("opening and closing arguments must be strings if no content expression is given")
    ret = Forward()
    if ignoreExpr is not None:
        ret <<= Group( Suppress(opener) + ZeroOrMore( ignoreExpr | ret | content ) + Suppress(closer) )
    else:
        ret <<= Group( Suppress(opener) + ZeroOrMore( ret | content )  + Suppress(closer) )
    ret.setName('nested %s%s expression' % (opener,closer))
    return ret

def indentedBlock(blockStatementExpr, indentStack, indent=True):
    """
    Helper method for defining space-delimited indentation blocks, such as
    those used to define block statements in Python source code.

    Parameters:
     - blockStatementExpr - expression defining syntax of statement that
            is repeated within the indented block
     - indentStack - list created by caller to manage indentation stack
            (multiple statementWithIndentedBlock expressions within a single grammar
            should share a common indentStack)
     - indent - boolean indicating whether block must be indented beyond the
            the current level; set to False for block of left-most statements
            (default=C{True})

    A valid block must contain at least one C{blockStatement}.

    Example::
        data = '''
        def A(z):
          A1
          B = 100
          G = A2
          A2
          A3
        B
        def BB(a,b,c):
          BB1
          def BBA():
            bba1
            bba2
            bba3
        C
        D
        def spam(x,y):
             def eggs(z):
                 pass
        '''


        indentStack = [1]
        stmt = Forward()

        identifier = Word(alphas, alphanums)
        funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":")
        func_body = indentedBlock(stmt, indentStack)
        funcDef = Group( funcDecl + func_body )

        rvalue = Forward()
        funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")")
        rvalue << (funcCall | identifier | Word(nums))
        assignment = Group(identifier + "=" + rvalue)
        stmt << ( funcDef | assignment | identifier )

        module_body = OneOrMore(stmt)

        parseTree = module_body.parseString(data)
        parseTree.pprint()
    prints::
        [['def',
          'A',
          ['(', 'z', ')'],
          ':',
          [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]],
         'B',
         ['def',
          'BB',
          ['(', 'a', 'b', 'c', ')'],
          ':',
          [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]],
         'C',
         'D',
         ['def',
          'spam',
          ['(', 'x', 'y', ')'],
          ':',
          [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] 
    """
    def checkPeerIndent(s,l,t):
        if l >= len(s): return
        curCol = col(l,s)
        if curCol != indentStack[-1]:
            if curCol > indentStack[-1]:
                raise ParseFatalException(s,l,"illegal nesting")
            raise ParseException(s,l,"not a peer entry")

    def checkSubIndent(s,l,t):
        curCol = col(l,s)
        if curCol > indentStack[-1]:
            indentStack.append( curCol )
        else:
            raise ParseException(s,l,"not a subentry")

    def checkUnindent(s,l,t):
        if l >= len(s): return
        curCol = col(l,s)
        if not(indentStack and curCol < indentStack[-1] and curCol <= indentStack[-2]):
            raise ParseException(s,l,"not an unindent")
        indentStack.pop()

    NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress())
    INDENT = (Empty() + Empty().setParseAction(checkSubIndent)).setName('INDENT')
    PEER   = Empty().setParseAction(checkPeerIndent).setName('')
    UNDENT = Empty().setParseAction(checkUnindent).setName('UNINDENT')
    if indent:
        smExpr = Group( Optional(NL) +
            #~ FollowedBy(blockStatementExpr) +
            INDENT + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) + UNDENT)
    else:
        smExpr = Group( Optional(NL) +
            (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) )
    blockStatementExpr.ignore(_bslash + LineEnd())
    return smExpr.setName('indented block')

alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]")
punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]")

anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:").setName('any tag'))
_htmlEntityMap = dict(zip("gt lt amp nbsp quot apos".split(),'><& "\''))
commonHTMLEntity = Regex('&(?P<entity>' + '|'.join(_htmlEntityMap.keys()) +");").setName("common HTML entity")
def replaceHTMLEntity(t):
    """Helper parser action to replace common HTML entities with their special characters"""
    return _htmlEntityMap.get(t.entity)

# it's easy to get these comment structures wrong - they're very common, so may as well make them available
cStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/').setName("C style comment")
"Comment of the form C{/* ... */}"

htmlComment = Regex(r"<!--[\s\S]*?-->").setName("HTML comment")
"Comment of the form C{<!-- ... -->}"

restOfLine = Regex(r".*").leaveWhitespace().setName("rest of line")
dblSlashComment = Regex(r"//(?:\\\n|[^\n])*").setName("// comment")
"Comment of the form C{// ... (to end of line)}"

cppStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/'| dblSlashComment).setName("C++ style comment")
"Comment of either form C{L{cStyleComment}} or C{L{dblSlashComment}}"

javaStyleComment = cppStyleComment
"Same as C{L{cppStyleComment}}"

pythonStyleComment = Regex(r"#.*").setName("Python style comment")
"Comment of the form C{# ... (to end of line)}"

_commasepitem = Combine(OneOrMore(Word(printables, excludeChars=',') +
                                  Optional( Word(" \t") +
                                            ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem")
commaSeparatedList = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("commaSeparatedList")
"""(Deprecated) Predefined expression of 1 or more printable words or quoted strings, separated by commas.
   This expression is deprecated in favor of L{pyparsing_common.comma_separated_list}."""

# some other useful expressions - using lower-case class name since we are really using this as a namespace
class pyparsing_common:
    """
    Here are some common low-level expressions that may be useful in jump-starting parser development:
     - numeric forms (L{integers<integer>}, L{reals<real>}, L{scientific notation<sci_real>})
     - common L{programming identifiers<identifier>}
     - network addresses (L{MAC<mac_address>}, L{IPv4<ipv4_address>}, L{IPv6<ipv6_address>})
     - ISO8601 L{dates<iso8601_date>} and L{datetime<iso8601_datetime>}
     - L{UUID<uuid>}
     - L{comma-separated list<comma_separated_list>}
    Parse actions:
     - C{L{convertToInteger}}
     - C{L{convertToFloat}}
     - C{L{convertToDate}}
     - C{L{convertToDatetime}}
     - C{L{stripHTMLTags}}
     - C{L{upcaseTokens}}
     - C{L{downcaseTokens}}

    Example::
        pyparsing_common.number.runTests('''
            # any int or real number, returned as the appropriate type
            100
            -100
            +100
            3.14159
            6.02e23
            1e-12
            ''')

        pyparsing_common.fnumber.runTests('''
            # any int or real number, returned as float
            100
            -100
            +100
            3.14159
            6.02e23
            1e-12
            ''')

        pyparsing_common.hex_integer.runTests('''
            # hex numbers
            100
            FF
            ''')

        pyparsing_common.fraction.runTests('''
            # fractions
            1/2
            -3/4
            ''')

        pyparsing_common.mixed_integer.runTests('''
            # mixed fractions
            1
            1/2
            -3/4
            1-3/4
            ''')

        import uuid
        pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID))
        pyparsing_common.uuid.runTests('''
            # uuid
            12345678-1234-5678-1234-567812345678
            ''')
    prints::
        # any int or real number, returned as the appropriate type
        100
        [100]

        -100
        [-100]

        +100
        [100]

        3.14159
        [3.14159]

        6.02e23
        [6.02e+23]

        1e-12
        [1e-12]

        # any int or real number, returned as float
        100
        [100.0]

        -100
        [-100.0]

        +100
        [100.0]

        3.14159
        [3.14159]

        6.02e23
        [6.02e+23]

        1e-12
        [1e-12]

        # hex numbers
        100
        [256]

        FF
        [255]

        # fractions
        1/2
        [0.5]

        -3/4
        [-0.75]

        # mixed fractions
        1
        [1]

        1/2
        [0.5]

        -3/4
        [-0.75]

        1-3/4
        [1.75]

        # uuid
        12345678-1234-5678-1234-567812345678
        [UUID('12345678-1234-5678-1234-567812345678')]
    """

    convertToInteger = tokenMap(int)
    """
    Parse action for converting parsed integers to Python int
    """

    convertToFloat = tokenMap(float)
    """
    Parse action for converting parsed numbers to Python float
    """

    integer = Word(nums).setName("integer").setParseAction(convertToInteger)
    """expression that parses an unsigned integer, returns an int"""

    hex_integer = Word(hexnums).setName("hex integer").setParseAction(tokenMap(int,16))
    """expression that parses a hexadecimal integer, returns an int"""

    signed_integer = Regex(r'[+-]?\d+').setName("signed integer").setParseAction(convertToInteger)
    """expression that parses an integer with optional leading sign, returns an int"""

    fraction = (signed_integer().setParseAction(convertToFloat) + '/' + signed_integer().setParseAction(convertToFloat)).setName("fraction")
    """fractional expression of an integer divided by an integer, returns a float"""
    fraction.addParseAction(lambda t: t[0]/t[-1])

    mixed_integer = (fraction | signed_integer + Optional(Optional('-').suppress() + fraction)).setName("fraction or mixed integer-fraction")
    """mixed integer of the form 'integer - fraction', with optional leading integer, returns float"""
    mixed_integer.addParseAction(sum)

    real = Regex(r'[+-]?\d+\.\d*').setName("real number").setParseAction(convertToFloat)
    """expression that parses a floating point number and returns a float"""

    sci_real = Regex(r'[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)').setName("real number with scientific notation").setParseAction(convertToFloat)
    """expression that parses a floating point number with optional scientific notation and returns a float"""

    # streamlining this expression makes the docs nicer-looking
    number = (sci_real | real | signed_integer).streamline()
    """any numeric expression, returns the corresponding Python type"""

    fnumber = Regex(r'[+-]?\d+\.?\d*([eE][+-]?\d+)?').setName("fnumber").setParseAction(convertToFloat)
    """any int or real number, returned as float"""
    
    identifier = Word(alphas+'_', alphanums+'_').setName("identifier")
    """typical code identifier (leading alpha or '_', followed by 0 or more alphas, nums, or '_')"""
    
    ipv4_address = Regex(r'(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}').setName("IPv4 address")
    "IPv4 address (C{0.0.0.0 - 255.255.255.255})"

    _ipv6_part = Regex(r'[0-9a-fA-F]{1,4}').setName("hex_integer")
    _full_ipv6_address = (_ipv6_part + (':' + _ipv6_part)*7).setName("full IPv6 address")
    _short_ipv6_address = (Optional(_ipv6_part + (':' + _ipv6_part)*(0,6)) + "::" + Optional(_ipv6_part + (':' + _ipv6_part)*(0,6))).setName("short IPv6 address")
    _short_ipv6_address.addCondition(lambda t: sum(1 for tt in t if pyparsing_common._ipv6_part.matches(tt)) < 8)
    _mixed_ipv6_address = ("::ffff:" + ipv4_address).setName("mixed IPv6 address")
    ipv6_address = Combine((_full_ipv6_address | _mixed_ipv6_address | _short_ipv6_address).setName("IPv6 address")).setName("IPv6 address")
    "IPv6 address (long, short, or mixed form)"
    
    mac_address = Regex(r'[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}').setName("MAC address")
    "MAC address xx:xx:xx:xx:xx (may also have '-' or '.' delimiters)"

    @staticmethod
    def convertToDate(fmt="%Y-%m-%d"):
        """
        Helper to create a parse action for converting parsed date string to Python datetime.date

        Params -
         - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%d"})

        Example::
            date_expr = pyparsing_common.iso8601_date.copy()
            date_expr.setParseAction(pyparsing_common.convertToDate())
            print(date_expr.parseString("1999-12-31"))
        prints::
            [datetime.date(1999, 12, 31)]
        """
        def cvt_fn(s,l,t):
            try:
                return datetime.strptime(t[0], fmt).date()
            except ValueError as ve:
                raise ParseException(s, l, str(ve))
        return cvt_fn

    @staticmethod
    def convertToDatetime(fmt="%Y-%m-%dT%H:%M:%S.%f"):
        """
        Helper to create a parse action for converting parsed datetime string to Python datetime.datetime

        Params -
         - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%dT%H:%M:%S.%f"})

        Example::
            dt_expr = pyparsing_common.iso8601_datetime.copy()
            dt_expr.setParseAction(pyparsing_common.convertToDatetime())
            print(dt_expr.parseString("1999-12-31T23:59:59.999"))
        prints::
            [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)]
        """
        def cvt_fn(s,l,t):
            try:
                return datetime.strptime(t[0], fmt)
            except ValueError as ve:
                raise ParseException(s, l, str(ve))
        return cvt_fn

    iso8601_date = Regex(r'(?P<year>\d{4})(?:-(?P<month>\d\d)(?:-(?P<day>\d\d))?)?').setName("ISO8601 date")
    "ISO8601 date (C{yyyy-mm-dd})"

    iso8601_datetime = Regex(r'(?P<year>\d{4})-(?P<month>\d\d)-(?P<day>\d\d)[T ](?P<hour>\d\d):(?P<minute>\d\d)(:(?P<second>\d\d(\.\d*)?)?)?(?P<tz>Z|[+-]\d\d:?\d\d)?').setName("ISO8601 datetime")
    "ISO8601 datetime (C{yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)}) - trailing seconds, milliseconds, and timezone optional; accepts separating C{'T'} or C{' '}"

    uuid = Regex(r'[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}').setName("UUID")
    "UUID (C{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx})"

    _html_stripper = anyOpenTag.suppress() | anyCloseTag.suppress()
    @staticmethod
    def stripHTMLTags(s, l, tokens):
        """
        Parse action to remove HTML tags from web page HTML source

        Example::
            # strip HTML links from normal text 
            text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>'
            td,td_end = makeHTMLTags("TD")
            table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end
            
            print(table_text.parseString(text).body) # -> 'More info at the pyparsing wiki page'
        """
        return pyparsing_common._html_stripper.transformString(tokens[0])

    _commasepitem = Combine(OneOrMore(~Literal(",") + ~LineEnd() + Word(printables, excludeChars=',') 
                                        + Optional( White(" \t") ) ) ).streamline().setName("commaItem")
    comma_separated_list = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("comma separated list")
    """Predefined expression of 1 or more printable words or quoted strings, separated by commas."""

    upcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).upper()))
    """Parse action to convert tokens to upper case."""

    downcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).lower()))
    """Parse action to convert tokens to lower case."""


if __name__ == "__main__":

    selectToken    = CaselessLiteral("select")
    fromToken      = CaselessLiteral("from")

    ident          = Word(alphas, alphanums + "_$")

    columnName     = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens)
    columnNameList = Group(delimitedList(columnName)).setName("columns")
    columnSpec     = ('*' | columnNameList)

    tableName      = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens)
    tableNameList  = Group(delimitedList(tableName)).setName("tables")
    
    simpleSQL      = selectToken("command") + columnSpec("columns") + fromToken + tableNameList("tables")

    # demo runTests method, including embedded comments in test string
    simpleSQL.runTests("""
        # '*' as column list and dotted table name
        select * from SYS.XYZZY

        # caseless match on "SELECT", and casts back to "select"
        SELECT * from XYZZY, ABC

        # list of column names, and mixed case SELECT keyword
        Select AA,BB,CC from Sys.dual

        # multiple tables
        Select A, B, C from Sys.dual, Table2

        # invalid SELECT keyword - should fail
        Xelect A, B, C from Sys.dual

        # incomplete command - should fail
        Select

        # invalid column name - should fail
        Select ^^^ frox Sys.dual

        """)

    pyparsing_common.number.runTests("""
        100
        -100
        +100
        3.14159
        6.02e23
        1e-12
        """)

    # any int or real number, returned as float
    pyparsing_common.fnumber.runTests("""
        100
        -100
        +100
        3.14159
        6.02e23
        1e-12
        """)

    pyparsing_common.hex_integer.runTests("""
        100
        FF
        """)

    import uuid
    pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID))
    pyparsing_common.uuid.runTests("""
        12345678-1234-5678-1234-567812345678
        """)
_vendor/__init__.py000064400000000000151733474000010303 0ustar00_vendor/__init__.pyo000064400000000226151733474000010474 0ustar00�
�fc@sdS(N((((s?/usr/lib/python2.7/site-packages/setuptools/_vendor/__init__.pyt<module>t_vendor/pyparsing.pyo000064400000707266151733474000010773 0ustar00�
�fci@sdZdZdZdZddlZddlmZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlmZyddlmZWn!ek
r�ddlmZnXydd	l
mZWn?ek
r=ydd	lmZWnek
r9eZnXnXd
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrgiZee	j�ds ZedtdskZer�e	jZ e!Z"e#Z$e!Z%e&e'e(e)e*ee+e,e-e.e/gZ0nre	j1Z e2Z3du�Z%gZ0ddl4Z4xEdvj5�D]7Z6ye0j7e8e4e6��Wne9k
rZq$nXq$We:dw�e3dx�D��Z;dy�Z<dze=fd{��YZ>ej?ej@ZAd|ZBeBd}ZCeAeBZDe#d~�ZEdjFd��ejGD��ZHd!eIfd���YZJd#eJfd���YZKd%eJfd���YZLd'eLfd���YZMd*eIfd���YZNd�e=fd���YZOd&e=fd���YZPe
jQjReP�d��ZSd��ZTd��ZUd��ZVd��ZWd��ZXd��ZYd�d��ZZd(e=fd���YZ[d0e[fd���YZ\de\fd���YZ]de\fd���YZ^de\fd���YZ_e_Z`e_e[_ade\fd���YZbde_fd���YZcdebfd���YZddpe\fd���YZed3e\fd���YZfd+e\fd���YZgd)e\fd���YZhd
e\fd���YZid2e\fd���YZjd�e\fd���YZkdekfd���YZldekfd���YZmdekfd���YZnd.ekfd���YZod-ekfd���YZpd5ekfd���YZqd4ekfd���YZrd$e[fd���YZsd
esfd���YZtd esfd���YZudesfd���YZvdesfd���YZwd"e[fd���YZxdexfd���YZydexfd���YZzd�exfd���YZ{de{fd���YZ|d6e{fd���YZ}d�e=fd���YZ~e~�Zdexfd���YZ�d,exfd���YZ�dexfd���YZ�d�e�fd���YZ�d1exfd���YZ�de�fd���YZ�de�fd���YZ�de�fd���YZ�d/e�fd���YZ�de=fd���YZ�d��Z�d�e�d��Z�ed��Z�d��Z�d��Z�d��Z�d��Z�e�e�d��Z�d��Z�e�d��Z�d��Z�d��Z�e]�j�dG�Z�em�j�dM�Z�en�j�dL�Z�eo�j�de�Z�ep�j�dd�Z�efeEd�d�d��j�d���Z�egd��j�d���Z�egd��j�d���Z�e�e�Be�BefeHd�d�d�dx�Begd�ej��BZ�e�e�e�d��e��Z�e_d��e�d��j�d��e�e|e�e�B��j�d��d�Z�d��Z�d��Z�d��Z�d��Z�d��Z�e�d���Z�e�d���Z�d��Z�d��Z�d��Z�d��Z�e=�e�_�dd��Z�e>�Z�e=�e�_�e=�e�_�e�d��e�d��d��Z�e�Z�e�egd��d��j�d��Z�e�egd��d��j�d��Z�e�egd��d�egd��d�B�j�d��Z�e�e`d��e�j��j�d��Z�d�d�ee�j�d��Z�e�d��Z�e�d��Z�e�d��Z�e�efeAeDd��j�d���\Z�Z�e�e�d�j5�d���Z�egd�djFe�j���d�j�d�Z�d�Z�e�egd�d�j�d�Z�egd�j�d�Z�egd	�j��j�d
�Z�egd�j�d�Z�e�egd�de�B�j�d
�Z�e�Z�egd�j�d�Z�e�e|efeHd�d��e�efd�e_d��en����j��j�d�Z�e�e�e�j�e�Bdd��j�d>�Z�drfd��YZ�e�dkrecd�Z�ecd�Z�efeAeDd�Z�e�e�dde��j�e��Z�e�e�e���j�d�Z�de�BZ�e�e�dde��j�e��Z�e�e�e���j�d�Z�e�d�e�d�e�e�d�Z�e�j�d�e�j�j�d�e�j�j�d�e�j�j�d �ddl�Z�e�j�j�e�e�j���e�j�j�d!�ndS("sS
pyparsing module - Classes and methods to define and execute parsing grammars

The pyparsing module is an alternative approach to creating and executing simple grammars,
vs. the traditional lex/yacc approach, or the use of regular expressions.  With pyparsing, you
don't need to learn a new syntax for defining grammars or matching expressions - the parsing module
provides a library of classes that you use to construct the grammar directly in Python.

Here is a program to parse "Hello, World!" (or any greeting of the form 
C{"<salutation>, <addressee>!"}), built up using L{Word}, L{Literal}, and L{And} elements 
(L{'+'<ParserElement.__add__>} operator gives L{And} expressions, strings are auto-converted to
L{Literal} expressions)::

    from pyparsing import Word, alphas

    # define grammar of a greeting
    greet = Word(alphas) + "," + Word(alphas) + "!"

    hello = "Hello, World!"
    print (hello, "->", greet.parseString(hello))

The program outputs the following::

    Hello, World! -> ['Hello', ',', 'World', '!']

The Python representation of the grammar is quite readable, owing to the self-explanatory
class names, and the use of '+', '|' and '^' operators.

The L{ParseResults} object returned from L{ParserElement.parseString<ParserElement.parseString>} can be accessed as a nested list, a dictionary, or an
object with named attributes.

The pyparsing module handles some of the problems that are typically vexing when writing text parsers:
 - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello  ,  World  !", etc.)
 - quoted strings
 - embedded comments
s2.1.10s07 Oct 2016 01:31 UTCs*Paul McGuire <ptmcg@users.sourceforge.net>i����N(tref(tdatetime(tRLock(tOrderedDicttAndtCaselessKeywordtCaselessLiteralt
CharsNotIntCombinetDicttEachtEmptyt
FollowedBytForwardt
GoToColumntGrouptKeywordtLineEndt	LineStarttLiteralt
MatchFirsttNoMatchtNotAnyt	OneOrMoretOnlyOncetOptionaltOrtParseBaseExceptiontParseElementEnhancetParseExceptiontParseExpressiontParseFatalExceptiontParseResultstParseSyntaxExceptiont
ParserElementtQuotedStringtRecursiveGrammarExceptiontRegextSkipTot	StringEndtStringStarttSuppresstTokentTokenConvertertWhitetWordtWordEndt	WordStartt
ZeroOrMoret	alphanumstalphast
alphas8bittanyCloseTagt
anyOpenTagt
cStyleCommenttcoltcommaSeparatedListtcommonHTMLEntitytcountedArraytcppStyleCommenttdblQuotedStringtdblSlashCommentt
delimitedListtdictOftdowncaseTokenstemptythexnumsthtmlCommenttjavaStyleCommenttlinetlineEndt	lineStarttlinenotmakeHTMLTagstmakeXMLTagstmatchOnlyAtColtmatchPreviousExprtmatchPreviousLiteralt
nestedExprtnullDebugActiontnumstoneOftopAssoctoperatorPrecedencet
printablestpunc8bittpythonStyleCommenttquotedStringtremoveQuotestreplaceHTMLEntitytreplaceWitht
restOfLinetsglQuotedStringtsranget	stringEndtstringStartttraceParseActiont
unicodeStringtupcaseTokenst
withAttributet
indentedBlocktoriginalTextFortungroupt
infixNotationtlocatedExprt	withClasst
CloseMatchttokenMaptpyparsing_commoniicCs}t|t�r|Syt|�SWnUtk
rxt|�jtj�d�}td�}|jd��|j	|�SXdS(sDrop-in replacement for str(obj) that tries to be Unicode friendly. It first tries
           str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It
           then < returns the unicode object | encodes it with the default encoding | ... >.
        txmlcharrefreplaces&#\d+;cSs#dtt|ddd!��dS(Ns\uiii����(thextint(tt((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt<lambda>�tN(
t
isinstancetunicodetstrtUnicodeEncodeErrortencodetsystgetdefaultencodingR%tsetParseActionttransformString(tobjtrett
xmlcharref((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_ustr�s
s6sum len sorted reversed list tuple set any all min maxccs|]}|VqdS(N((t.0ty((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�sicCsRd}d�dj�D�}x/t||�D]\}}|j||�}q,W|S(s/Escape &, <, >, ", ', etc. in a string of data.s&><"'css|]}d|dVqdS(t&t;N((R�ts((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�ssamp gt lt quot apos(tsplittziptreplace(tdatatfrom_symbolst
to_symbolstfrom_tto_((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_xml_escape�s
t
_ConstantscBseZRS((t__name__t
__module__(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��st
0123456789tABCDEFabcdefi\Rrccs$|]}|tjkr|VqdS(N(tstringt
whitespace(R�tc((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�scBs_eZdZdd
d
d�Zed��Zd�Zd�Zd�Z	dd�Z
d	�ZRS(s7base exception class for all parsing runtime exceptionsicCs[||_|dkr*||_d|_n||_||_||_|||f|_dS(NRr(tloctNonetmsgtpstrt
parserElementtargs(tselfR�R�R�telem((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__init__�s					cCs||j|j|j|j�S(s�
        internal factory method to simplify creating one type of ParseException 
        from another - avoids having __init__ signature conflicts among subclasses
        (R�R�R�R�(tclstpe((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_from_exception�scCsm|dkrt|j|j�S|dkr>t|j|j�S|dkr]t|j|j�St|��dS(s�supported attributes by name are:
            - lineno - returns the line number of the exception text
            - col - returns the column number of the exception text
            - line - returns the line containing the exception text
        RHR7tcolumnREN(R7R�(RHR�R�R7REtAttributeError(R�taname((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__getattr__�scCs d|j|j|j|jfS(Ns"%s (at char %d), (line:%d, col:%d)(R�R�RHR�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__str__�scCs
t|�S(N(R(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__repr__�ss>!<cCsI|j}|jd}|r?dj|| |||f�}n|j�S(s�Extracts the exception line from the input string, and marks
           the location of the exception with a special symbol.
        iRr(RER�tjointstrip(R�tmarkerStringtline_strtline_column((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
markInputline�s	

cCsdj�tt|��S(Nslineno col line(R�tdirttype(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__dir__�sN(R�R�t__doc__R�R�tclassmethodR�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s			
cBseZdZRS(sN
    Exception thrown when parse expressions don't match class;
    supported attributes by name are:
     - lineno - returns the line number of the exception text
     - col - returns the column number of the exception text
     - line - returns the line containing the exception text
        
    Example::
        try:
            Word(nums).setName("integer").parseString("ABC")
        except ParseException as pe:
            print(pe)
            print("column: {}".format(pe.col))
            
    prints::
       Expected integer (at char 0), (line:1, col:1)
        column: 1
    (R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�scBseZdZRS(snuser-throwable exception thrown when inconsistent parse content
       is found; stops all parsing immediately(R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscBseZdZRS(s�just like L{ParseFatalException}, but thrown internally when an
       L{ErrorStop<And._ErrorStop>} ('-' operator) indicates that parsing is to stop 
       immediately because an unbacktrackable syntax error has been found(R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR!scBs eZdZd�Zd�ZRS(sZexception thrown by L{ParserElement.validate} if the grammar could be improperly recursivecCs
||_dS(N(tparseElementTrace(R�tparseElementList((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�scCsd|jS(NsRecursiveGrammarException: %s(R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR� s(R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR$s	t_ParseResultsWithOffsetcBs,eZd�Zd�Zd�Zd�ZRS(cCs||f|_dS(N(ttup(R�tp1tp2((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�$scCs|j|S(N(R�(R�ti((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__getitem__&scCst|jd�S(Ni(treprR�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�(scCs|jd|f|_dS(Ni(R�(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt	setOffset*s(R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�#s			cBs�eZdZd-d-eed�Zd-d-eeed�Zd�Zed�Z	d�Z
d�Zd�Zd�Z
e
Zd	�Zd
�Zd�Zd�Zd
�Zer�eZeZeZn-eZeZeZd�Zd�Zd�Zd�Zd�Zd-d�Zd�Zd�Zd�Z d�Z!d�Z"d�Z#d�Z$d�Z%d�Z&d�Z'dd�Z(d �Z)d!�Z*d"�Z+d-e,ded#�Z-d$�Z.d%�Z/dd&ed'�Z0d(�Z1d)�Z2d*�Z3d+�Z4d,�Z5RS(.sI
    Structured parse results, to provide multiple means of access to the parsed data:
       - as a list (C{len(results)})
       - by list index (C{results[0], results[1]}, etc.)
       - by attribute (C{results.<resultsName>} - see L{ParserElement.setResultsName})

    Example::
        integer = Word(nums)
        date_str = (integer.setResultsName("year") + '/' 
                        + integer.setResultsName("month") + '/' 
                        + integer.setResultsName("day"))
        # equivalent form:
        # date_str = integer("year") + '/' + integer("month") + '/' + integer("day")

        # parseString returns a ParseResults object
        result = date_str.parseString("1999/12/31")

        def test(s, fn=repr):
            print("%s -> %s" % (s, fn(eval(s))))
        test("list(result)")
        test("result[0]")
        test("result['month']")
        test("result.day")
        test("'month' in result")
        test("'minutes' in result")
        test("result.dump()", str)
    prints::
        list(result) -> ['1999', '/', '12', '/', '31']
        result[0] -> '1999'
        result['month'] -> '12'
        result.day -> '31'
        'month' in result -> True
        'minutes' in result -> False
        result.dump() -> ['1999', '/', '12', '/', '31']
        - day: 31
        - month: 12
        - year: 1999
    cCs/t||�r|Stj|�}t|_|S(N(Rstobjectt__new__tTruet_ParseResults__doinit(R�ttoklisttnametasListtmodaltretobj((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�Ts
	cCs�|jr�t|_d|_d|_i|_||_||_|dkrTg}n||t�rp||_	n-||t
�r�t|�|_	n|g|_	t�|_n|dk	r�|r�|s�d|j|<n||t
�r�t|�}n||_||td�ttf�o+|ddgfks�||t�rI|g}n|r�||t�rzt|j�d�||<ntt|d�d�||<|||_q�y|d||<Wq�tttfk
r�|||<q�Xq�ndS(NiRr(R�tFalseR�t_ParseResults__namet_ParseResults__parentt_ParseResults__accumNamest_ParseResults__asListt_ParseResults__modaltlistt_ParseResults__toklistt_generatorTypetdictt_ParseResults__tokdictRoRR�t
basestringR R�tcopytKeyErrort	TypeErrort
IndexError(R�R�R�R�R�Rs((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�]sB								
	3cCsnt|ttf�r |j|S||jkrB|j|ddStg|j|D]}|d^qS�SdS(Ni����i(RsRotsliceR�R�R�R (R�R�tv((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s
cCs�||t�rB|jj|t��|g|j|<|d}n`||ttf�rm||j|<|}n5|jj|t��t|d�g|j|<|}||t�r�t|�|_	ndS(Ni(
R�R�tgetR�RoR�R�R twkrefR�(R�tkR�Rstsub((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__setitem__�s&

	/c
Cst|ttf�rt|j�}|j|=t|t�rl|dkrV||7}nt||d�}ntt|j|���}|j�x{|j	j
�D]]\}}xN|D]F}x=t|�D]/\}\}}	t||	|	|k�||<q�Wq�Wq�Wn
|j	|=dS(Nii(
RsRoR�tlenR�R�trangetindicestreverseR�titemst	enumerateR�(
R�R�tmylentremovedR�toccurrencestjR�tvaluetposition((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__delitem__�s



,cCs
||jkS(N(R�(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__contains__�scCs
t|j�S(N(R�R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__len__�RrcCs	|jS(N(R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__bool__�RrcCs
t|j�S(N(titerR�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__iter__�RrcCst|jddd��S(Ni����(R�R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__reversed__�RrcCs0t|jd�r|jj�St|j�SdS(Ntiterkeys(thasattrR�R�R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt	_iterkeys�s
cs�fd��j�D�S(Nc3s|]}�|VqdS(N((R�R�(R�(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�s(R�(R�((R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_itervalues�scs�fd��j�D�S(Nc3s|]}|�|fVqdS(N((R�R�(R�(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�s(R�(R�((R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
_iteritems�scCst|j��S(sVReturns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x).(R�R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytkeys�scCst|j��S(sXReturns all named result values (as a list in Python 2.x, as an iterator in Python 3.x).(R�t
itervalues(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytvalues�scCst|j��S(sfReturns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x).(R�t	iteritems(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scCs
t|j�S(s�Since keys() returns an iterator, this method is helpful in bypassing
           code that looks for the existence of any defined results names.(tboolR�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pythaskeys�scOs�|sdg}nxI|j�D];\}}|dkrJ|d|f}qtd|��qWt|dt�s�t|�dks�|d|kr�|d}||}||=|S|d}|SdS(s�
        Removes and returns item at specified index (default=C{last}).
        Supports both C{list} and C{dict} semantics for C{pop()}. If passed no
        argument or an integer argument, it will use C{list} semantics
        and pop tokens from the list of parsed tokens. If passed a 
        non-integer argument (most likely a string), it will use C{dict}
        semantics and pop the corresponding value from any defined 
        results names. A second default return value argument is 
        supported, just as in C{dict.pop()}.

        Example::
            def remove_first(tokens):
                tokens.pop(0)
            print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321']
            print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321']

            label = Word(alphas)
            patt = label("LABEL") + OneOrMore(Word(nums))
            print(patt.parseString("AAB 123 321").dump())

            # Use pop() in a parse action to remove named result (note that corresponding value is not
            # removed from list form of results)
            def remove_LABEL(tokens):
                tokens.pop("LABEL")
                return tokens
            patt.addParseAction(remove_LABEL)
            print(patt.parseString("AAB 123 321").dump())
        prints::
            ['AAB', '123', '321']
            - LABEL: AAB

            ['AAB', '123', '321']
        i����tdefaultis-pop() got an unexpected keyword argument '%s'iN(R�R�RsRoR�(R�R�tkwargsR�R�tindexR}tdefaultvalue((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytpop�s"


cCs||kr||S|SdS(si
        Returns named result matching the given key, or if there is no
        such name, then returns the given C{defaultValue} or C{None} if no
        C{defaultValue} is specified.

        Similar to C{dict.get()}.
        
        Example::
            integer = Word(nums)
            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")           

            result = date_str.parseString("1999/12/31")
            print(result.get("year")) # -> '1999'
            print(result.get("hour", "not specified")) # -> 'not specified'
            print(result.get("hour")) # -> None
        N((R�tkeytdefaultValue((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�scCsw|jj||�x]|jj�D]L\}}x=t|�D]/\}\}}t||||k�||<q<Wq#WdS(s
        Inserts new element at location index in the list of parsed tokens.
        
        Similar to C{list.insert()}.

        Example::
            print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321']

            # use a parse action to insert the parse location in the front of the parsed results
            def insert_locn(locn, tokens):
                tokens.insert(0, locn)
            print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321']
        N(R�tinsertR�R�R�R�(R�R�tinsStrR�R�R�R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR2scCs|jj|�dS(s�
        Add single element to end of ParseResults list of elements.

        Example::
            print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321']
            
            # use a parse action to compute the sum of the parsed integers, and add it to the end
            def append_sum(tokens):
                tokens.append(sum(map(int, tokens)))
            print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444]
        N(R�tappend(R�titem((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRFscCs0t|t�r||7}n|jj|�dS(s
        Add sequence of elements to end of ParseResults list of elements.

        Example::
            patt = OneOrMore(Word(alphas))
            
            # use a parse action to append the reverse of the matched strings, to make a palindrome
            def make_palindrome(tokens):
                tokens.extend(reversed([t[::-1] for t in tokens]))
                return ''.join(tokens)
            print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl'
        N(RsR R�textend(R�titemseq((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRTs

cCs|j2|jj�dS(s7
        Clear all elements and results names.
        N(R�R�tclear(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRfscCs�y||SWntk
r dSX||jkr}||jkrR|j|ddStg|j|D]}|d^qc�SndSdS(NRri����i(R�R�R�R (R�R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�ms
+cCs|j�}||7}|S(N(R�(R�totherR}((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__add__{s
c	s�|jr�t|j���fd�}|jj�}g|D]<\}}|D])}|t|d||d��f^qMq=}xJ|D]?\}}|||<t|dt�r�t|�|d_q�q�Wn|j|j7_|j	j
|j	�|S(Ncs|dkr�S|�S(Ni((ta(toffset(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq�Rrii(R�R�R�R�R�RsR R�R�R�tupdate(R�R	t	addoffsett
otheritemsR�tvlistR�totherdictitems((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__iadd__�s	F
cCs1t|t�r%|dkr%|j�S||SdS(Ni(RsRoR�(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__radd__�s
cCs dt|j�t|j�fS(Ns(%s, %s)(R�R�R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scCs"ddjd�|jD��dS(Nt[s, css6|],}t|t�r$t|�n	t|�VqdS(N(RsR RR�(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�st](R�R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��sRrcCsog}xb|jD]W}|r2|r2|j|�nt|t�rT||j�7}q|jt|��qW|S(N(R�RRsR t
_asStringListR(R�tseptoutR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�scCs5g|jD]'}t|t�r+|j�n|^q
S(s�
        Returns the parse results as a nested list of matching tokens, all converted to strings.

        Example::
            patt = OneOrMore(Word(alphas))
            result = patt.parseString("sldkj lsdkj sldkj")
            # even though the result prints in string-like form, it is actually a pyparsing ParseResults
            print(type(result), result) # -> <class 'pyparsing.ParseResults'> ['sldkj', 'lsdkj', 'sldkj']
            
            # Use asList() to create an actual list
            result_list = result.asList()
            print(type(result_list), result_list) # -> <class 'list'> ['sldkj', 'lsdkj', 'sldkj']
        (R�RsR R�(R�tres((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scsGtr|j}n	|j}�fd��t�fd�|�D��S(s�
        Returns the named parse results as a nested dictionary.

        Example::
            integer = Word(nums)
            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
            
            result = date_str.parseString('12/31/1999')
            print(type(result), repr(result)) # -> <class 'pyparsing.ParseResults'> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]})
            
            result_dict = result.asDict()
            print(type(result_dict), repr(result_dict)) # -> <class 'dict'> {'day': '1999', 'year': '12', 'month': '31'}

            # even though a ParseResults supports dict-like access, sometime you just need to have a dict
            import json
            print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable
            print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"}
        csMt|t�rE|j�r%|j�Sg|D]}�|�^q,Sn|SdS(N(RsR R�tasDict(R|R�(ttoItem(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s

 c3s'|]\}}|�|�fVqdS(N((R�R�R�(R(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�s(tPY_3R�R�R�(R�titem_fn((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s
		cCsPt|j�}|jj�|_|j|_|jj|j�|j|_|S(sA
        Returns a new copy of a C{ParseResults} object.
        (R R�R�R�R�R�R
R�(R�R}((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scCs�d}g}td�|jj�D��}|d}|sPd}d}d}nd	}	|d	k	rk|}	n|jr�|j}	n|	s�|r�dSd}	n|||d|	dg7}x	t|j�D]�\}
}t|t�rI|
|kr||j	||
|o|d	k||�g7}q�||j	d	|o6|d	k||�g7}q�d	}|
|krh||
}n|s�|rzq�q�d}nt
t|��}
|||d|d|
d|dg	7}q�W|||d|	dg7}dj|�S(
s�
        (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names.
        s
css2|](\}}|D]}|d|fVqqdS(iN((R�R�RR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�s	s  RrtITEMt<t>s</N(
R�R�R�R�R�R�R�RsR tasXMLR�RR�(R�tdoctagtnamedItemsOnlytindentt	formattedtnlRt
namedItemstnextLevelIndenttselfTagR�RtresTagtxmlBodyText((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR!�sT
				
	cCsKxD|jj�D]3\}}x$|D]\}}||kr#|Sq#WqWdS(N(R�R�R�(R�R�R�RR�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__lookup$s
cCs�|jr|jS|jr?|j�}|r8|j|�SdSnmt|�dkr�t|j�dkr�tt|jj���dddkr�tt|jj	���SdSdS(s(
        Returns the results name for this token expression. Useful when several 
        different expressions might match at a particular location.

        Example::
            integer = Word(nums)
            ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d")
            house_number_expr = Suppress('#') + Word(nums, alphanums)
            user_data = (Group(house_number_expr)("house_number") 
                        | Group(ssn_expr)("ssn")
                        | Group(integer)("age"))
            user_info = OneOrMore(user_data)
            
            result = user_info.parseString("22 111-22-3333 #221B")
            for item in result:
                print(item.getName(), ':', item[0])
        prints::
            age : 22
            ssn : 111-22-3333
            house_number : 221B
        iii����N(ii����(
R�R�t_ParseResults__lookupR�R�R�tnextR�R�R�(R�tpar((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytgetName+s		
)icCs�g}d}|j|t|j���|r�|j�rtd�|j�D��}xk|D]�\}}|r�|j|�n|jd|d||f�t|t�r�|r�|j|j||d��q�|jt|��q^|jt	|��q^Wq�t
d�|D��r�|}x�t|�D]�\}	}
t|
t�r�|jd|d||	|d|d|
j||d�f�q,|jd|d||	|d|dt|
�f�q,Wq�ndj|�S(	sH
        Diagnostic method for listing out the contents of a C{ParseResults}.
        Accepts an optional C{indent} argument so that this string can be embedded
        in a nested display of other data.

        Example::
            integer = Word(nums)
            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
            
            result = date_str.parseString('12/31/1999')
            print(result.dump())
        prints::
            ['12', '/', '31', '/', '1999']
            - day: 1999
            - month: 31
            - year: 12
        s
css'|]\}}t|�|fVqdS(N(Ru(R�R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>gss
%s%s- %s: s  icss|]}t|t�VqdS(N(RsR (R�tvv((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>sss
%s%s[%d]:
%s%s%sRr(
RRR�R�tsortedR�RsR tdumpR�tanyR�R�(R�R$tdepthtfullRtNLR�R�R�R�R1((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR3Ps, B?cOstj|j�||�dS(s�
        Pretty-printer for parsed results as a list, using the C{pprint} module.
        Accepts additional positional or keyword args as defined for the 
        C{pprint.pprint} method. (U{http://docs.python.org/3/library/pprint.html#pprint.pprint})

        Example::
            ident = Word(alphas, alphanums)
            num = Word(nums)
            func = Forward()
            term = ident | num | Group('(' + func + ')')
            func <<= ident + Group(Optional(delimitedList(term)))
            result = func.parseString("fna a,b,(fnb c,d,200),100")
            result.pprint(width=40)
        prints::
            ['fna',
             ['a',
              'b',
              ['(', 'fnb', ['c', 'd', '200'], ')'],
              '100']]
        N(tpprintR�(R�R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR8}scCsC|j|jj�|jdk	r-|j�p0d|j|jffS(N(R�R�R�R�R�R�R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__getstate__�s
cCsm|d|_|d\|_}}|_i|_|jj|�|dk	r`t|�|_n	d|_dS(Nii(R�R�R�R�R
R�R�R�(R�tstateR/tinAccumNames((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__setstate__�s
	cCs|j|j|j|jfS(N(R�R�R�R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__getnewargs__�scCs tt|��t|j��S(N(R�R�R�R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��sN(6R�R�R�R�R�R�RsR�R�R�R�R�R�R�t__nonzero__R�R�R�R�R�RR�R�R�R�R�R�R�R�R�RRRRR�R
RRR�R�RR�RR�R�R!R-R0R3R8R9R<R=R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR -sh&	'		
														4												#	=		%-			
	cCsW|}d|ko#t|�knr@||ddkr@dS||jdd|�S(sReturns current column within a string, counting newlines as line separators.
   The first column is number 1.

   Note: the default parsing behavior is to expand tabs in the input string
   before starting the parsing process.  See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information
   on parsing strings containing C{<TAB>}s, and suggested methods to maintain a
   consistent view of the parsed string, the parse location, and line and column
   positions within the parsed string.
   iis
(R�trfind(R�tstrgR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR7�s
cCs|jdd|�dS(sReturns current line number within a string, counting newlines as line separators.
   The first line is number 1.

   Note: the default parsing behavior is to expand tabs in the input string
   before starting the parsing process.  See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information
   on parsing strings containing C{<TAB>}s, and suggested methods to maintain a
   consistent view of the parsed string, the parse location, and line and column
   positions within the parsed string.
   s
ii(tcount(R�R@((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRH�s
cCsR|jdd|�}|jd|�}|dkrB||d|!S||dSdS(sfReturns the line of text containing loc within a string, counting newlines as line separators.
       s
iiN(R?tfind(R�R@tlastCRtnextCR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRE�s
cCsAdt|�dt|�dt||�t||�fGHdS(NsMatch s at loc s(%d,%d)(RRHR7(tinstringR�texpr((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_defaultStartDebugAction�scCs'dt|�dt|j��GHdS(NsMatched s -> (RRuR�(REtstartloctendlocRFttoks((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_defaultSuccessDebugAction�scCsdt|�GHdS(NsException raised:(R(RER�RFtexc((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_defaultExceptionDebugAction�scGsdS(sG'Do-nothing' debug action, to suppress debugging output during parsing.N((R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRO�sics�tkr�fd�Sdg�tg�td dkrVdd�}dd��ntj}tj�d}|d	d�d
}|d|d|f�������fd�}d
}y"t�dt�d�j�}Wntk
r�t	��}nX||_|S(Ncs
�|�S(N((R�tlRp(tfunc(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq�RriiiicSsJtdkrdnd}tjd||d�|}|j|jfgS(	Niiii����i����tlimiti(iii(tsystem_versiont	tracebackt
extract_stacktfilenameRH(RPRt
frame_summary((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRSscSs2tj|d|�}|d}|j|jfgS(NRPi����(RRt
extract_tbRTRH(ttbRPtframesRU((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRVs
iRPi����ics�x�y&�|�d�}t�d<|SWqtk
r��drI�nAz:tj�d}�|dd�dd �ks��nWd~X�d�kr��dcd7<qn�qXqWdS(Nii����RPii(R�R�Rxtexc_info(R�R}RW(RVt
foundArityRORPtmaxargstpa_call_line_synth(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytwrappers"


 
s<parse action>R�t	__class__(ii(
tsingleArgBuiltinsR�RQRRRSRVtgetattrR�t	ExceptionRu(ROR[RSt	LINE_DIFFt	this_lineR]t	func_name((RVRZRORPR[R\s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_trim_arity�s*
					
	cBseZdZdZeZed��Zed��Zed�Z	d�Z
d�Zed�Ze
d�Zd	�Zd
�Zd�Zd�Zd
�Zd�Ze
d�Zd�Ze
e
d�Zd�Zd�Zdefd��YZedFk	rdefd��YZndefd��YZiZe �Z!ddgZ"e
e
d�Z#eZ$ed��Z%eZ&edd��Z'ed�Z(e)ed�Z*d �Z+e)d!�Z,e)ed"�Z-d#�Z.d$�Z/d%�Z0d&�Z1d'�Z2d(�Z3d)�Z4d*�Z5d+�Z6d,�Z7d-�Z8d.�Z9d/�Z:dFd0�Z;d1�Z<d2�Z=d3�Z>d4�Z?d5�Z@d6�ZAe
d7�ZBd8�ZCd9�ZDd:�ZEd;�ZFgd<�ZGed=�ZHd>�ZId?�ZJd@�ZKdA�ZLdB�ZMe
dC�ZNe
dDe
e
edE�ZORS(Gs)Abstract base level parser element class.s 
	
cCs
|t_dS(s�
        Overrides the default whitespace chars

        Example::
            # default whitespace chars are space, <TAB> and newline
            OneOrMore(Word(alphas)).parseString("abc def\nghi jkl")  # -> ['abc', 'def', 'ghi', 'jkl']
            
            # change to just treat newline as significant
            ParserElement.setDefaultWhitespaceChars(" \t")
            OneOrMore(Word(alphas)).parseString("abc def\nghi jkl")  # -> ['abc', 'def']
        N(R"tDEFAULT_WHITE_CHARS(tchars((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsetDefaultWhitespaceChars=s
cCs
|t_dS(s�
        Set class to be used for inclusion of string literals into a parser.
        
        Example::
            # default literal class used is Literal
            integer = Word(nums)
            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")           

            date_str.parseString("1999/12/31")  # -> ['1999', '/', '12', '/', '31']


            # change to Suppress
            ParserElement.inlineLiteralsUsing(Suppress)
            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")           

            date_str.parseString("1999/12/31")  # -> ['1999', '12', '31']
        N(R"t_literalStringClass(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytinlineLiteralsUsingLscCs�t�|_d|_d|_d|_||_t|_t	j
|_t|_t
|_t
|_t�|_t
|_t
|_t|_d|_t|_d|_d|_t|_t
|_dS(NRr(NNN(R�tparseActionR�t
failActiontstrReprtresultsNamet
saveAsListR�tskipWhitespaceR"Rft
whiteCharstcopyDefaultWhiteCharsR�tmayReturnEmptytkeepTabstignoreExprstdebugtstreamlinedt
mayIndexErrorterrmsgtmodalResultstdebugActionstretcallPreparset
callDuringTry(R�tsavelist((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�as(																cCsEtj|�}|j|_|j|_|jrAtj|_n|S(s$
        Make a copy of this C{ParserElement}.  Useful for defining different parse actions
        for the same parsing pattern, using copies of the original parse element.
        
        Example::
            integer = Word(nums).setParseAction(lambda toks: int(toks[0]))
            integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K")
            integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M")
            
            print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M"))
        prints::
            [5120, 100, 655360, 268435456]
        Equivalent form of C{expr.copy()} is just C{expr()}::
            integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M")
        (R�RkRuRrR"RfRq(R�tcpy((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�xs

	cCs>||_d|j|_t|d�r:|j|j_n|S(sf
        Define name for this expression, makes debugging and exception messages clearer.
        
        Example::
            Word(nums).parseString("ABC")  # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1)
            Word(nums).setName("integer").parseString("ABC")  # -> Exception: Expected integer (at char 0), (line:1, col:1)
        s	Expected t	exception(R�RyR�R�R�(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsetName�s
	cCsE|j�}|jd�r.|d }t}n||_||_|S(sP
        Define name for referencing matching tokens as a nested attribute
        of the returned parse results.
        NOTE: this returns a *copy* of the original C{ParserElement} object;
        this is so that the client can define a basic element, such as an
        integer, and reference it in multiple places with different names.

        You can also set results names using the abbreviated syntax,
        C{expr("name")} in place of C{expr.setResultsName("name")} - 
        see L{I{__call__}<__call__>}.

        Example::
            date_str = (integer.setResultsName("year") + '/' 
                        + integer.setResultsName("month") + '/' 
                        + integer.setResultsName("day"))

            # equivalent form:
            date_str = integer("year") + '/' + integer("month") + '/' + integer("day")
        t*i����(R�tendswithR�RnRz(R�R�tlistAllMatchestnewself((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsetResultsName�s
		
csa|r9|j�tt�fd�}�|_||_n$t|jd�r]|jj|_n|S(s�Method to invoke the Python pdb debugger when this element is
           about to be parsed. Set C{breakFlag} to True to enable, False to
           disable.
        cs)ddl}|j��||||�S(Ni����(tpdbt	set_trace(RER�t	doActionstcallPreParseR�(t_parseMethod(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytbreaker�s
t_originalParseMethod(t_parseR�R�R�(R�t	breakFlagR�((R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsetBreak�s		cOs7tttt|���|_|jdt�|_|S(s
        Define action to perform when successfully matching parse element definition.
        Parse action fn is a callable method with 0-3 arguments, called as C{fn(s,loc,toks)},
        C{fn(loc,toks)}, C{fn(toks)}, or just C{fn()}, where:
         - s   = the original string being parsed (see note below)
         - loc = the location of the matching substring
         - toks = a list of the matched tokens, packaged as a C{L{ParseResults}} object
        If the functions in fns modify the tokens, they can return them as the return
        value from fn, and the modified list of tokens will replace the original.
        Otherwise, fn does not need to return any value.

        Optional keyword arguments:
         - callDuringTry = (default=C{False}) indicate if parse action should be run during lookaheads and alternate testing

        Note: the default parsing behavior is to expand tabs in the input string
        before starting the parsing process.  See L{I{parseString}<parseString>} for more information
        on parsing strings containing C{<TAB>}s, and suggested methods to maintain a
        consistent view of the parsed string, the parse location, and line and column
        positions within the parsed string.
        
        Example::
            integer = Word(nums)
            date_str = integer + '/' + integer + '/' + integer

            date_str.parseString("1999/12/31")  # -> ['1999', '/', '12', '/', '31']

            # use parse action to convert to ints at parse time
            integer = Word(nums).setParseAction(lambda toks: int(toks[0]))
            date_str = integer + '/' + integer + '/' + integer

            # note that integer fields are now ints, not strings
            date_str.parseString("1999/12/31")  # -> [1999, '/', 12, '/', 31]
        R~(R�tmapReRkR�R�R~(R�tfnsR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRz�s"cOsF|jtttt|���7_|jp<|jdt�|_|S(s�
        Add parse action to expression's list of parse actions. See L{I{setParseAction}<setParseAction>}.
        
        See examples in L{I{copy}<copy>}.
        R~(RkR�R�ReR~R�R�(R�R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytaddParseAction�s$cs�|jdd��|jdt�r*tnt�x3|D]+����fd�}|jj|�q7W|jp~|jdt�|_|S(s�Add a boolean predicate function to expression's list of parse actions. See 
        L{I{setParseAction}<setParseAction>} for function call signatures. Unlike C{setParseAction}, 
        functions passed to C{addCondition} need to return boolean success/fail of the condition.

        Optional keyword arguments:
         - message = define a custom message to be used in the raised exception
         - fatal   = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException
         
        Example::
            integer = Word(nums).setParseAction(lambda toks: int(toks[0]))
            year_int = integer.copy()
            year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later")
            date_str = year_int + '/' + integer + '/' + integer

            result = date_str.parseString("1999/12/31")  # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1)
        tmessagesfailed user-defined conditiontfatalcs7tt��|||��s3�||���ndS(N(R�Re(R�RNRp(texc_typetfnR�(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytpasR~(R�R�RRRkRR~(R�R�R�R�((R�R�R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytaddCondition�s
cCs
||_|S(sDefine action to perform if parsing fails at this expression.
           Fail acton fn is a callable function that takes the arguments
           C{fn(s,loc,expr,err)} where:
            - s = string being parsed
            - loc = location where expression match was attempted and failed
            - expr = the parse expression that failed
            - err = the exception thrown
           The function returns no value.  It may throw C{L{ParseFatalException}}
           if it is desired to stop parsing immediately.(Rl(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
setFailActions
	cCsnt}xa|rit}xN|jD]C}y)x"|j||�\}}t}q+WWqtk
raqXqWq	W|S(N(R�R�RuR�R(R�RER�t
exprsFoundtetdummy((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_skipIgnorables#s	
cCsp|jr|j||�}n|jrl|j}t|�}x-||krh|||krh|d7}q?Wn|S(Ni(RuR�RpRqR�(R�RER�twttinstrlen((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytpreParse0s			cCs
|gfS(N((R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt	parseImpl<scCs|S(N((R�RER�t	tokenlist((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt	postParse?sc	Cs�|j}|s|jr,|jdr?|jd|||�n|rc|jrc|j||�}n|}|}yUy|j|||�\}}Wn/tk
r�t|t|�|j	|��nXWq�t
k
r(}	|jdr|jd||||	�n|jr"|j||||	�n�q�Xn�|rP|jrP|j||�}n|}|}|jsw|t|�kr�y|j|||�\}}Wq�tk
r�t|t|�|j	|��q�Xn|j|||�\}}|j|||�}t
||jd|jd|j�}
|jrf|s7|jrf|r�yrxk|jD]`}||||
�}|dk	rJt
||jd|jo�t|t
tf�d|j�}
qJqJWWqct
k
r�}	|jdr�|jd||||	�n�qcXqfxn|jD]`}||||
�}|dk	r�t
||jd|joMt|t
tf�d|j�}
q�q�Wn|r�|jdr�|jd|||||
�q�n||
fS(NiiR�R�i(RvRlR{R}R�R�R�RR�RyRRxR�R RnRoRzRkR~R�RsR�(R�RER�R�R�t	debuggingtprelocttokensStartttokensterrt	retTokensR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
_parseNoCacheCsp	

&
	

%$	

	
#cCsNy|j||dt�dSWn)tk
rIt|||j|��nXdS(NR�i(R�R�RRRy(R�RER�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyttryParse�s
cCs7y|j||�Wnttfk
r.tSXtSdS(N(R�RR�R�R�(R�RER�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytcanParseNext�s
t_UnboundedCachecBseZd�ZRS(cs�i�t�|_���fd�}�fd�}�fd�}tj||�|_tj||�|_tj||�|_dS(Ncs�j|��S(N(R�(R�R(tcachetnot_in_cache(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scs|�|<dS(N((R�RR�(R�(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytset�scs�j�dS(N(R(R�(R�(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s(R�R�ttypest
MethodTypeR�R�R(R�R�R�R((R�R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s(R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��st
_FifoCachecBseZd�ZRS(cs�t�|_�t����fd�}��fd�}�fd�}tj||�|_tj||�|_tj||�|_dS(Ncs�j|��S(N(R�(R�R(R�R�(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scs0|�|<t���kr,�jt�ndS(N(R�tpopitemR�(R�RR�(R�tsize(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s
cs�j�dS(N(R(R�(R�(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s(R�R�t_OrderedDictR�R�R�R�R(R�R�R�R�R((R�R�R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s	(R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scBseZd�ZRS(cs�t�|_�i�tjg�����fd�}���fd�}��fd�}tj||�|_tj||�|_tj||�|_dS(Ncs�j|��S(N(R�(R�R(R�R�(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scsF|�|<t���kr5�j�j�d�n�j|�dS(N(R�R�tpopleftR�R(R�RR�(R�tkey_fifoR�(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s
cs�j��j�dS(N(R(R�(R�R�(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s
(	R�R�tcollectionstdequeR�R�R�R�R(R�R�R�R�R((R�R�R�R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s(R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��sic	Cs.d\}}|||||f}tj��tj}|j|�}	|	|jkr�tj|cd7<y|j||||�}	Wn2tk
r�}
|j||
j	|
j
���q$X|j||	d|	dj�f�|	SnCtj|cd7<t|	t
�r|	�n|	d|	dj�fSWdQXdS(Nii(ii(R"tpackrat_cache_lockt
packrat_cacheR�R�tpackrat_cache_statsR�RR�R^R�R�RsRa(R�RER�R�R�tHITtMISStlookupR�R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt_parseCache�s$
	$	cCs+tjj�dgttj�tj(dS(Ni(R"R�RR�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
resetCache�s
i�cCsUtjsQtt_|dkr0tj�t_ntj|�t_tjt_ndS(s�Enables "packrat" parsing, which adds memoizing to the parsing logic.
           Repeated parse attempts at the same string location (which happens
           often in many complex grammars) can immediately return a cached value,
           instead of re-executing parsing/validating code.  Memoizing is done of
           both valid results and parsing exceptions.
           
           Parameters:
            - cache_size_limit - (default=C{128}) - if an integer value is provided
              will limit the size of the packrat cache; if None is passed, then
              the cache size will be unbounded; if 0 is passed, the cache will
              be effectively disabled.
            
           This speedup may break existing programs that use parse actions that
           have side-effects.  For this reason, packrat parsing is disabled when
           you first import pyparsing.  To activate the packrat feature, your
           program must call the class method C{ParserElement.enablePackrat()}.  If
           your program uses C{psyco} to "compile as you go", you must call
           C{enablePackrat} before calling C{psyco.full()}.  If you do not do this,
           Python will crash.  For best results, call C{enablePackrat()} immediately
           after importing pyparsing.
           
           Example::
               import pyparsing
               pyparsing.ParserElement.enablePackrat()
        N(	R"t_packratEnabledR�R�R�R�R�R�R�(tcache_size_limit((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
enablePackrats		cCs�tj�|js |j�nx|jD]}|j�q*W|jsV|j�}nyW|j|d�\}}|r�|j||�}t	�t
�}|j||�nWn(tk
r�}tjr��q�|�nX|SdS(sB
        Execute the parse expression with the given string.
        This is the main interface to the client code, once the complete
        expression has been built.

        If you want the grammar to require that the entire input string be
        successfully parsed, then set C{parseAll} to True (equivalent to ending
        the grammar with C{L{StringEnd()}}).

        Note: C{parseString} implicitly calls C{expandtabs()} on the input string,
        in order to report proper column numbers in parse actions.
        If the input string contains tabs and
        the grammar uses parse actions that use the C{loc} argument to index into the
        string being parsed, you can ensure you have a consistent view of the input
        string by:
         - calling C{parseWithTabs} on your grammar before calling C{parseString}
           (see L{I{parseWithTabs}<parseWithTabs>})
         - define your parse action using the full C{(s,loc,toks)} signature, and
           reference the input string using the parse action's C{s} argument
         - explictly expand the tabs in your input string before calling
           C{parseString}
        
        Example::
            Word('a').parseString('aaaaabaaa')  # -> ['aaaaa']
            Word('a').parseString('aaaaabaaa', parseAll=True)  # -> Exception: Expected end of text
        iN(
R"R�Rwt
streamlineRuRtt
expandtabsR�R�RR'Rtverbose_stacktrace(R�REtparseAllR�R�R�tseRL((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytparseString#s$
	
		
ccs�|js|j�nx|jD]}|j�q W|jsRt|�j�}nt|�}d}|j}|j}t	j
�d}	y�x�||kra|	|kray.|||�}
|||
dt�\}}Wntk
r�|
d}q�X||krT|	d7}	||
|fV|rK|||�}
|
|kr>|}qQ|d7}q^|}q�|
d}q�WWn(t
k
r�}t	jr��q�|�nXdS(s�
        Scan the input string for expression matches.  Each match will return the
        matching tokens, start location, and end location.  May be called with optional
        C{maxMatches} argument, to clip scanning after 'n' matches are found.  If
        C{overlap} is specified, then overlapping matches will be reported.

        Note that the start and end locations are reported relative to the string
        being parsed.  See L{I{parseString}<parseString>} for more information on parsing
        strings with embedded tabs.

        Example::
            source = "sldjf123lsdjjkf345sldkjf879lkjsfd987"
            print(source)
            for tokens,start,end in Word(alphas).scanString(source):
                print(' '*start + '^'*(end-start))
                print(' '*start + tokens[0])
        
        prints::
        
            sldjf123lsdjjkf345sldkjf879lkjsfd987
            ^^^^^
            sldjf
                    ^^^^^^^
                    lsdjjkf
                              ^^^^^^
                              sldkjf
                                       ^^^^^^
                                       lkjsfd
        iR�iN(RwR�RuRtRR�R�R�R�R"R�R�RRR�(R�REt
maxMatchestoverlapR�R�R�t
preparseFntparseFntmatchesR�tnextLocR�tnextlocRL((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
scanStringUsB	
			


	
		c	Cs%g}d}t|_y�x�|j|�D]}\}}}|j|||!�|r�t|t�rs||j�7}q�t|t�r�||7}q�|j|�n|}q(W|j||�g|D]}|r�|^q�}djt	t
t|���SWn(tk
r }t
jr�q!|�nXdS(sf
        Extension to C{L{scanString}}, to modify matching text with modified tokens that may
        be returned from a parse action.  To use C{transformString}, define a grammar and
        attach a parse action to it that modifies the returned token list.
        Invoking C{transformString()} on a target string will then scan for matches,
        and replace the matched text patterns according to the logic in the parse
        action.  C{transformString()} returns the resulting transformed string.
        
        Example::
            wd = Word(alphas)
            wd.setParseAction(lambda toks: toks[0].title())
            
            print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york."))
        Prints::
            Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York.
        iRrN(R�RtR�RRsR R�R�R�R�Rt_flattenRR"R�(	R�RERtlastERpR�R�toRL((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR{�s(	

 	cCsey6tg|j||�D]\}}}|^q�SWn(tk
r`}tjrW�qa|�nXdS(s~
        Another extension to C{L{scanString}}, simplifying the access to the tokens found
        to match the given parse expression.  May be called with optional
        C{maxMatches} argument, to clip searching after 'n' matches are found.
        
        Example::
            # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters
            cap_word = Word(alphas.upper(), alphas.lower())
            
            print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity"))
        prints::
            ['More', 'Iron', 'Lead', 'Gold', 'I']
        N(R R�RR"R�(R�RER�RpR�R�RL((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsearchString�s6	c	csfd}d}xJ|j|d|�D]3\}}}|||!V|rO|dVn|}q"W||VdS(s[
        Generator method to split a string using the given expression as a separator.
        May be called with optional C{maxsplit} argument, to limit the number of splits;
        and the optional C{includeSeparators} argument (default=C{False}), if the separating
        matching text should be included in the split results.
        
        Example::        
            punc = oneOf(list(".,;:/-!?"))
            print(list(punc.split("This, this?, this sentence, is badly punctuated!")))
        prints::
            ['This', ' this', '', ' this sentence', ' is badly punctuated', '']
        iR�N(R�(	R�REtmaxsplittincludeSeparatorstsplitstlastRpR�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s
%
cCsdt|t�r!tj|�}nt|t�sTtjdt|�tdd�dSt	||g�S(s�
        Implementation of + operator - returns C{L{And}}. Adding strings to a ParserElement
        converts them to L{Literal}s by default.
        
        Example::
            greet = Word(alphas) + "," + Word(alphas) + "!"
            hello = "Hello, World!"
            print (hello, "->", greet.parseString(hello))
        Prints::
            Hello, World! -> ['Hello', ',', 'World', '!']
        s4Cannot combine element of type %s with ParserElementt
stackleveliN(
RsR�R"RitwarningstwarnR�t
SyntaxWarningR�R(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR
�s
cCs\t|t�r!tj|�}nt|t�sTtjdt|�tdd�dS||S(s]
        Implementation of + operator when left operand is not a C{L{ParserElement}}
        s4Cannot combine element of type %s with ParserElementR�iN(	RsR�R"RiR�R�R�R�R�(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs
cCsmt|t�r!tj|�}nt|t�sTtjdt|�tdd�dSt	|t	j
�|g�S(sQ
        Implementation of - operator, returns C{L{And}} with error stop
        s4Cannot combine element of type %s with ParserElementR�iN(RsR�R"RiR�R�R�R�R�Rt
_ErrorStop(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__sub__s
cCs\t|t�r!tj|�}nt|t�sTtjdt|�tdd�dS||S(s]
        Implementation of - operator when left operand is not a C{L{ParserElement}}
        s4Cannot combine element of type %s with ParserElementR�iN(	RsR�R"RiR�R�R�R�R�(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__rsub__ s
csEt|t�r|d}}n-t|t�r7|dd }|dd
kr_d|df}nt|dt�r�|dd
kr�|ddkr�t��S|ddkr�t��S�|dt��SqLt|dt�rt|dt�r|\}}||8}qLtdt|d�t|d���ntdt|���|dkrgtd��n|dkr�td��n||ko�dknr�td��n|r��fd	��|r
|dkr���|�}qt	�g|��|�}qA�|�}n(|dkr.�}nt	�g|�}|S(s�
        Implementation of * operator, allows use of C{expr * 3} in place of
        C{expr + expr + expr}.  Expressions may also me multiplied by a 2-integer
        tuple, similar to C{{min,max}} multipliers in regular expressions.  Tuples
        may also include C{None} as in:
         - C{expr*(n,None)} or C{expr*(n,)} is equivalent
              to C{expr*n + L{ZeroOrMore}(expr)}
              (read as "at least n instances of C{expr}")
         - C{expr*(None,n)} is equivalent to C{expr*(0,n)}
              (read as "0 to n instances of C{expr}")
         - C{expr*(None,None)} is equivalent to C{L{ZeroOrMore}(expr)}
         - C{expr*(1,None)} is equivalent to C{L{OneOrMore}(expr)}

        Note that C{expr*(None,n)} does not raise an exception if
        more than n exprs exist in the input stream; that is,
        C{expr*(None,n)} does not enforce a maximum number of expr
        occurrences.  If this behavior is desired, then write
        C{expr*(None,n) + ~expr}
        iiis7cannot multiply 'ParserElement' and ('%s','%s') objectss0cannot multiply 'ParserElement' and '%s' objectss/cannot multiply ParserElement by negative values@second tuple value must be greater or equal to first tuple values+cannot multiply ParserElement by 0 or (0,0)cs2|dkr$t��|d��St��SdS(Ni(R(tn(tmakeOptionalListR�(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�]sN(NN(
RsRottupleR�R0RR�R�t
ValueErrorR(R�R	tminElementstoptElementsR}((R�R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__mul__,sD#

&
) 	cCs
|j|�S(N(R�(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__rmul__pscCsdt|t�r!tj|�}nt|t�sTtjdt|�tdd�dSt	||g�S(sI
        Implementation of | operator - returns C{L{MatchFirst}}
        s4Cannot combine element of type %s with ParserElementR�iN(
RsR�R"RiR�R�R�R�R�R(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__or__ss
cCs\t|t�r!tj|�}nt|t�sTtjdt|�tdd�dS||BS(s]
        Implementation of | operator when left operand is not a C{L{ParserElement}}
        s4Cannot combine element of type %s with ParserElementR�iN(	RsR�R"RiR�R�R�R�R�(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__ror__s
cCsdt|t�r!tj|�}nt|t�sTtjdt|�tdd�dSt	||g�S(sA
        Implementation of ^ operator - returns C{L{Or}}
        s4Cannot combine element of type %s with ParserElementR�iN(
RsR�R"RiR�R�R�R�R�R(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__xor__�s
cCs\t|t�r!tj|�}nt|t�sTtjdt|�tdd�dS||AS(s]
        Implementation of ^ operator when left operand is not a C{L{ParserElement}}
        s4Cannot combine element of type %s with ParserElementR�iN(	RsR�R"RiR�R�R�R�R�(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__rxor__�s
cCsdt|t�r!tj|�}nt|t�sTtjdt|�tdd�dSt	||g�S(sC
        Implementation of & operator - returns C{L{Each}}
        s4Cannot combine element of type %s with ParserElementR�iN(
RsR�R"RiR�R�R�R�R�R
(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__and__�s
cCs\t|t�r!tj|�}nt|t�sTtjdt|�tdd�dS||@S(s]
        Implementation of & operator when left operand is not a C{L{ParserElement}}
        s4Cannot combine element of type %s with ParserElementR�iN(	RsR�R"RiR�R�R�R�R�(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__rand__�s
cCs
t|�S(sE
        Implementation of ~ operator - returns C{L{NotAny}}
        (R(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
__invert__�scCs'|dk	r|j|�S|j�SdS(s

        Shortcut for C{L{setResultsName}}, with C{listAllMatches=False}.
        
        If C{name} is given with a trailing C{'*'} character, then C{listAllMatches} will be
        passed as C{True}.
           
        If C{name} is omitted, same as calling C{L{copy}}.

        Example::
            # these are equivalent
            userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno")
            userdata = Word(alphas)("name") + Word(nums+"-")("socsecno")             
        N(R�R�R�(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__call__�s
cCs
t|�S(s�
        Suppresses the output of this C{ParserElement}; useful to keep punctuation from
        cluttering up returned output.
        (R)(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsuppress�scCs
t|_|S(s
        Disables the skipping of whitespace before matching the characters in the
        C{ParserElement}'s defined pattern.  This is normally only used internally by
        the pyparsing module, but may be needed in some whitespace-sensitive grammars.
        (R�Rp(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytleaveWhitespace�s	cCst|_||_t|_|S(s8
        Overrides the default whitespace chars
        (R�RpRqR�Rr(R�Rg((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsetWhitespaceChars�s			cCs
t|_|S(s�
        Overrides default behavior to expand C{<TAB>}s to spaces before parsing the input string.
        Must be called before C{parseString} when the input grammar contains elements that
        match C{<TAB>} characters.
        (R�Rt(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
parseWithTabs�s	cCsrt|t�rt|�}nt|t�rR||jkrn|jj|�qnn|jjt|j���|S(s�
        Define expression to be ignored (e.g., comments) while doing pattern
        matching; may be called repeatedly, to define multiple comment or other
        ignorable patterns.
        
        Example::
            patt = OneOrMore(Word(alphas))
            patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj']
            
            patt.ignore(cStyleComment)
            patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd']
        (RsR�R)RuRR�(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytignore�s
cCs1|p	t|pt|ptf|_t|_|S(sT
        Enable display of debugging messages while doing pattern matching.
        (RGRKRMR{R�Rv(R�tstartActiont
successActiontexceptionAction((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsetDebugActions
s
			cCs)|r|jttt�n	t|_|S(s�
        Enable display of debugging messages while doing pattern matching.
        Set C{flag} to True to enable, False to disable.

        Example::
            wd = Word(alphas).setName("alphaword")
            integer = Word(nums).setName("numword")
            term = wd | integer
            
            # turn on debugging for wd
            wd.setDebug()

            OneOrMore(term).parseString("abc 123 xyz 890")
        
        prints::
            Match alphaword at loc 0(1,1)
            Matched alphaword -> ['abc']
            Match alphaword at loc 3(1,4)
            Exception raised:Expected alphaword (at char 4), (line:1, col:5)
            Match alphaword at loc 7(1,8)
            Matched alphaword -> ['xyz']
            Match alphaword at loc 11(1,12)
            Exception raised:Expected alphaword (at char 12), (line:1, col:13)
            Match alphaword at loc 15(1,16)
            Exception raised:Expected alphaword (at char 15), (line:1, col:16)

        The output shown is that produced by the default debug actions - custom debug actions can be
        specified using L{setDebugActions}. Prior to attempting
        to match the C{wd} expression, the debugging message C{"Match <exprname> at loc <n>(<line>,<col>)"}
        is shown. Then if the parse succeeds, a C{"Matched"} message is shown, or an C{"Exception raised"}
        message is shown. Also note the use of L{setName} to assign a human-readable name to the expression,
        which makes debugging and exception messages easier to understand - for instance, the default
        name created for the C{Word} expression without calling C{setName} is C{"W:(ABCD...)"}.
        (R�RGRKRMR�Rv(R�tflag((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsetDebugs#	cCs|jS(N(R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�@scCs
t|�S(N(R(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�CscCst|_d|_|S(N(R�RwR�Rm(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�Fs		cCsdS(N((R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytcheckRecursionKscCs|jg�dS(sj
        Check defined expressions for valid structure, check for infinite recursive definitions.
        N(R(R�t
validateTrace((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytvalidateNscCs�y|j�}Wn5tk
rGt|d��}|j�}WdQXnXy|j||�SWn(tk
r�}tjr}�q�|�nXdS(s�
        Execute the parse expression on the given file or filename.
        If a filename is specified (instead of a file object),
        the entire file is opened, read, and closed before parsing.
        trN(treadR�topenR�RR"R�(R�tfile_or_filenameR�t
file_contentstfRL((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt	parseFileTs
	cCsdt|t�r1||kp0t|�t|�kSt|t�rM|j|�Stt|�|kSdS(N(RsR"tvarsR�R�tsuper(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__eq__hs
"
cCs||kS(N((R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__ne__pscCstt|��S(N(thashtid(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__hash__sscCs
||kS(N((R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__req__vscCs||kS(N((R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__rne__yscCs:y!|jt|�d|�tSWntk
r5tSXdS(s�
        Method for quick testing of a parser against a test string. Good for simple 
        inline microtests of sub expressions while building up larger parser.
           
        Parameters:
         - testString - to test against this expression for a match
         - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests
            
        Example::
            expr = Word(nums)
            assert expr.matches("100")
        R�N(R�RR�RR�(R�t
testStringR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�|s


t#cCsyt|t�r6tttj|j�j���}nt|t�rTt|�}ng}g}t	}	x|D]�}
|dk	r�|j|
t�s�|r�|
r�|j
|
�qmn|
s�qmndj|�|
g}g}yQ|
jdd�}
|j|
d|�}|j
|jd|��|	o%|}	Wn�tk
r�}
t|
t�rPdnd}d|
kr�|j
t|
j|
��|j
dt|
j|
�dd	|�n|j
d|
jd	|�|j
d
t|
��|	o�|}	|
}n<tk
r*}|j
dt|��|	o|}	|}nX|rX|rG|j
d�ndj|�GHn|j
|
|f�qmW|	|fS(
s3
        Execute the parse expression on a series of test strings, showing each
        test, the parsed results or where the parse failed. Quick and easy way to
        run a parse expression against a list of sample strings.
           
        Parameters:
         - tests - a list of separate test strings, or a multiline string of test strings
         - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests           
         - comment - (default=C{'#'}) - expression for indicating embedded comments in the test 
              string; pass None to disable comment filtering
         - fullDump - (default=C{True}) - dump results as list followed by results names in nested outline;
              if False, only dump nested list
         - printResults - (default=C{True}) prints test output to stdout
         - failureTests - (default=C{False}) indicates if these tests are expected to fail parsing

        Returns: a (success, results) tuple, where success indicates that all tests succeeded
        (or failed if C{failureTests} is True), and the results contain a list of lines of each 
        test's output
        
        Example::
            number_expr = pyparsing_common.number.copy()

            result = number_expr.runTests('''
                # unsigned integer
                100
                # negative integer
                -100
                # float with scientific notation
                6.02e23
                # integer with scientific notation
                1e-12
                ''')
            print("Success" if result[0] else "Failed!")

            result = number_expr.runTests('''
                # stray character
                100Z
                # missing leading digit before '.'
                -.100
                # too many '.'
                3.14.159
                ''', failureTests=True)
            print("Success" if result[0] else "Failed!")
        prints::
            # unsigned integer
            100
            [100]

            # negative integer
            -100
            [-100]

            # float with scientific notation
            6.02e23
            [6.02e+23]

            # integer with scientific notation
            1e-12
            [1e-12]

            Success
            
            # stray character
            100Z
               ^
            FAIL: Expected end of text (at char 3), (line:1, col:4)

            # missing leading digit before '.'
            -.100
            ^
            FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1)

            # too many '.'
            3.14.159
                ^
            FAIL: Expected end of text (at char 4), (line:1, col:5)

            Success

        Each test string must be on a single line. If you want to test a string that spans multiple
        lines, create a test like this::

            expr.runTest(r"this is a test\n of strings that spans \n 3 lines")
        
        (Note that this is a raw string literal, you must include the leading 'r'.)
        s
s\nR�R6s(FATAL)Rrt it^sFAIL: sFAIL-EXCEPTION: N(RsR�R�R�RuR�trstript
splitlinesRR�R�R�R�RR�R�R�R3RRRER�R7Ra(R�ttestsR�tcommenttfullDumptprintResultstfailureTestst
allResultstcommentstsuccessRpRtresultR�R�RL((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytrunTests�sNW'
+
,	
N(PR�R�R�RfR�R�tstaticmethodRhRjR�R�R�R�R�R�RzR�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�RR�R�R�R�R�R�R�R�t_MAX_INTR�R{R�R�R
RR�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�RRR	RR
RRRR�R"(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR"8s�			&	
		
	
		H			"2G	+					D																	
)									cBseZdZd�ZRS(sT
    Abstract C{ParserElement} subclass, for defining atomic matching patterns.
    cCstt|�jdt�dS(NR(RR*R�R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�	s(R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR*	scBseZdZd�ZRS(s,
    An empty token, will always match.
    cCs2tt|�j�d|_t|_t|_dS(NR(RRR�R�R�RsR�Rx(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�	s		(R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR	scBs#eZdZd�Zed�ZRS(s(
    A token that will never match.
    cCs;tt|�j�d|_t|_t|_d|_dS(NRsUnmatchable token(	RRR�R�R�RsR�RxRy(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�*	s
			cCst|||j|��dS(N(RRy(R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�1	s(R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR&	s	cBs#eZdZd�Zed�ZRS(s�
    Token to exactly match a specified string.
    
    Example::
        Literal('blah').parseString('blah')  # -> ['blah']
        Literal('blah').parseString('blahfooblah')  # -> ['blah']
        Literal('blah').parseString('bla')  # -> Exception: Expected "blah"
    
    For case-insensitive matching, use L{CaselessLiteral}.
    
    For keyword matching (force word break before and after the matched string),
    use L{Keyword} or L{CaselessKeyword}.
    cCs�tt|�j�||_t|�|_y|d|_Wn0tk
rntj	dt
dd�t|_nXdt
|j�|_d|j|_t|_t|_dS(Nis2null string passed to Literal; use Empty() insteadR�is"%s"s	Expected (RRR�tmatchR�tmatchLentfirstMatchCharR�R�R�R�RR^RR�RyR�RsRx(R�tmatchString((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�C	s	
	

	cCsg|||jkrK|jdks7|j|j|�rK||j|jfSt|||j|��dS(Ni(R'R&t
startswithR%RRy(R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�V	s$(R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR5	s
	cBsKeZdZedZded�Zed�Z	d�Z
ed��ZRS(s\
    Token to exactly match a specified string as a keyword, that is, it must be
    immediately followed by a non-keyword character.  Compare with C{L{Literal}}:
     - C{Literal("if")} will match the leading C{'if'} in C{'ifAndOnlyIf'}.
     - C{Keyword("if")} will not; it will only match the leading C{'if'} in C{'if x=1'}, or C{'if(y==2)'}
    Accepts two optional constructor arguments in addition to the keyword string:
     - C{identChars} is a string of characters that would be valid identifier characters,
          defaulting to all alphanumerics + "_" and "$"
     - C{caseless} allows case-insensitive matching, default is C{False}.
       
    Example::
        Keyword("start").parseString("start")  # -> ['start']
        Keyword("start").parseString("starting")  # -> Exception

    For case-insensitive matching, use L{CaselessKeyword}.
    s_$cCs�tt|�j�|dkr+tj}n||_t|�|_y|d|_Wn't	k
r}t
jdtdd�nXd|j|_
d|j
|_t|_t|_||_|r�|j�|_|j�}nt|�|_dS(Nis2null string passed to Keyword; use Empty() insteadR�is"%s"s	Expected (RRR�R�tDEFAULT_KEYWORD_CHARSR%R�R&R'R�R�R�R�R�RyR�RsRxtcaselesstuppert
caselessmatchR�t
identChars(R�R(R.R+((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�q	s&	
				cCsb|jr�||||j!j�|jkrF|t|�|jkse|||jj�|jkrF|dks�||dj�|jkrF||j|jfSn�|||jkrF|jdks�|j|j|�rF|t|�|jks|||j|jkrF|dks2||d|jkrF||j|jfSt	|||j
|��dS(Nii(R+R&R,R-R�R.R%R'R)RRy(R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��	s	#9)$3#cCs%tt|�j�}tj|_|S(N(RRR�R*R.(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��	scCs
|t_dS(s,Overrides the default Keyword chars
        N(RR*(Rg((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytsetDefaultKeywordChars�	sN(
R�R�R�R1R*R�R�R�R�R�R�R#R/(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR^	s
	cBs#eZdZd�Zed�ZRS(sl
    Token to match a specified string, ignoring case of letters.
    Note: the matched results will always be in the case of the given
    match string, NOT the case of the input text.

    Example::
        OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD']
        
    (Contrast with example for L{CaselessKeyword}.)
    cCsItt|�j|j��||_d|j|_d|j|_dS(Ns'%s's	Expected (RRR�R,treturnStringR�Ry(R�R(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��	s	cCsS||||j!j�|jkr7||j|jfSt|||j|��dS(N(R&R,R%R0RRy(R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��	s#(R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�	s
	cBs&eZdZdd�Zed�ZRS(s�
    Caseless version of L{Keyword}.

    Example::
        OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD']
        
    (Contrast with example for L{CaselessLiteral}.)
    cCs#tt|�j||dt�dS(NR+(RRR�R�(R�R(R.((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��	scCs�||||j!j�|jkrp|t|�|jks\|||jj�|jkrp||j|jfSt|||j|��dS(N(R&R,R-R�R.R%RRy(R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��	s#9N(R�R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�	scBs&eZdZdd�Zed�ZRS(sx
    A variation on L{Literal} which matches "close" matches, that is, 
    strings with at most 'n' mismatching characters. C{CloseMatch} takes parameters:
     - C{match_string} - string to be matched
     - C{maxMismatches} - (C{default=1}) maximum number of mismatches allowed to count as a match
    
    The results from a successful parse will contain the matched text from the input string and the following named results:
     - C{mismatches} - a list of the positions within the match_string where mismatches were found
     - C{original} - the original match_string used to compare against the input string
    
    If C{mismatches} is an empty list, then the match was an exact match.
    
    Example::
        patt = CloseMatch("ATCATCGAATGGA")
        patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']})
        patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1)

        # exact match
        patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']})

        # close match allowing up to 2 mismatches
        patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2)
        patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']})
    icCs]tt|�j�||_||_||_d|j|jf|_t|_t|_	dS(Ns&Expected %r (with up to %d mismatches)(
RRjR�R�tmatch_stringt
maxMismatchesRyR�RxRs(R�R1R2((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��	s				cCs|}t|�}|t|j�}||kr|j}d}g}	|j}
x�tt|||!|j��D]J\}}|\}}
||
kro|	j|�t|	�|
kr�Pq�qoqoW|d}t|||!g�}|j|d<|	|d<||fSnt|||j|��dS(Niitoriginalt
mismatches(	R�R1R2R�R�RR RRy(R�RER�R�tstartR�tmaxlocR1tmatch_stringlocR4R2ts_mtsrctmattresults((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��	s(		,




(R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRj�	s	cBs>eZdZddddedd�Zed�Zd�ZRS(s	
    Token for matching words composed of allowed character sets.
    Defined with string containing all allowed initial characters,
    an optional string containing allowed body characters (if omitted,
    defaults to the initial character set), and an optional minimum,
    maximum, and/or exact length.  The default value for C{min} is 1 (a
    minimum value < 1 is not valid); the default values for C{max} and C{exact}
    are 0, meaning no maximum or exact length restriction. An optional
    C{excludeChars} parameter can list characters that might be found in 
    the input C{bodyChars} string; useful to define a word of all printables
    except for one or two characters, for instance.
    
    L{srange} is useful for defining custom character set strings for defining 
    C{Word} expressions, using range notation from regular expression character sets.
    
    A common mistake is to use C{Word} to match a specific literal string, as in 
    C{Word("Address")}. Remember that C{Word} uses the string argument to define
    I{sets} of matchable characters. This expression would match "Add", "AAA",
    "dAred", or any other word made up of the characters 'A', 'd', 'r', 'e', and 's'.
    To match an exact literal string, use L{Literal} or L{Keyword}.

    pyparsing includes helper strings for building Words:
     - L{alphas}
     - L{nums}
     - L{alphanums}
     - L{hexnums}
     - L{alphas8bit} (alphabetic characters in ASCII range 128-255 - accented, tilded, umlauted, etc.)
     - L{punc8bit} (non-alphabetic characters in ASCII range 128-255 - currency, symbols, superscripts, diacriticals, etc.)
     - L{printables} (any non-whitespace character)

    Example::
        # a word composed of digits
        integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9"))
        
        # a word with a leading capital, and zero or more lowercase
        capital_word = Word(alphas.upper(), alphas.lower())

        # hostnames are alphanumeric, with leading alpha, and '-'
        hostname = Word(alphas, alphanums+'-')
        
        # roman numeral (not a strict parser, accepts invalid mix of characters)
        roman = Word("IVXLCDM")
        
        # any string of non-whitespace characters, except for ','
        csv_value = Word(printables, excludeChars=",")
    iics�tt|�j��rcdj�fd�|D��}|rcdj�fd�|D��}qcn||_t|�|_|r�||_t|�|_n||_t|�|_|dk|_	|dkr�t
d��n||_|dkr�||_n	t
|_|dkr)||_||_nt|�|_d|j|_t|_||_d|j|jkr}|dkr}|dkr}|dkr}|j|jkr�d	t|j�|_net|j�dkr�d
tj|j�t|j�f|_n%dt|j�t|j�f|_|jrDd|jd|_nytj|j�|_Wq}tk
ryd|_q}XndS(
NRrc3s!|]}|�kr|VqdS(N((R�R�(texcludeChars(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>7
sc3s!|]}|�kr|VqdS(N((R�R�(R<(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>9
siisZcannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitteds	Expected Rs[%s]+s%s[%s]*s	[%s][%s]*s\b(RR-R�R�t
initCharsOrigR�t	initCharst
bodyCharsOrigt	bodyCharstmaxSpecifiedR�tminLentmaxLenR$RR�RyR�Rxt	asKeywordt_escapeRegexRangeCharstreStringR�R|tescapetcompileRaR�(R�R>R@tmintmaxtexactRDR<((R<s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�4
sT%								:	
c
Cs�|jr[|jj||�}|s?t|||j|��n|j�}||j�fS|||jkr�t|||j|��n|}|d7}t|�}|j}||j	}t
||�}x*||kr�|||kr�|d7}q�Wt}	|||jkrt
}	n|jrG||krG|||krGt
}	n|jr�|dkrp||d|ks�||kr�|||kr�t
}	q�n|	r�t|||j|��n||||!fS(Nii(R|R%RRytendtgroupR>R�R@RCRIR�RBR�RARD(
R�RER�R�R!R5R�t	bodycharsR6tthrowException((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�j
s6	
	
	%		<cCs�ytt|�j�SWntk
r*nX|jdkr�d�}|j|jkr}d||j�||j�f|_q�d||j�|_n|jS(NcSs&t|�dkr|d dS|SdS(Nis...(R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
charsAsStr�
ss	W:(%s,%s)sW:(%s)(RR-R�RaRmR�R=R?(R�RP((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��
s
	(N(	R�R�R�R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR-
s.6#cBsDeZdZeejd��Zdd�Zed�Z	d�Z
RS(s�
    Token for matching strings that match a given regular expression.
    Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module.
    If the given regex contains named groups (defined using C{(?P<name>...)}), these will be preserved as 
    named parse results.

    Example::
        realnum = Regex(r"[+-]?\d+\.\d*")
        date = Regex(r'(?P<year>\d{4})-(?P<month>\d\d?)-(?P<day>\d\d?)')
        # ref: http://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression
        roman = Regex(r"M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})")
    s[A-Z]icCs3tt|�j�t|t�r�|sAtjdtdd�n||_||_	y+t
j|j|j	�|_
|j|_Wq�t
jk
r�tjd|tdd��q�XnIt|tj�r�||_
t|�|_|_||_	ntd��t|�|_d|j|_t|_t|_dS(s�The parameters C{pattern} and C{flags} are passed to the C{re.compile()} function as-is. See the Python C{re} module for an explanation of the acceptable patterns and flags.s0null string passed to Regex; use Empty() insteadR�is$invalid pattern (%s) passed to RegexsCRegex may only be constructed with a string or a compiled RE objects	Expected N(RR%R�RsR�R�R�R�tpatterntflagsR|RHRFt
sre_constantsterrortcompiledREtypeRuR�RR�RyR�RxR�Rs(R�RQRR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��
s.			


		cCs�|jj||�}|s6t|||j|��n|j�}|j�}t|j��}|r�x|D]}||||<qmWn||fS(N(R|R%RRyRLt	groupdictR RM(R�RER�R�R!tdR}R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��
s
cCsZytt|�j�SWntk
r*nX|jdkrSdt|j�|_n|jS(NsRe:(%s)(RR%R�RaRmR�R�RQ(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��
s
(R�R�R�R�R|RHRUR�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR%�
s
"
cBs>eZdZddeeded�Zed�Zd�ZRS(s�
    Token for matching strings that are delimited by quoting characters.
    
    Defined with the following parameters:
        - quoteChar - string of one or more characters defining the quote delimiting string
        - escChar - character to escape quotes, typically backslash (default=C{None})
        - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=C{None})
        - multiline - boolean indicating whether quotes can span multiple lines (default=C{False})
        - unquoteResults - boolean indicating whether the matched text should be unquoted (default=C{True})
        - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=C{None} => same as quoteChar)
        - convertWhitespaceEscapes - convert escaped whitespace (C{'\t'}, C{'\n'}, etc.) to actual whitespace (default=C{True})

    Example::
        qs = QuotedString('"')
        print(qs.searchString('lsjdf "This is the quote" sldjf'))
        complex_qs = QuotedString('{{', endQuoteChar='}}')
        print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf'))
        sql_qs = QuotedString('"', escQuote='""')
        print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf'))
    prints::
        [['This is the quote']]
        [['This is the "quote"']]
        [['This is the quote with "embedded" quotes']]
    c	stt��j�|j�}|sGtjdtdd�t��n|dkr\|}n4|j�}|s�tjdtdd�t��n|�_	t
|��_|d�_|�_
t
|��_|�_|�_|�_|�_|rTtjtjB�_dtj�j	�t�j
d�|dk	rDt|�pGdf�_nPd�_dtj�j	�t�j
d�|dk	r�t|�p�df�_t
�j
�d	kr�jd
dj�fd�tt
�j
�d	dd
�D��d7_n|r*�jdtj|�7_n|rh�jdtj|�7_tj�j�d�_n�jdtj�j
�7_y+tj�j�j��_�j�_Wn4tj k
r�tjd�jtdd��nXt!���_"d�j"�_#t$�_%t&�_'dS(Ns$quoteChar cannot be the empty stringR�is'endQuoteChar cannot be the empty stringis%s(?:[^%s%s]Rrs%s(?:[^%s\n\r%s]is|(?:s)|(?:c3s<|]2}dtj�j| �t�j|�fVqdS(s%s[^%s]N(R|RGtendQuoteCharRE(R�R�(R�(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>/si����t)s|(?:%s)s|(?:%s.)s(.)s)*%ss$invalid pattern (%s) passed to Regexs	Expected ((RR#R�R�R�R�R�tSyntaxErrorR�t	quoteCharR�tquoteCharLentfirstQuoteCharRXtendQuoteCharLentescChartescQuotetunquoteResultstconvertWhitespaceEscapesR|t	MULTILINEtDOTALLRRRGRERQR�R�tescCharReplacePatternRHRFRSRTRR�RyR�RxR�Rs(R�R[R_R`t	multilineRaRXRb((R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�sf		
					(	%E
	c	CsT|||jkr(|jj||�p+d}|sOt|||j|��n|j�}|j�}|jrJ||j	|j
!}t|t�rJd|kr�|j
r�idd6dd6dd6dd	6}x/|j�D]\}}|j||�}q�Wn|jr tj|jd
|�}n|jrG|j|j|j�}qGqJn||fS(Ns\s	s\ts
s\nss\fs
s\rs\g<1>(R]R|R%R�RRyRLRMRaR\R^RsR�RbR�R�R_R�ReR`RX(	R�RER�R�R!R}tws_maptwslittwschar((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�Gs*.	
		!cCs]ytt|�j�SWntk
r*nX|jdkrVd|j|jf|_n|jS(Ns.quoted string, starting with %s ending with %s(RR#R�RaRmR�R[RX(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�js
N(	R�R�R�R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR#�
sA#cBs5eZdZdddd�Zed�Zd�ZRS(s�
    Token for matching words composed of characters I{not} in a given set (will
    include whitespace in matched characters if not listed in the provided exclusion set - see example).
    Defined with string containing all disallowed characters, and an optional
    minimum, maximum, and/or exact length.  The default value for C{min} is 1 (a
    minimum value < 1 is not valid); the default values for C{max} and C{exact}
    are 0, meaning no maximum or exact length restriction.

    Example::
        # define a comma-separated-value as anything that is not a ','
        csv_value = CharsNotIn(',')
        print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213"))
    prints::
        ['dkls', 'lsdkjf', 's12 34', '@!#', '213']
    iicCs�tt|�j�t|_||_|dkr@td��n||_|dkra||_n	t	|_|dkr�||_||_nt
|�|_d|j|_|jdk|_
t|_dS(Nisfcannot specify a minimum length < 1; use Optional(CharsNotIn()) if zero-length char group is permittedis	Expected (RRR�R�RptnotCharsR�RBRCR$RR�RyRsRx(R�RjRIRJRK((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s 					cCs�|||jkr.t|||j|��n|}|d7}|j}t||jt|��}x*||kr�|||kr�|d7}qfW|||jkr�t|||j|��n||||!fS(Ni(RjRRyRIRCR�RB(R�RER�R�R5tnotcharstmaxlen((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s
	cCs�ytt|�j�SWntk
r*nX|jdkryt|j�dkrfd|jd |_qyd|j|_n|jS(Nis
!W:(%s...)s!W:(%s)(RRR�RaRmR�R�Rj(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s
(R�R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRvscBsXeZdZidd6dd6dd6dd6d	d
6Zddd
d
d�Zed�ZRS(s�
    Special matching class for matching whitespace.  Normally, whitespace is ignored
    by pyparsing grammars.  This class is included when some whitespace structures
    are significant.  Define with a string containing the whitespace characters to be
    matched; default is C{" \t\r\n"}.  Also takes optional C{min}, C{max}, and C{exact} arguments,
    as defined for the C{L{Word}} class.
    s<SPC>Rs<TAB>s	s<LF>s
s<CR>s
s<FF>ss 	
iics�tt��j�|�_�jdj�fd��jD���djd��jD���_t�_	d�j�_
|�_|dkr�|�_n	t
�_|dkr�|�_|�_ndS(NRrc3s$|]}|�jkr|VqdS(N(t
matchWhite(R�R�(R�(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�scss|]}tj|VqdS(N(R,t	whiteStrs(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�ss	Expected i(RR,R�RmR�R�RqR�R�RsRyRBRCR$(R�twsRIRJRK((R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s	)				cCs�|||jkr.t|||j|��n|}|d7}||j}t|t|��}x-||kr�|||jkr�|d7}qcW|||jkr�t|||j|��n||||!fS(Ni(RmRRyRCRIR�RB(R�RER�R�R5R6((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s

"(R�R�R�RnR�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR,�s
t_PositionTokencBseZd�ZRS(cCs8tt|�j�|jj|_t|_t|_	dS(N(
RRpR�R^R�R�R�RsR�Rx(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s	(R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRp�scBs,eZdZd�Zd�Zed�ZRS(sb
    Token to advance to a specific column of input text; useful for tabular report scraping.
    cCs tt|�j�||_dS(N(RRR�R7(R�tcolno((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scCs�t||�|jkr�t|�}|jrB|j||�}nxE||kr�||j�r�t||�|jkr�|d7}qEWn|S(Ni(R7R�RuR�tisspace(R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s	7cCs^t||�}||jkr6t||d|��n||j|}|||!}||fS(NsText not in expected column(R7R(R�RER�R�tthiscoltnewlocR}((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s
(R�R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s			cBs#eZdZd�Zed�ZRS(s�
    Matches if current position is at the beginning of a line within the parse string
    
    Example::
    
        test = '''        AAA this line
        AAA and this line
          AAA but not this one
        B AAA and definitely not this one
        '''

        for t in (LineStart() + 'AAA' + restOfLine).searchString(test):
            print(t)
    
    Prints::
        ['AAA', ' this line']
        ['AAA', ' and this line']    

    cCs tt|�j�d|_dS(NsExpected start of line(RRR�Ry(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�&scCs;t||�dkr|gfSt|||j|��dS(Ni(R7RRy(R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�*s
(R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRs	cBs#eZdZd�Zed�ZRS(sU
    Matches if current position is at the end of a line within the parse string
    cCs<tt|�j�|jtjjdd��d|_dS(Ns
RrsExpected end of line(RRR�R�R"RfR�Ry(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�3scCs�|t|�krK||dkr0|ddfSt|||j|��n8|t|�krk|dgfSt|||j|��dS(Ns
i(R�RRy(R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�8s(R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR/s	cBs#eZdZd�Zed�ZRS(sM
    Matches if current position is at the beginning of the parse string
    cCs tt|�j�d|_dS(NsExpected start of text(RR(R�Ry(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�GscCsL|dkrB||j|d�krBt|||j|��qBn|gfS(Ni(R�RRy(R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�Ks(R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR(Cs	cBs#eZdZd�Zed�ZRS(sG
    Matches if current position is at the end of the parse string
    cCs tt|�j�d|_dS(NsExpected end of text(RR'R�Ry(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�VscCs�|t|�kr-t|||j|��nT|t|�krM|dgfS|t|�kri|gfSt|||j|��dS(Ni(R�RRy(R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�Zs
(R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR'Rs	cBs&eZdZed�Zed�ZRS(sp
    Matches if the current position is at the beginning of a Word, and
    is not preceded by any character in a given set of C{wordChars}
    (default=C{printables}). To emulate the C{} behavior of regular expressions,
    use C{WordStart(alphanums)}. C{WordStart} will also match at the beginning of
    the string being parsed, or at the beginning of a line.
    cCs/tt|�j�t|�|_d|_dS(NsNot at the start of a word(RR/R�R�t	wordCharsRy(R�Ru((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�lscCs^|dkrT||d|jks6|||jkrTt|||j|��qTn|gfS(Nii(RuRRy(R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�qs
(R�R�R�RTR�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR/dscBs&eZdZed�Zed�ZRS(sZ
    Matches if the current position is at the end of a Word, and
    is not followed by any character in a given set of C{wordChars}
    (default=C{printables}). To emulate the C{} behavior of regular expressions,
    use C{WordEnd(alphanums)}. C{WordEnd} will also match at the end of
    the string being parsed, or at the end of a line.
    cCs8tt|�j�t|�|_t|_d|_dS(NsNot at the end of a word(RR.R�R�RuR�RpRy(R�Ru((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s	cCsvt|�}|dkrl||krl|||jksN||d|jkrlt|||j|��qln|gfS(Nii(R�RuRRy(R�RER�R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s(R�R�R�RTR�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR.xscBsqeZdZed�Zd�Zd�Zd�Zd�Zd�Z	d�Z
ed�Zgd	�Zd
�Z
RS(s^
    Abstract subclass of ParserElement, for combining and post-processing parsed tokens.
    cCs�tt|�j|�t|t�r4t|�}nt|t�r[tj|�g|_	n�t|t
j�r�t|�}td�|D��r�t
tj|�}nt|�|_	n3yt|�|_	Wntk
r�|g|_	nXt|_dS(Ncss|]}t|t�VqdS(N(RsR�(R�RF((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�s(RRR�RsR�R�R�R"RitexprsR�tIterabletallR�R�R�R}(R�RvR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s
cCs|j|S(N(Rv(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scCs|jj|�d|_|S(N(RvRR�Rm(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s	cCsPt|_g|jD]}|j�^q|_x|jD]}|j�q8W|S(s~Extends C{leaveWhitespace} defined in base class, and also invokes C{leaveWhitespace} on
           all contained expressions.(R�RpRvR�R�(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s
	%cCs�t|t�rb||jkr�tt|�j|�x(|jD]}|j|jd�q>Wq�n>tt|�j|�x%|jD]}|j|jd�q�W|S(Ni����(RsR)RuRRR�Rv(R�R	R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scCsfytt|�j�SWntk
r*nX|jdkr_d|jjt|j	�f|_n|jS(Ns%s:(%s)(
RRR�RaRmR�R^R�RRv(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s
%cCswtt|�j�x|jD]}|j�qWt|j�dkr`|jd}t||j�r�|jr�|jdkr�|j
r�|j|jdg|_d|_|j|jO_|j
|j
O_
n|jd}t||j�r`|jr`|jdkr`|j
r`|jd |j|_d|_|j|jO_|j
|j
O_
q`ndt|�|_|S(Niiii����s	Expected (RRR�RvR�RsR^RkRnR�RvRmRsRxRRy(R�R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s0


	


	cCstt|�j||�}|S(N(RRR�(R�R�R�R}((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scCs@||g}x|jD]}|j|�qW|jg�dS(N(RvRR(R�RttmpR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�scCs>tt|�j�}g|jD]}|j�^q|_|S(N(RRR�Rv(R�R}R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s%(R�R�R�R�R�R�RR�R�R�R�R�RR�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s						
	"cBsWeZdZdefd��YZed�Zed�Zd�Zd�Z	d�Z
RS(s

    Requires all given C{ParseExpression}s to be found in the given order.
    Expressions may be separated by whitespace.
    May be constructed using the C{'+'} operator.
    May also be constructed using the C{'-'} operator, which will suppress backtracking.

    Example::
        integer = Word(nums)
        name_expr = OneOrMore(Word(alphas))

        expr = And([integer("id"),name_expr("name"),integer("age")])
        # more easily written as:
        expr = integer("id") + name_expr("name") + integer("age")
    R�cBseZd�ZRS(cOs3ttj|�j||�d|_|j�dS(Nt-(RRR�R�R�R�(R�R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�
s	(R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�
scCsltt|�j||�td�|jD��|_|j|jdj�|jdj|_t	|_
dS(Ncss|]}|jVqdS(N(Rs(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>
si(RRR�RxRvRsR�RqRpR�R}(R�RvR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�
s
c	Cs?|jdj|||dt�\}}t}x|jdD]�}t|tj�r`t}q<n|r�y|j|||�\}}Wqtk
r��qtk
r�}d|_
tj|��qtk
r�t|t
|�|j|��qXn|j|||�\}}|s$|j�r<||7}q<q<W||fS(NiR�i(RvR�R�RsRR�R�R!RR�t
__traceback__R�R�R�RyR�(	R�RER�R�t
resultlistt	errorStopR�t
exprtokensR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�
s((
	
%cCs.t|t�r!tj|�}n|j|�S(N(RsR�R"RiR(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR5
scCs@||g}x+|jD] }|j|�|jsPqqWdS(N(RvRRs(R�R�tsubRecCheckListR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR:
s

	cCsVt|d�r|jS|jdkrOddjd�|jD��d|_n|jS(NR�t{Rcss|]}t|�VqdS(N(R(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>F
st}(R�R�RmR�R�Rv(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�A
s
*(R�R�R�RR�R�R�R�RRR�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s		cBsAeZdZed�Zed�Zd�Zd�Zd�Z	RS(s�
    Requires that at least one C{ParseExpression} is found.
    If two expressions match, the expression that matches the longest string will be used.
    May be constructed using the C{'^'} operator.

    Example::
        # construct Or using '^' operator
        
        number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums))
        print(number.searchString("123 3.1416 789"))
    prints::
        [['123'], ['3.1416'], ['789']]
    cCsNtt|�j||�|jrAtd�|jD��|_n	t|_dS(Ncss|]}|jVqdS(N(Rs(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>\
s(RRR�RvR4RsR�(R�RvR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�Y
s	cCs�d}d}g}x�|jD]�}y|j||�}Wn�tk
rw}	d|	_|	j|kr�|	}|	j}q�qtk
r�t|�|kr�t|t|�|j|�}t|�}q�qX|j	||f�qW|rh|j
dd��xn|D]c\}
}y|j|||�SWq�tk
r`}	d|	_|	j|kra|	}|	j}qaq�Xq�Wn|dk	r�|j|_|�nt||d|��dS(Ni����RcSs	|dS(Ni((tx((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqu
Rrs no defined alternatives to match(
R�RvR�RR{R�R�R�RyRtsortR�R�(R�RER�R�t	maxExcLoctmaxExceptionR�R�tloc2R�t_((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�`
s<	
		cCs.t|t�r!tj|�}n|j|�S(N(RsR�R"RiR(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__ixor__�
scCsVt|d�r|jS|jdkrOddjd�|jD��d|_n|jS(NR�R�s ^ css|]}t|�VqdS(N(R(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�
sR�(R�R�RmR�R�Rv(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��
s
*cCs3||g}x|jD]}|j|�qWdS(N(RvR(R�R�RR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�
s(
R�R�R�R�R�R�R�R�R�R(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRK
s
&			cBsAeZdZed�Zed�Zd�Zd�Zd�Z	RS(s�
    Requires that at least one C{ParseExpression} is found.
    If two expressions match, the first one listed is the one that will match.
    May be constructed using the C{'|'} operator.

    Example::
        # construct MatchFirst using '|' operator
        
        # watch the order of expressions to match
        number = Word(nums) | Combine(Word(nums) + '.' + Word(nums))
        print(number.searchString("123 3.1416 789")) #  Fail! -> [['123'], ['3'], ['1416'], ['789']]

        # put more selective expression first
        number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums)
        print(number.searchString("123 3.1416 789")) #  Better -> [['123'], ['3.1416'], ['789']]
    cCsNtt|�j||�|jrAtd�|jD��|_n	t|_dS(Ncss|]}|jVqdS(N(Rs(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�
s(RRR�RvR4RsR�(R�RvR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��
s	c	Cs�d}d}x�|jD]�}y|j|||�}|SWqtk
ro}|j|kr�|}|j}q�qtk
r�t|�|kr�t|t|�|j|�}t|�}q�qXqW|dk	r�|j|_|�nt||d|��dS(Ni����s no defined alternatives to match(	R�RvR�RR�R�R�RyR�(	R�RER�R�R�R�R�R}R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��
s$
	cCs.t|t�r!tj|�}n|j|�S(N(RsR�R"RiR(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__ior__�
scCsVt|d�r|jS|jdkrOddjd�|jD��d|_n|jS(NR�R�s | css|]}t|�VqdS(N(R(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�
sR�(R�R�RmR�R�Rv(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��
s
*cCs3||g}x|jD]}|j|�qWdS(N(RvR(R�R�RR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�
s(
R�R�R�R�R�R�R�R�R�R(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�
s			cBs8eZdZed�Zed�Zd�Zd�ZRS(sm
    Requires all given C{ParseExpression}s to be found, but in any order.
    Expressions may be separated by whitespace.
    May be constructed using the C{'&'} operator.

    Example::
        color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN")
        shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON")
        integer = Word(nums)
        shape_attr = "shape:" + shape_type("shape")
        posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn")
        color_attr = "color:" + color("color")
        size_attr = "size:" + integer("size")

        # use Each (using operator '&') to accept attributes in any order 
        # (shape and posn are required, color and size are optional)
        shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr)

        shape_spec.runTests('''
            shape: SQUARE color: BLACK posn: 100, 120
            shape: CIRCLE size: 50 color: BLUE posn: 50,80
            color:GREEN size:20 shape:TRIANGLE posn:20,40
            '''
            )
    prints::
        shape: SQUARE color: BLACK posn: 100, 120
        ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']]
        - color: BLACK
        - posn: ['100', ',', '120']
          - x: 100
          - y: 120
        - shape: SQUARE


        shape: CIRCLE size: 50 color: BLUE posn: 50,80
        ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']]
        - color: BLUE
        - posn: ['50', ',', '80']
          - x: 50
          - y: 80
        - shape: CIRCLE
        - size: 50


        color: GREEN size: 20 shape: TRIANGLE posn: 20,40
        ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']]
        - color: GREEN
        - posn: ['20', ',', '40']
          - x: 20
          - y: 40
        - shape: TRIANGLE
        - size: 20
    cCsKtt|�j||�td�|jD��|_t|_t|_dS(Ncss|]}|jVqdS(N(Rs(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>s(	RR
R�RxRvRsR�RptinitExprGroups(R�RvR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s	cCs4|jrLtd�|jD��|_g|jD]}t|t�r/|j^q/}g|jD]%}|jr]t|t�r]|^q]}|||_g|jD]}t|t	�r�|j^q�|_
g|jD]}t|t�r�|j^q�|_g|jD]$}t|tt	tf�s|^q|_
|j
|j7_
t|_n|}|j
}|j}	g}
t}x�|r_||	|j
|j}g}
x�|D]�}y|j||�}Wntk
r�|
j|�q�X|
j|jjt|�|��||kr|j|�q�||	kr�|	j|�q�q�Wt|
�t|�krut}ququW|r�djd�|D��}t||d|��n|
g|jD]*}t|t�r�|j|	kr�|^q�7}
g}x6|
D].}|j|||�\}}|j|�q�Wt|tg��}||fS(Ncss3|])}t|t�rt|j�|fVqdS(N(RsRRRF(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>ss, css|]}t|�VqdS(N(R(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>=ss*Missing one or more required elements (%s)(R�R�Rvtopt1mapRsRRFRst	optionalsR0tmultioptionalsRt
multirequiredtrequiredR�R�R�RRR�RtremoveR�R�R�tsumR (R�RER�R�R�topt1topt2ttmpLocttmpReqdttmpOptt
matchOrdertkeepMatchingttmpExprstfailedtmissingR|R;tfinalResults((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�sP	.5
117

	

"
>
cCsVt|d�r|jS|jdkrOddjd�|jD��d|_n|jS(NR�R�s & css|]}t|�VqdS(N(R(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>PsR�(R�R�RmR�R�Rv(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�Ks
*cCs3||g}x|jD]}|j|�qWdS(N(RvR(R�R�RR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRTs(R�R�R�R�R�R�R�R(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR
�
s
51		cBs_eZdZed�Zed�Zd�Zd�Zd�Z	d�Z
gd�Zd�ZRS(	sa
    Abstract subclass of C{ParserElement}, for combining and post-processing parsed tokens.
    cCs�tt|�j|�t|t�rattjt�rItj|�}qatjt	|��}n||_
d|_|dk	r�|j
|_
|j|_|j|j�|j|_|j|_|j|_|jj|j�ndS(N(RRR�RsR�t
issubclassR"RiR*RRFR�RmRxRsR�RqRpRoR}RuR(R�RFR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�^s		cCsG|jdk	r+|jj|||dt�Std||j|��dS(NR�Rr(RFR�R�R�RRy(R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�pscCs>t|_|jj�|_|jdk	r:|jj�n|S(N(R�RpRFR�R�R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�vs
	cCs�t|t�rc||jkr�tt|�j|�|jdk	r`|jj|jd�q`q�n?tt|�j|�|jdk	r�|jj|jd�n|S(Ni����(RsR)RuRRR�RFR�(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�}s cCs6tt|�j�|jdk	r2|jj�n|S(N(RRR�RFR�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scCsV||kr"t||g��n||g}|jdk	rR|jj|�ndS(N(R$RFR�R(R�R�R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s
cCsA||g}|jdk	r0|jj|�n|jg�dS(N(RFR�RR(R�RRy((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�scCsuytt|�j�SWntk
r*nX|jdkrn|jdk	rnd|jjt	|j�f|_n|jS(Ns%s:(%s)(
RRR�RaRmR�RFR^R�R(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s
%(
R�R�R�R�R�R�R�R�R�R�RRR�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRZs				cBs#eZdZd�Zed�ZRS(s�
    Lookahead matching of the given parse expression.  C{FollowedBy}
    does I{not} advance the parsing position within the input string, it only
    verifies that the specified parse expression matches at the current
    position.  C{FollowedBy} always returns a null token list.

    Example::
        # use FollowedBy to match a label only if it is followed by a ':'
        data_word = Word(alphas)
        label = data_word + FollowedBy(':')
        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
        
        OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint()
    prints::
        [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']]
    cCs#tt|�j|�t|_dS(N(RRR�R�Rs(R�RF((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scCs|jj||�|gfS(N(RFR�(R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s(R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s	cBs,eZdZd�Zed�Zd�ZRS(s�
    Lookahead to disallow matching with the given parse expression.  C{NotAny}
    does I{not} advance the parsing position within the input string, it only
    verifies that the specified parse expression does I{not} match at the current
    position.  Also, C{NotAny} does I{not} skip over leading whitespace. C{NotAny}
    always returns a null token list.  May be constructed using the '~' operator.

    Example::
        
    cCsBtt|�j|�t|_t|_dt|j�|_	dS(NsFound unwanted token, (
RRR�R�RpR�RsRRFRy(R�RF((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s		cCs:|jj||�r0t|||j|��n|gfS(N(RFR�RRy(R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scCsIt|d�r|jS|jdkrBdt|j�d|_n|jS(NR�s~{R�(R�R�RmR�RRF(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s
(R�R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s
	t_MultipleMatchcBs eZdd�Zed�ZRS(cCsftt|�j|�t|_|}t|t�rFtj|�}n|dk	rY|nd|_
dS(N(RR�R�R�RoRsR�R"RiR�t	not_ender(R�RFtstopOntender((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s	cCs|jj}|j}|jdk	}|r9|jj}n|rO|||�n||||dt�\}}y�|j}	xo|r�|||�n|	r�|||�}
n|}
|||
|�\}}|s�|j�r~||7}q~q~WWnt	t
fk
rnX||fS(NR�(RFR�R�R�R�R�R�RuR�RR�(R�RER�R�tself_expr_parsetself_skip_ignorablestcheck_endert
try_not_enderR�thasIgnoreExprsR�t	tmptokens((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s,	N(R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scBseZdZd�ZRS(s�
    Repetition of one or more of the given expression.
    
    Parameters:
     - expr - expression that must match one or more times
     - stopOn - (default=C{None}) - expression for a terminating sentinel
          (only required if the sentinel would ordinarily match the repetition 
          expression)          

    Example::
        data_word = Word(alphas)
        label = data_word + FollowedBy(':')
        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join))

        text = "shape: SQUARE posn: upper left color: BLACK"
        OneOrMore(attr_expr).parseString(text).pprint()  # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']]

        # use stopOn attribute for OneOrMore to avoid reading label string as part of the data
        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
        OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']]
        
        # could also be written as
        (attr_expr * (1,)).parseString(text).pprint()
    cCsIt|d�r|jS|jdkrBdt|j�d|_n|jS(NR�R�s}...(R�R�RmR�RRF(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�!s
(R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRscBs/eZdZdd�Zed�Zd�ZRS(sw
    Optional repetition of zero or more of the given expression.
    
    Parameters:
     - expr - expression that must match zero or more times
     - stopOn - (default=C{None}) - expression for a terminating sentinel
          (only required if the sentinel would ordinarily match the repetition 
          expression)          

    Example: similar to L{OneOrMore}
    cCs)tt|�j|d|�t|_dS(NR�(RR0R�R�Rs(R�RFR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�6scCsEy tt|�j|||�SWnttfk
r@|gfSXdS(N(RR0R�RR�(R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�:s cCsIt|d�r|jS|jdkrBdt|j�d|_n|jS(NR�Rs]...(R�R�RmR�RRF(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�@s
N(R�R�R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR0*st
_NullTokencBs eZd�ZeZd�ZRS(cCstS(N(R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�JscCsdS(NRr((R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�Ms(R�R�R�R>R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�Is	cBs/eZdZed�Zed�Zd�ZRS(sa
    Optional matching of the given expression.

    Parameters:
     - expr - expression that must match zero or more times
     - default (optional) - value to be returned if the optional expression is not found.

    Example::
        # US postal code can be a 5-digit zip, plus optional 4-digit qualifier
        zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4)))
        zip.runTests('''
            # traditional ZIP code
            12345
            
            # ZIP+4 form
            12101-0001
            
            # invalid ZIP
            98765-
            ''')
    prints::
        # traditional ZIP code
        12345
        ['12345']

        # ZIP+4 form
        12101-0001
        ['12101-0001']

        # invalid ZIP
        98765-
             ^
        FAIL: Expected end of text (at char 5), (line:1, col:6)
    cCsAtt|�j|dt�|jj|_||_t|_dS(NR(	RRR�R�RFRoRR�Rs(R�RFR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�ts	cCs�y(|jj|||dt�\}}Wnottfk
r�|jtk	r�|jjr�t|jg�}|j||jj<q�|jg}q�g}nX||fS(NR�(	RFR�R�RR�Rt_optionalNotMatchedRnR (R�RER�R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�zs(
cCsIt|d�r|jS|jdkrBdt|j�d|_n|jS(NR�RR(R�R�RmR�RRF(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s
(R�R�R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRQs"cBs,eZdZeddd�Zed�ZRS(s�	
    Token for skipping over all undefined text until the matched expression is found.

    Parameters:
     - expr - target expression marking the end of the data to be skipped
     - include - (default=C{False}) if True, the target expression is also parsed 
          (the skipped text and target expression are returned as a 2-element list).
     - ignore - (default=C{None}) used to define grammars (typically quoted strings and 
          comments) that might contain false matches to the target expression
     - failOn - (default=C{None}) define expressions that are not allowed to be 
          included in the skipped test; if found before the target expression is found, 
          the SkipTo is not a match

    Example::
        report = '''
            Outstanding Issues Report - 1 Jan 2000

               # | Severity | Description                               |  Days Open
            -----+----------+-------------------------------------------+-----------
             101 | Critical | Intermittent system crash                 |          6
              94 | Cosmetic | Spelling error on Login ('log|n')         |         14
              79 | Minor    | System slow when running too many reports |         47
            '''
        integer = Word(nums)
        SEP = Suppress('|')
        # use SkipTo to simply match everything up until the next SEP
        # - ignore quoted strings, so that a '|' character inside a quoted string does not match
        # - parse action will call token.strip() for each matched token, i.e., the description body
        string_data = SkipTo(SEP, ignore=quotedString)
        string_data.setParseAction(tokenMap(str.strip))
        ticket_expr = (integer("issue_num") + SEP 
                      + string_data("sev") + SEP 
                      + string_data("desc") + SEP 
                      + integer("days_open"))
        
        for tkt in ticket_expr.searchString(report):
            print tkt.dump()
    prints::
        ['101', 'Critical', 'Intermittent system crash', '6']
        - days_open: 6
        - desc: Intermittent system crash
        - issue_num: 101
        - sev: Critical
        ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14']
        - days_open: 14
        - desc: Spelling error on Login ('log|n')
        - issue_num: 94
        - sev: Cosmetic
        ['79', 'Minor', 'System slow when running too many reports', '47']
        - days_open: 47
        - desc: System slow when running too many reports
        - issue_num: 79
        - sev: Minor
    cCs�tt|�j|�||_t|_t|_||_t|_	t
|t�rgtj
|�|_n	||_dt|j�|_dS(NsNo match found for (RR&R�t
ignoreExprR�RsR�RxtincludeMatchR�RsR�R"RitfailOnRRFRy(R�R	tincludeR�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s						cCs�|}t|�}|j}|jj}|jdk	rB|jjnd}|jdk	rc|jjnd}	|}
x�|
|kr#|dk	r�|||
�r�Pq�n|	dk	r�x/y|	||
�}
Wq�tk
r�Pq�Xq�Wny|||
dt	dt	�Wn!t
tfk
r|
d7}
qrXPqrWt
|||j|��|
}|||!}t
|�}|jr�||||dt	�\}}
||
7}n||fS(NR�R�i(R�RFR�R�R�R�R�R�RR�RR�RyR R�(R�RER�R�RHR�RFt
expr_parsetself_failOn_canParseNexttself_ignoreExpr_tryParsettmploctskiptextt
skipresultR:((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s<	!!

	
N(R�R�R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR&�s6
cBs\eZdZd	d�Zd�Zd�Zd�Zd�Zgd�Z	d�Z
d�ZRS(
sK
    Forward declaration of an expression to be defined later -
    used for recursive grammars, such as algebraic infix notation.
    When the expression is known, it is assigned to the C{Forward} variable using the '<<' operator.

    Note: take care when assigning to C{Forward} not to overlook precedence of operators.
    Specifically, '|' has a lower precedence than '<<', so that::
        fwdExpr << a | b | c
    will actually be evaluated as::
        (fwdExpr << a) | b | c
    thereby leaving b and c out as parseable alternatives.  It is recommended that you
    explicitly group the values inserted into the C{Forward}::
        fwdExpr << (a | b | c)
    Converting to use the '<<=' operator instead will avoid this problem.

    See L{ParseResults.pprint} for an example of a recursive parser created using
    C{Forward}.
    cCs tt|�j|dt�dS(NR(RR
R�R�(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�scCs�t|t�r!tj|�}n||_d|_|jj|_|jj|_|j	|jj
�|jj|_|jj|_|j
j|jj
�|S(N(RsR�R"RiRFR�RmRxRsR�RqRpRoRuR(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
__lshift__s		cCs||>S(N((R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt__ilshift__'scCs
t|_|S(N(R�Rp(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�*s	cCs8|js4t|_|jdk	r4|jj�q4n|S(N(RwR�RFR�R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�.s
		cCsP||kr?||g}|jdk	r?|jj|�q?n|jg�dS(N(RFR�RR(R�RRy((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR5s
cCs�t|d�r|jS|jjdS|j|_t|_z+|jdk	r]t|j�}nd}Wd|j|_X|jjd|S(NR�s: ...R�s: (	R�R�R^R�t_revertClasst_ForwardNoRecurseRFR�R(R�t	retString((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�<s	

cCs=|jdk	r"tt|�j�St�}||K}|SdS(N(RFR�RR
R�(R�R}((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�Ms
	
N(R�R�R�R�R�R�R�R�R�RR�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR
s	
				R�cBseZd�ZRS(cCsdS(Ns...((R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�Vs(R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�UscBseZdZed�ZRS(sQ
    Abstract subclass of C{ParseExpression}, for converting parsed results.
    cCs#tt|�j|�t|_dS(N(RR+R�R�Ro(R�RFR((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�]s(R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR+YscBs/eZdZded�Zd�Zd�ZRS(s�
    Converter to concatenate all matching tokens to a single string.
    By default, the matching patterns must also be contiguous in the input string;
    this can be disabled by specifying C{'adjacent=False'} in the constructor.

    Example::
        real = Word(nums) + '.' + Word(nums)
        print(real.parseString('3.1416')) # -> ['3', '.', '1416']
        # will also erroneously match the following
        print(real.parseString('3. 1416')) # -> ['3', '.', '1416']

        real = Combine(Word(nums) + '.' + Word(nums))
        print(real.parseString('3.1416')) # -> ['3.1416']
        # no match when there are internal spaces
        print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...)
    RrcCsQtt|�j|�|r)|j�n||_t|_||_t|_dS(N(	RRR�R�tadjacentR�Rpt
joinStringR}(R�RFR�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�rs
			cCs6|jrtj||�ntt|�j|�|S(N(R�R"R�RR(R�R	((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�|s	cCse|j�}|2|tdj|j|j��gd|j�7}|jr]|j�r]|gS|SdS(NRrR�(R�R R�RR�RzRnR�(R�RER�R�tretToks((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s1(R�R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRas
	cBs eZdZd�Zd�ZRS(s�
    Converter to return the matched tokens as a list - useful for returning tokens of C{L{ZeroOrMore}} and C{L{OneOrMore}} expressions.

    Example::
        ident = Word(alphas)
        num = Word(nums)
        term = ident | num
        func = ident + Optional(delimitedList(term))
        print(func.parseString("fn a,b,100"))  # -> ['fn', 'a', 'b', '100']

        func = ident + Group(Optional(delimitedList(term)))
        print(func.parseString("fn a,b,100"))  # -> ['fn', ['a', 'b', '100']]
    cCs#tt|�j|�t|_dS(N(RRR�R�Ro(R�RF((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scCs|gS(N((R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s(R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s
	cBs eZdZd�Zd�ZRS(sW
    Converter to return a repetitive expression as a list, but also as a dictionary.
    Each element can also be referenced using the first token in the expression as its key.
    Useful for tabular report scraping when the first column can be used as a item key.

    Example::
        data_word = Word(alphas)
        label = data_word + FollowedBy(':')
        attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join))

        text = "shape: SQUARE posn: upper left color: light blue texture: burlap"
        attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
        
        # print attributes as plain groups
        print(OneOrMore(attr_expr).parseString(text).dump())
        
        # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names
        result = Dict(OneOrMore(Group(attr_expr))).parseString(text)
        print(result.dump())
        
        # access named fields as dict entries, or output as dict
        print(result['shape'])        
        print(result.asDict())
    prints::
        ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap']

        [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']]
        - color: light blue
        - posn: upper left
        - shape: SQUARE
        - texture: burlap
        SQUARE
        {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'}
    See more examples at L{ParseResults} of accessing fields by results name.
    cCs#tt|�j|�t|_dS(N(RR	R�R�Ro(R�RF((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scCsTx9t|�D]+\}}t|�dkr1q
n|d}t|t�rct|d�j�}nt|�dkr�td|�||<q
t|�dkr�t|dt�r�t|d|�||<q
|j�}|d=t|�dkst|t�r!|j	�r!t||�||<q
t|d|�||<q
W|j
rL|gS|SdS(NiiRri(R�R�RsRoRR�R�R R�R�Rn(R�RER�R�R�ttoktikeyt	dictvalue((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s$
&-	(R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR	�s#	cBs eZdZd�Zd�ZRS(sV
    Converter for ignoring the results of a parsed expression.

    Example::
        source = "a, b, c,d"
        wd = Word(alphas)
        wd_list1 = wd + ZeroOrMore(',' + wd)
        print(wd_list1.parseString(source))

        # often, delimiters that are useful during parsing are just in the
        # way afterward - use Suppress to keep them out of the parsed output
        wd_list2 = wd + ZeroOrMore(Suppress(',') + wd)
        print(wd_list2.parseString(source))
    prints::
        ['a', ',', 'b', ',', 'c', ',', 'd']
        ['a', 'b', 'c', 'd']
    (See also L{delimitedList}.)
    cCsgS(N((R�RER�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��scCs|S(N((R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��s(R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR)�s	cBs)eZdZd�Zd�Zd�ZRS(sI
    Wrapper for parse actions, to ensure they are only called once.
    cCst|�|_t|_dS(N(RetcallableR�tcalled(R�t
methodCall((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�scCsA|js+|j|||�}t|_|St||d��dS(NRr(R�R�R�R(R�R�RNRpR;((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s
		cCs
t|_dS(N(R�R�(R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytreset
s(R�R�R�R�R�R�(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�s		csCt����fd�}y�j|_Wntk
r>nX|S(ss
    Decorator for debugging parse actions. 
    
    When the parse action is called, this decorator will print C{">> entering I{method-name}(line:I{current_source_line}, I{parse_location}, I{matched_tokens})".}
    When the parse action completes, the decorator will print C{"<<"} followed by the returned value, or any exception that the parse action raised.

    Example::
        wd = Word(alphas)

        @traceParseAction
        def remove_duplicate_chars(tokens):
            return ''.join(sorted(set(''.join(tokens)))

        wds = OneOrMore(wd).setParseAction(remove_duplicate_chars)
        print(wds.parseString("slkdjs sld sldd sdlf sdljf"))
    prints::
        >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {}))
        <<leaving remove_duplicate_chars (ret: 'dfjkls')
        ['dfjkls']
    cs��j}|d\}}}t|�dkrI|djjd|}ntjjd|t||�||f�y�|�}Wn0tk
r�}tjjd||f��nXtjjd||f�|S(Ni����iit.s">>entering %s(line: '%s', %d, %r)
s<<leaving %s (exception: %s)
s<<leaving %s (ret: %r)
(R�R�R^RxtstderrtwriteRERa(tpaArgstthisFuncR�RNRpR}RL(R(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytz#s	)(ReR�R�(RR�((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR`
s

t,cCsxt|�dt|�dt|�d}|rSt|t||��j|�S|tt|�|�j|�SdS(s�
    Helper to define a delimited list of expressions - the delimiter defaults to ','.
    By default, the list elements and delimiters can have intervening whitespace, and
    comments, but this can be overridden by passing C{combine=True} in the constructor.
    If C{combine} is set to C{True}, the matching tokens are returned as a single token
    string, with the delimiters included; otherwise, the matching tokens are returned
    as a list of tokens, with the delimiters suppressed.

    Example::
        delimitedList(Word(alphas)).parseString("aa,bb,cc") # -> ['aa', 'bb', 'cc']
        delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE']
    s [Rs]...N(RRR0R�R)(RFtdelimtcombinetdlName((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR>9s
,!cs�t����fd�}|dkrBtt�jd��}n|j�}|jd�|j|dt�|�jdt	��d�S(s:
    Helper to define a counted list of expressions.
    This helper defines a pattern of the form::
        integer expr expr expr...
    where the leading integer tells how many expr expressions follow.
    The matched tokens returns the array of expr tokens as a list - the leading count token is suppressed.
    
    If C{intExpr} is specified, it should be a pyparsing expression that produces an integer value.

    Example::
        countedArray(Word(alphas)).parseString('2 ab cd ef')  # -> ['ab', 'cd']

        # in this parser, the leading integer value is given in binary,
        # '10' indicating that 2 values are in the array
        binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2))
        countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef')  # -> ['ab', 'cd']
    cs;|d}�|r,tt�g|��p5tt�>gS(Ni(RRRA(R�RNRpR�(t	arrayExprRF(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytcountFieldParseAction_s
-cSst|d�S(Ni(Ro(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqdRrtarrayLenR~s(len) s...N(
R
R�R-RPRzR�R�R�R�R(RFtintExprR�((R�RFs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR:Ls	
cCsMg}x@|D]8}t|t�r8|jt|��q
|j|�q
W|S(N(RsR�RR�R(tLR}R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�ks
csFt���fd�}|j|dt��jdt|���S(s*
    Helper to define an expression that is indirectly defined from
    the tokens matched in a previous expression, that is, it looks
    for a 'repeat' of a previous expression.  For example::
        first = Word(nums)
        second = matchPreviousLiteral(first)
        matchExpr = first + ":" + second
    will match C{"1:1"}, but not C{"1:2"}.  Because this matches a
    previous literal, will also match the leading C{"1:1"} in C{"1:10"}.
    If this is not desired, use C{matchPreviousExpr}.
    Do I{not} use with packrat parsing enabled.
    csc|rTt|�dkr'�|d>q_t|j��}�td�|D��>n�t�>dS(Niicss|]}t|�VqdS(N(R(R�ttt((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�s(R�R�R�RR(R�RNRpttflat(trep(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytcopyTokenToRepeater�sR~s(prev) (R
R�R�R�R(RFR�((R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRMts

	
cs\t��|j�}�|K��fd�}|j|dt��jdt|���S(sS
    Helper to define an expression that is indirectly defined from
    the tokens matched in a previous expression, that is, it looks
    for a 'repeat' of a previous expression.  For example::
        first = Word(nums)
        second = matchPreviousExpr(first)
        matchExpr = first + ":" + second
    will match C{"1:1"}, but not C{"1:2"}.  Because this matches by
    expressions, will I{not} match the leading C{"1:1"} in C{"1:10"};
    the expressions are evaluated first, and then compared, so
    C{"1"} is compared with C{"10"}.
    Do I{not} use with packrat parsing enabled.
    cs8t|j����fd�}�j|dt�dS(Ncs7t|j��}|�kr3tddd��ndS(NRri(R�R�R(R�RNRpttheseTokens(tmatchTokens(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytmustMatchTheseTokens�sR~(R�R�RzR�(R�RNRpR�(R�(R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��sR~s(prev) (R
R�R�R�R�R(RFte2R�((R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRL�s	
cCsUx$dD]}|j|t|�}qW|jdd�}|jdd�}t|�S(Ns\^-]s
s\ns	s\t(R�t_bslashR(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRE�s

c
sD|r!d�}d�}t�nd�}d�}t�g}t|t�r]|j�}n7t|tj�r~t|�}ntj	dt
dd�|s�t�Sd}x�|t|�d	krV||}x�t
||d	�D]f\}}	||	|�r
|||d	=Pq�|||	�r�|||d	=|j||	�|	}Pq�q�W|d	7}q�W|r|ry�t|�td
j|��kr�tdd
jd�|D���jd
j|��Stdjd�|D���jd
j|��SWqtk
rtj	dt
dd�qXnt�fd�|D��jd
j|��S(s�
    Helper to quickly define a set of alternative Literals, and makes sure to do
    longest-first testing when there is a conflict, regardless of the input order,
    but returns a C{L{MatchFirst}} for best performance.

    Parameters:
     - strs - a string of space-delimited literals, or a collection of string literals
     - caseless - (default=C{False}) - treat all literals as caseless
     - useRegex - (default=C{True}) - as an optimization, will generate a Regex
          object; otherwise, will generate a C{MatchFirst} object (if C{caseless=True}, or
          if creating a C{Regex} raises an exception)

    Example::
        comp_oper = oneOf("< = > <= >= !=")
        var = Word(alphas)
        number = Word(nums)
        term = var | number
        comparison_expr = term + comp_oper + term
        print(comparison_expr.searchString("B = 12  AA=23 B<=AA AA>12"))
    prints::
        [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']]
    cSs|j�|j�kS(N(R,(Rtb((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq�RrcSs|j�j|j��S(N(R,R)(RR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq�RrcSs
||kS(N((RR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq�RrcSs
|j|�S(N(R)(RR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq�Rrs6Invalid argument to oneOf, expected string or iterableR�iiiRrs[%s]css|]}t|�VqdS(N(RE(R�tsym((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�ss | t|css|]}tj|�VqdS(N(R|RG(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�ss7Exception creating Regex for oneOf, building MatchFirstc3s|]}�|�VqdS(N((R�R�(tparseElementClass(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�s(RRRsR�R�R�RwR�R�R�R�RR�R�RR�R%R�RaR(
tstrsR+tuseRegextisequaltmaskstsymbolsR�tcurR�R	((R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRQ�sL						

!
!33
	cCsttt||���S(s�
    Helper to easily and clearly define a dictionary by specifying the respective patterns
    for the key and value.  Takes care of defining the C{L{Dict}}, C{L{ZeroOrMore}}, and C{L{Group}} tokens
    in the proper order.  The key pattern can include delimiting markers or punctuation,
    as long as they are suppressed, thereby leaving the significant key text.  The value
    pattern can include named results, so that the C{Dict} results can include named token
    fields.

    Example::
        text = "shape: SQUARE posn: upper left color: light blue texture: burlap"
        attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join))
        print(OneOrMore(attr_expr).parseString(text).dump())
        
        attr_label = label
        attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)

        # similar to Dict, but simpler call format
        result = dictOf(attr_label, attr_value).parseString(text)
        print(result.dump())
        print(result['shape'])
        print(result.shape)  # object attribute access works too
        print(result.asDict())
    prints::
        [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']]
        - color: light blue
        - posn: upper left
        - shape: SQUARE
        - texture: burlap
        SQUARE
        SQUARE
        {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'}
    (R	R0R(RR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR?�s!cCs|t�jd��}|j�}t|_|d�||d�}|rVd�}n	d�}|j|�|j|_|S(s�
    Helper to return the original, untokenized text for a given expression.  Useful to
    restore the parsed fields of an HTML start tag into the raw tag text itself, or to
    revert separate tokens with intervening whitespace back to the original matching
    input text. By default, returns astring containing the original parsed text.  
       
    If the optional C{asString} argument is passed as C{False}, then the return value is a 
    C{L{ParseResults}} containing any results names that were originally matched, and a 
    single token containing the original matched text from the input string.  So if 
    the expression passed to C{L{originalTextFor}} contains expressions with defined
    results names, you must set C{asString} to C{False} if you want to preserve those
    results name values.

    Example::
        src = "this is test <b> bold <i>text</i> </b> normal text "
        for tag in ("b","i"):
            opener,closer = makeHTMLTags(tag)
            patt = originalTextFor(opener + SkipTo(closer) + closer)
            print(patt.searchString(src)[0])
    prints::
        ['<b> bold <i>text</i> </b>']
        ['<i>text</i>']
    cSs|S(N((R�R�Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq8Rrt_original_startt
_original_endcSs||j|j!S(N(R�R�(R�RNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq=RrcSs'||jd�|jd�!g|(dS(NR�R�(R�(R�RNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytextractText?s(RRzR�R�R}Ru(RFtasStringt	locMarkertendlocMarkert	matchExprR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRe s		
cCst|�jd��S(sp
    Helper to undo pyparsing's default grouping of And expressions, even
    if all but one are non-empty.
    cSs|dS(Ni((Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqJRr(R+Rz(RF((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRfEscCsEt�jd��}t|d�|d�|j�j�d��S(s�
    Helper to decorate a returned token with its starting and ending locations in the input string.
    This helper adds the following results names:
     - locn_start = location where matched expression begins
     - locn_end = location where matched expression ends
     - value = the actual parsed results

    Be careful if the input text contains C{<TAB>} characters, you may want to call
    C{L{ParserElement.parseWithTabs}}

    Example::
        wd = Word(alphas)
        for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"):
            print(match)
    prints::
        [[0, 'ljsdf', 5]]
        [[8, 'lksdjjf', 15]]
        [[18, 'lkkjj', 23]]
    cSs|S(N((R�RNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq`Rrt
locn_startR�tlocn_end(RRzRR�R�(RFtlocator((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRhLss\[]-*.$+^?()~ RKcCs|ddS(Nii((R�RNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqkRrs\\0?[xX][0-9a-fA-F]+cCs tt|djd�d��S(Nis\0xi(tunichrRotlstrip(R�RNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqlRrs	\\0[0-7]+cCstt|ddd��S(Niii(R�Ro(R�RNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqmRrR<s\]s\wRzRRtnegatetbodyRcsOd��y-dj�fd�tj|�jD��SWntk
rJdSXdS(s�
    Helper to easily define string ranges for use in Word construction.  Borrows
    syntax from regexp '[]' string range definitions::
        srange("[0-9]")   -> "0123456789"
        srange("[a-z]")   -> "abcdefghijklmnopqrstuvwxyz"
        srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_"
    The input string must be enclosed in []'s, and the returned string is the expanded
    character set joined into a single string.
    The values enclosed in the []'s may be:
     - a single character
     - an escaped character with a leading backslash (such as C{\-} or C{\]})
     - an escaped hex character with a leading C{'\x'} (C{\x21}, which is a C{'!'} character) 
         (C{\0x##} is also supported for backwards compatibility) 
     - an escaped octal character with a leading C{'\0'} (C{\041}, which is a C{'!'} character)
     - a range of any of the above, separated by a dash (C{'a-z'}, etc.)
     - any combination of the above (C{'aeiouy'}, C{'a-zA-Z0-9_$'}, etc.)
    cSsKt|t�s|Sdjd�tt|d�t|d�d�D��S(NRrcss|]}t|�VqdS(N(R�(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�sii(RsR R�R�tord(tp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq�RrRrc3s|]}�|�VqdS(N((R�tpart(t	_expanded(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�sN(R�t_reBracketExprR�R�Ra(R�((R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR]rs
	-
cs�fd�}|S(st
    Helper method for defining parse actions that require matching at a specific
    column in the input text.
    cs2t||��kr.t||d���ndS(Nsmatched token not at column %d(R7R(R@tlocnRJ(R�(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt	verifyCol�s((R�R�((R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRK�scs
�fd�S(s�
    Helper method for common parse actions that simply return a literal value.  Especially
    useful when used with C{L{transformString<ParserElement.transformString>}()}.

    Example::
        num = Word(nums).setParseAction(lambda toks: int(toks[0]))
        na = oneOf("N/A NA").setParseAction(replaceWith(math.nan))
        term = na | num
        
        OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234]
    cs�gS(N((R�RNRp(treplStr(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq�Rr((R�((R�s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRZ�scCs|ddd!S(s
    Helper parse action for removing quotation marks from parsed quoted strings.

    Example::
        # by default, quotation marks are included in parsed results
        quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"]

        # use removeQuotes to strip quotation marks from parsed results
        quotedString.setParseAction(removeQuotes)
        quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"]
    iii����((R�RNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRX�scsa��fd�}y"t�dt�d�j�}Wntk
rSt��}nX||_|S(sG
    Helper to define a parse action by mapping a function to all elements of a ParseResults list.If any additional 
    args are passed, they are forwarded to the given function as additional arguments after
    the token, as in C{hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))}, which will convert the
    parsed data to an integer using base 16.

    Example (compare the last to example in L{ParserElement.transformString}::
        hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16))
        hex_ints.runTests('''
            00 11 22 aa FF 0a 0d 1a
            ''')
        
        upperword = Word(alphas).setParseAction(tokenMap(str.upper))
        OneOrMore(upperword).runTests('''
            my kingdom for a horse
            ''')

        wd = Word(alphas).setParseAction(tokenMap(str.title))
        OneOrMore(wd).setParseAction(' '.join).runTests('''
            now is the winter of our discontent made glorious summer by this sun of york
            ''')
    prints::
        00 11 22 aa FF 0a 0d 1a
        [0, 17, 34, 170, 255, 10, 13, 26]

        my kingdom for a horse
        ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE']

        now is the winter of our discontent made glorious summer by this sun of york
        ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York']
    cs g|D]}�|��^qS(N((R�RNRpttokn(R�RO(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR��sR�R^(R`R�RaRu(ROR�R�Rd((R�ROs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRk�s 	
	cCst|�j�S(N(RR,(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq�RrcCst|�j�S(N(Rtlower(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq�RrcCs<t|t�r+|}t|d|�}n	|j}tttd�}|r�tj�j	t
�}td�|d�tt
t|td�|���tddtg�jd�j	d	��td
�}n�djd�tD��}tj�j	t
�t|�B}td�|d�tt
t|j	t�ttd�|����tddtg�jd�j	d
��td
�}ttd�|d
�}|jddj|jdd�j�j���jd|�}|jddj|jdd�j�j���jd|�}||_||_||fS(sRInternal helper to construct opening and closing tag expressions, given a tag nameR+s_-:Rttagt=t/R�RAcSs|ddkS(NiR�((R�RNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq�RrR Rrcss!|]}|dkr|VqdS(R N((R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�scSs|ddkS(NiR�((R�RNRp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq�Rrs</R5t:Rs<%s>RLs</%s>(RsR�RR�R-R2R1R<R�RzRXR)R	R0RRR�R�R�RTRWR@Rt_LR�ttitleR�R�R�(ttagStrtxmltresnamettagAttrNamettagAttrValuetopenTagtprintablesLessRAbracktcloseTag((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt	_makeTags�s"	o{AA		cCs
t|t�S(s 
    Helper to construct opening and closing tag expressions for HTML, given a tag name. Matches
    tags in either upper or lower case, attributes with namespaces and with quoted or unquoted values.

    Example::
        text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>'
        # makeHTMLTags returns pyparsing expressions for the opening and closing tags as a 2-tuple
        a,a_end = makeHTMLTags("A")
        link_expr = a + SkipTo(a_end)("link_text") + a_end
        
        for link in link_expr.searchString(text):
            # attributes in the <A> tag (like "href" shown here) are also accessible as named results
            print(link.link_text, '->', link.href)
    prints::
        pyparsing -> http://pyparsing.wikispaces.com
    (RR�(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRI�scCs
t|t�S(s�
    Helper to construct opening and closing tag expressions for XML, given a tag name. Matches
    tags only in the given upper/lower case.

    Example: similar to L{makeHTMLTags}
    (RR�(R((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRJscsT|r|�n|j��g�D]\}}||f^q#��fd�}|S(s<
    Helper to create a validating parse action to be used with start tags created
    with C{L{makeXMLTags}} or C{L{makeHTMLTags}}. Use C{withAttribute} to qualify a starting tag
    with a required attribute value, to avoid false matches on common tags such as
    C{<TD>} or C{<DIV>}.

    Call C{withAttribute} with a series of attribute names and values. Specify the list
    of filter attributes names and values as:
     - keyword arguments, as in C{(align="right")}, or
     - as an explicit dict with C{**} operator, when an attribute name is also a Python
          reserved word, as in C{**{"class":"Customer", "align":"right"}}
     - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") )
    For attribute names with a namespace prefix, you must use the second form.  Attribute
    names are matched insensitive to upper/lower case.
       
    If just testing for C{class} (with or without a namespace), use C{L{withClass}}.

    To verify that the attribute exists, but without specifying a value, pass
    C{withAttribute.ANY_VALUE} as the value.

    Example::
        html = '''
            <div>
            Some text
            <div type="grid">1 4 0 1 0</div>
            <div type="graph">1,3 2,3 1,1</div>
            <div>this has no type</div>
            </div>
                
        '''
        div,div_end = makeHTMLTags("div")

        # only match div tag having a type attribute with value "grid"
        div_grid = div().setParseAction(withAttribute(type="grid"))
        grid_expr = div_grid + SkipTo(div | div_end)("body")
        for grid_header in grid_expr.searchString(html):
            print(grid_header.body)
        
        # construct a match with any div tag having a type attribute, regardless of the value
        div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE))
        div_expr = div_any_type + SkipTo(div | div_end)("body")
        for div_header in div_expr.searchString(html):
            print(div_header.body)
    prints::
        1 4 0 1 0

        1 4 0 1 0
        1,3 2,3 1,1
    cs�x~�D]v\}}||kr8t||d|��n|tjkr|||krt||d||||f��qqWdS(Nsno matching attribute s+attribute '%s' has value '%s', must be '%s'(RRct	ANY_VALUE(R�RNR�tattrNamet	attrValue(tattrs(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyR�Rs(R�(R�tattrDictR�R�R�((Rs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRcs2
%cCs'|rd|nd}ti||6�S(s�
    Simplified version of C{L{withAttribute}} when matching on a div class - made
    difficult because C{class} is a reserved word in Python.

    Example::
        html = '''
            <div>
            Some text
            <div class="grid">1 4 0 1 0</div>
            <div class="graph">1,3 2,3 1,1</div>
            <div>this &lt;div&gt; has no class</div>
            </div>
                
        '''
        div,div_end = makeHTMLTags("div")
        div_grid = div().setParseAction(withClass("grid"))
        
        grid_expr = div_grid + SkipTo(div | div_end)("body")
        for grid_header in grid_expr.searchString(html):
            print(grid_header.body)
        
        div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE))
        div_expr = div_any_type + SkipTo(div | div_end)("body")
        for div_header in div_expr.searchString(html):
            print(div_header.body)
    prints::
        1 4 0 1 0

        1 4 0 1 0
        1,3 2,3 1,1
    s%s:classtclass(Rc(t	classnamet	namespacet	classattr((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRi\s t(RYcCs<t�}||||B}xt|�D]\}}|dd \}}	}
}|	dkrdd|nd|}|	dkr�|d
ks�t|�dkr�td��n|\}
}nt�j|�}|
tjkr�|	dkr
t||�t	|t
|��}q�|	dkrx|d
k	rQt|||�t	|t
||��}q�t||�t	|t
|��}q�|	dkr�t||
|||�t	||
|||�}q�td��n+|
tjkr�|	dkr)t|t
�st
|�}nt|j|�t	||�}q�|	dkr�|d
k	rpt|||�t	|t
||��}q�t||�t	|t
|��}q�|	dkr�t||
|||�t	||
|||�}q�td��ntd	��|r
|j|�n||j|�|BK}|}q(W||K}|S(s�	
    Helper method for constructing grammars of expressions made up of
    operators working in a precedence hierarchy.  Operators may be unary or
    binary, left- or right-associative.  Parse actions can also be attached
    to operator expressions. The generated parser will also recognize the use 
    of parentheses to override operator precedences (see example below).
    
    Note: if you define a deep operator list, you may see performance issues
    when using infixNotation. See L{ParserElement.enablePackrat} for a
    mechanism to potentially improve your parser performance.

    Parameters:
     - baseExpr - expression representing the most basic element for the nested
     - opList - list of tuples, one for each operator precedence level in the
      expression grammar; each tuple is of the form
      (opExpr, numTerms, rightLeftAssoc, parseAction), where:
       - opExpr is the pyparsing expression for the operator;
          may also be a string, which will be converted to a Literal;
          if numTerms is 3, opExpr is a tuple of two expressions, for the
          two operators separating the 3 terms
       - numTerms is the number of terms for this operator (must
          be 1, 2, or 3)
       - rightLeftAssoc is the indicator whether the operator is
          right or left associative, using the pyparsing-defined
          constants C{opAssoc.RIGHT} and C{opAssoc.LEFT}.
       - parseAction is the parse action to be associated with
          expressions matching this operator expression (the
          parse action tuple member may be omitted)
     - lpar - expression for matching left-parentheses (default=C{Suppress('(')})
     - rpar - expression for matching right-parentheses (default=C{Suppress(')')})

    Example::
        # simple example of four-function arithmetic with ints and variable names
        integer = pyparsing_common.signed_integer
        varname = pyparsing_common.identifier 
        
        arith_expr = infixNotation(integer | varname,
            [
            ('-', 1, opAssoc.RIGHT),
            (oneOf('* /'), 2, opAssoc.LEFT),
            (oneOf('+ -'), 2, opAssoc.LEFT),
            ])
        
        arith_expr.runTests('''
            5+3*6
            (5+3)*6
            -2--11
            ''', fullDump=False)
    prints::
        5+3*6
        [[5, '+', [3, '*', 6]]]

        (5+3)*6
        [[[5, '+', 3], '*', 6]]

        -2--11
        [[['-', 2], '-', ['-', 11]]]
    iis%s terms	%s%s termis@if numterms=3, opExpr must be a tuple or list of two expressionsis6operator must be unary (1), binary (2), or ternary (3)s2operator must indicate right or left associativityN(N(R
R�R�R�R�R�RRtLEFTRRRtRIGHTRsRRFRz(tbaseExprtopListtlpartrparR}tlastExprR�toperDeftopExprtaritytrightLeftAssocR�ttermNametopExpr1topExpr2tthisExprR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRg�sR;	 '/' $/' 

s4"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*t"s string enclosed in double quotess4'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*t's string enclosed in single quotess*quotedString using single or double quotestusunicode string literalcCs!||krtd��n|d
kr�t|t�rt|t�rt|�dkr�t|�dkr�|d
k	r�tt|t||tj	dd���j
d��}q|tj�t||tj	�j
d��}q�|d
k	r9tt|t
|�t
|�ttj	dd���j
d��}q�ttt
|�t
|�ttj	dd���j
d��}q�td��nt�}|d
k	r�|tt|�t||B|B�t|��K}n.|tt|�t||B�t|��K}|jd	||f�|S(s~	
    Helper method for defining nested lists enclosed in opening and closing
    delimiters ("(" and ")" are the default).

    Parameters:
     - opener - opening character for a nested list (default=C{"("}); can also be a pyparsing expression
     - closer - closing character for a nested list (default=C{")"}); can also be a pyparsing expression
     - content - expression for items within the nested lists (default=C{None})
     - ignoreExpr - expression for ignoring opening and closing delimiters (default=C{quotedString})

    If an expression is not provided for the content argument, the nested
    expression will capture all whitespace-delimited content between delimiters
    as a list of separate values.

    Use the C{ignoreExpr} argument to define expressions that may contain
    opening or closing characters that should not be treated as opening
    or closing characters for nesting, such as quotedString or a comment
    expression.  Specify multiple expressions using an C{L{Or}} or C{L{MatchFirst}}.
    The default is L{quotedString}, but if no expressions are to be ignored,
    then pass C{None} for this argument.

    Example::
        data_type = oneOf("void int short long char float double")
        decl_data_type = Combine(data_type + Optional(Word('*')))
        ident = Word(alphas+'_', alphanums+'_')
        number = pyparsing_common.number
        arg = Group(decl_data_type + ident)
        LPAR,RPAR = map(Suppress, "()")

        code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment))

        c_function = (decl_data_type("type") 
                      + ident("name")
                      + LPAR + Optional(delimitedList(arg), [])("args") + RPAR 
                      + code_body("body"))
        c_function.ignore(cStyleComment)
        
        source_code = '''
            int is_odd(int x) { 
                return (x%2); 
            }
                
            int dec_to_hex(char hchar) { 
                if (hchar >= '0' && hchar <= '9') { 
                    return (ord(hchar)-ord('0')); 
                } else { 
                    return (10+ord(hchar)-ord('A'));
                } 
            }
        '''
        for func in c_function.searchString(source_code):
            print("%(name)s (%(type)s) args: %(args)s" % func)

    prints::
        is_odd (int) args: [['int', 'x']]
        dec_to_hex (int) args: [['char', 'hchar']]
    s.opening and closing strings cannot be the sameiRKcSs|dj�S(Ni(R�(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq9RrcSs|dj�S(Ni(R�(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq<RrcSs|dj�S(Ni(R�(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqBRrcSs|dj�S(Ni(R�(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRqFRrsOopening and closing arguments must be strings if no content expression is givensnested %s%s expressionN(R�R�RsR�R�RRRR"RfRzRAR�RR
RR)R0R�(topenertclosertcontentR�R}((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRN�s4:$
$ 	5.cs5�fd�}�fd�}�fd�}tt�jd�j��}t�t�j|�jd�}t�j|�jd�}t�j|�jd�}	|r�tt|�|t|t|�t|��|	�}
n0tt|�t|t|�t|���}
|j	t
t��|
jd�S(	s
	
    Helper method for defining space-delimited indentation blocks, such as
    those used to define block statements in Python source code.

    Parameters:
     - blockStatementExpr - expression defining syntax of statement that
            is repeated within the indented block
     - indentStack - list created by caller to manage indentation stack
            (multiple statementWithIndentedBlock expressions within a single grammar
            should share a common indentStack)
     - indent - boolean indicating whether block must be indented beyond the
            the current level; set to False for block of left-most statements
            (default=C{True})

    A valid block must contain at least one C{blockStatement}.

    Example::
        data = '''
        def A(z):
          A1
          B = 100
          G = A2
          A2
          A3
        B
        def BB(a,b,c):
          BB1
          def BBA():
            bba1
            bba2
            bba3
        C
        D
        def spam(x,y):
             def eggs(z):
                 pass
        '''


        indentStack = [1]
        stmt = Forward()

        identifier = Word(alphas, alphanums)
        funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":")
        func_body = indentedBlock(stmt, indentStack)
        funcDef = Group( funcDecl + func_body )

        rvalue = Forward()
        funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")")
        rvalue << (funcCall | identifier | Word(nums))
        assignment = Group(identifier + "=" + rvalue)
        stmt << ( funcDef | assignment | identifier )

        module_body = OneOrMore(stmt)

        parseTree = module_body.parseString(data)
        parseTree.pprint()
    prints::
        [['def',
          'A',
          ['(', 'z', ')'],
          ':',
          [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]],
         'B',
         ['def',
          'BB',
          ['(', 'a', 'b', 'c', ')'],
          ':',
          [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]],
         'C',
         'D',
         ['def',
          'spam',
          ['(', 'x', 'y', ')'],
          ':',
          [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] 
    css|t|�krdSt||�}|�dkro|�dkrZt||d��nt||d��ndS(Ni����sillegal nestingsnot a peer entry(R�R7RR(R�RNRptcurCol(tindentStack(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytcheckPeerIndent�scsEt||�}|�dkr/�j|�nt||d��dS(Ni����snot a subentry(R7RR(R�RNRpR+(R,(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytcheckSubIndent�scsn|t|�krdSt||�}�oH|�dkoH|�dks`t||d��n�j�dS(Ni����i����snot an unindent(R�R7RR�(R�RNRpR+(R,(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
checkUnindent�s&s	 tINDENTRrtUNINDENTsindented block(RRR�R�RRzR�RRR�R�(tblockStatementExprR,R$R-R.R/R7R0tPEERtUNDENTtsmExpr((R,s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRdQsN"8$s#[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]s[\0xa1-\0xbf\0xd7\0xf7]s_:sany tagsgt lt amp nbsp quot aposs><& "'s&(?P<entity>R�s);scommon HTML entitycCstj|j�S(sRHelper parser action to replace common HTML entities with their special characters(t_htmlEntityMapR�tentity(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRY�ss/\*(?:[^*]|\*(?!/))*s*/sC style comments<!--[\s\S]*?-->sHTML comments.*srest of lines//(?:\\\n|[^\n])*s
// commentsC++ style comments#.*sPython style comments 	t	commaItemR�cBs�eZdZee�Zee�Zee	�j
d�je�Zee
�j
d�jeed��Zed�j
d�je�Ze�je�de�je�j
d�Zejd��eeeed	�j�e�Bj
d
�Zeje�ed�j
d�je�Zed
�j
d�je�ZeeBeBj�Zed�j
d�je�Zeeded�j
d�Zed�j
d�Zed�j
d�Z e de dj
d�Z!ee de d8�dee de d9�j
d�Z"e"j#d��dej
d �Z$e%e!e$Be"Bj
d!��j
d!�Z&ed"�j
d#�Z'e(d$d%��Z)e(d&d'��Z*ed(�j
d)�Z+ed*�j
d+�Z,ed,�j
d-�Z-e.j�e/j�BZ0e(d.��Z1e%e2e3d/�e4�ee5d0d/�ee6d1����j�j
d2�Z7e8ee9j:�e7Bd3d4��j
d5�Z;e(ed6���Z<e(ed7���Z=RS(:s�

    Here are some common low-level expressions that may be useful in jump-starting parser development:
     - numeric forms (L{integers<integer>}, L{reals<real>}, L{scientific notation<sci_real>})
     - common L{programming identifiers<identifier>}
     - network addresses (L{MAC<mac_address>}, L{IPv4<ipv4_address>}, L{IPv6<ipv6_address>})
     - ISO8601 L{dates<iso8601_date>} and L{datetime<iso8601_datetime>}
     - L{UUID<uuid>}
     - L{comma-separated list<comma_separated_list>}
    Parse actions:
     - C{L{convertToInteger}}
     - C{L{convertToFloat}}
     - C{L{convertToDate}}
     - C{L{convertToDatetime}}
     - C{L{stripHTMLTags}}
     - C{L{upcaseTokens}}
     - C{L{downcaseTokens}}

    Example::
        pyparsing_common.number.runTests('''
            # any int or real number, returned as the appropriate type
            100
            -100
            +100
            3.14159
            6.02e23
            1e-12
            ''')

        pyparsing_common.fnumber.runTests('''
            # any int or real number, returned as float
            100
            -100
            +100
            3.14159
            6.02e23
            1e-12
            ''')

        pyparsing_common.hex_integer.runTests('''
            # hex numbers
            100
            FF
            ''')

        pyparsing_common.fraction.runTests('''
            # fractions
            1/2
            -3/4
            ''')

        pyparsing_common.mixed_integer.runTests('''
            # mixed fractions
            1
            1/2
            -3/4
            1-3/4
            ''')

        import uuid
        pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID))
        pyparsing_common.uuid.runTests('''
            # uuid
            12345678-1234-5678-1234-567812345678
            ''')
    prints::
        # any int or real number, returned as the appropriate type
        100
        [100]

        -100
        [-100]

        +100
        [100]

        3.14159
        [3.14159]

        6.02e23
        [6.02e+23]

        1e-12
        [1e-12]

        # any int or real number, returned as float
        100
        [100.0]

        -100
        [-100.0]

        +100
        [100.0]

        3.14159
        [3.14159]

        6.02e23
        [6.02e+23]

        1e-12
        [1e-12]

        # hex numbers
        100
        [256]

        FF
        [255]

        # fractions
        1/2
        [0.5]

        -3/4
        [-0.75]

        # mixed fractions
        1
        [1]

        1/2
        [0.5]

        -3/4
        [-0.75]

        1-3/4
        [1.75]

        # uuid
        12345678-1234-5678-1234-567812345678
        [UUID('12345678-1234-5678-1234-567812345678')]
    tintegershex integeris[+-]?\d+ssigned integerR�tfractioncCs|d|dS(Nii����((Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq�RrRzs"fraction or mixed integer-fractions
[+-]?\d+\.\d*sreal numbers+[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)s$real number with scientific notations[+-]?\d+\.?\d*([eE][+-]?\d+)?tfnumberR�t
identifiersK(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}sIPv4 addresss[0-9a-fA-F]{1,4}thex_integerRisfull IPv6 addressiis::sshort IPv6 addresscCstd�|D��dkS(Ncss'|]}tjj|�rdVqdS(iN(Rlt
_ipv6_partR�(R�R�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pys	<genexpr>�si(R�(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq�Rrs::ffff:smixed IPv6 addresssIPv6 addresss:[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}sMAC addresss%Y-%m-%dcs�fd�}|S(s�
        Helper to create a parse action for converting parsed date string to Python datetime.date

        Params -
         - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%d"})

        Example::
            date_expr = pyparsing_common.iso8601_date.copy()
            date_expr.setParseAction(pyparsing_common.convertToDate())
            print(date_expr.parseString("1999-12-31"))
        prints::
            [datetime.date(1999, 12, 31)]
        csPytj|d��j�SWn+tk
rK}t||t|���nXdS(Ni(RtstrptimetdateR�RRu(R�RNRptve(tfmt(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytcvt_fn�s((RBRC((RBs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
convertToDate�ss%Y-%m-%dT%H:%M:%S.%fcs�fd�}|S(s
        Helper to create a parse action for converting parsed datetime string to Python datetime.datetime

        Params -
         - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%dT%H:%M:%S.%f"})

        Example::
            dt_expr = pyparsing_common.iso8601_datetime.copy()
            dt_expr.setParseAction(pyparsing_common.convertToDatetime())
            print(dt_expr.parseString("1999-12-31T23:59:59.999"))
        prints::
            [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)]
        csJytj|d��SWn+tk
rE}t||t|���nXdS(Ni(RR?R�RRu(R�RNRpRA(RB(s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRC�s((RBRC((RBs@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pytconvertToDatetime�ss7(?P<year>\d{4})(?:-(?P<month>\d\d)(?:-(?P<day>\d\d))?)?sISO8601 dates�(?P<year>\d{4})-(?P<month>\d\d)-(?P<day>\d\d)[T ](?P<hour>\d\d):(?P<minute>\d\d)(:(?P<second>\d\d(\.\d*)?)?)?(?P<tz>Z|[+-]\d\d:?\d\d)?sISO8601 datetimes2[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}tUUIDcCstjj|d�S(s
        Parse action to remove HTML tags from web page HTML source

        Example::
            # strip HTML links from normal text 
            text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>'
            td,td_end = makeHTMLTags("TD")
            table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end
            
            print(table_text.parseString(text).body) # -> 'More info at the pyparsing wiki page'
        i(Rlt_html_stripperR{(R�RNR�((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt
stripHTMLTags�s
R�R<s 	R8R�Rrscomma separated listcCst|�j�S(N(RR,(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq�RrcCst|�j�S(N(RR�(Rp((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRq�Rr(ii(ii(>R�R�R�RkRotconvertToIntegertfloattconvertToFloatR-RPR�RzR9RBR=R%tsigned_integerR:R�RR�t
mixed_integerR�trealtsci_realR�tnumberR;R2R1R<tipv4_addressR>t_full_ipv6_addresst_short_ipv6_addressR�t_mixed_ipv6_addressRtipv6_addresstmac_addressR#RDREtiso8601_datetiso8601_datetimetuuidR5R4RGRHRRRRTR,t
_commasepitemR>RWR�tcomma_separated_listRbR@(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyRl�sL�'/-
 ;&J+t__main__tselecttfroms_$R�R�tcolumnsR�ttablestcommandsK
        # '*' as column list and dotted table name
        select * from SYS.XYZZY

        # caseless match on "SELECT", and casts back to "select"
        SELECT * from XYZZY, ABC

        # list of column names, and mixed case SELECT keyword
        Select AA,BB,CC from Sys.dual

        # multiple tables
        Select A, B, C from Sys.dual, Table2

        # invalid SELECT keyword - should fail
        Xelect A, B, C from Sys.dual

        # incomplete command - should fail
        Select

        # invalid column name - should fail
        Select ^^^ frox Sys.dual

        s]
        100
        -100
        +100
        3.14159
        6.02e23
        1e-12
        s 
        100
        FF
        s6
        12345678-1234-5678-1234-567812345678
        (�R�t__version__t__versionTime__t
__author__R�tweakrefRR�R�RxR�R|RSR�R8RRR�Rt_threadRtImportErrort	threadingRR�tordereddictR�t__all__R�tversion_infoRQRtmaxsizeR$RuR�tchrR�RR�R�R2treversedR�R�R4RxRIRJR_tmaxinttxrangeR�t__builtin__R�tfnameRR`R�R�R�R�R�R�tascii_uppercasetascii_lowercaseR2RPRBR1R�R�t	printableRTRaRRRR!R$R�R tMutableMappingtregisterR7RHRERGRKRMROReR"R*RRRRRiRRRRjR-R%R#RR,RpRRRR(R'R/R.RRRRR
RRRR�RR0R�R�RR&R
R�R+RRR	R)RR`R�R>R:R�RMRLRER�RQR?ReRfRhR�RARGRFR_R^Rzt_escapedPunct_escapedHexChart_escapedOctChartUNICODEt_singleChart
_charRangeR�R�R]RKRZRXRkRbR@RRIRJRcRRiRRRRRgRSR<R\RWRaRNRdR3RUR5R4R�R�R6R�R9RYR6RCR�R[R=R;RDRVR�RZR8RlR�tselectTokent	fromTokentidentt
columnNametcolumnNameListt
columnSpect	tableNamet
tableNameListt	simpleSQLR"RPR;R=RYRF(((s@/usr/lib/python2.7/site-packages/setuptools/_vendor/pyparsing.pyt<module>=s�


	*		
	


8
���	
		
				@�����&	A=�I�G3pLOD|M &#	@sQ,A	,					I	#%		!4@		
			,					?#	k%Zr(,	#8+�
$				_vendor/packaging/specifiers.pyo000064400000061357151733474000013031 0ustar00�
�fc@`s<ddlmZmZmZddlZddlZddlZddlZddlm	Z	m
Z
ddlmZm
Z
mZdefd��YZde
eje�fd	��YZd
efd��YZdefd
��YZd�Zdefd��YZejd�Zd�Zd�Zdefd��YZdS(i(tabsolute_importtdivisiontprint_functionNi(tstring_typestwith_metaclass(tVersiont
LegacyVersiontparsetInvalidSpecifiercB`seZdZRS(sH
    An invalid specifier was found, users should refer to PEP 440.
    (t__name__t
__module__t__doc__(((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRst
BaseSpecifiercB`s�eZejd��Zejd��Zejd��Zejd��Zejd��Z	e	j
d��Z	ejdd��Zejdd��Z
RS(	cC`sdS(s�
        Returns the str representation of this Specifier like object. This
        should be representative of the Specifier itself.
        N((tself((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__str__tcC`sdS(sF
        Returns a hash value for this Specifier like object.
        N((R
((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__hash__RcC`sdS(sq
        Returns a boolean representing whether or not the two Specifier like
        objects are equal.
        N((R
tother((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__eq__$RcC`sdS(su
        Returns a boolean representing whether or not the two Specifier like
        objects are not equal.
        N((R
R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__ne__+RcC`sdS(sg
        Returns whether or not pre-releases as a whole are allowed by this
        specifier.
        N((R
((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pytprereleases2RcC`sdS(sd
        Sets whether or not pre-releases as a whole are allowed by this
        specifier.
        N((R
tvalue((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR9RcC`sdS(sR
        Determines if the given item is contained within this specifier.
        N((R
titemR((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pytcontains@RcC`sdS(s�
        Takes an iterable of items and filters them so that only items which
        are contained within this specifier are allowed in it.
        N((R
titerableR((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pytfilterFRN(R	R
tabctabstractmethodRRRRtabstractpropertyRtsettertNoneRR(((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRst_IndividualSpecifiercB`s�eZiZddd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d�Zed	��Z
ed
��Zed��Zejd��Zd
�Zdd�Zdd�ZRS(RcC`sj|jj|�}|s0tdj|���n|jd�j�|jd�j�f|_||_dS(NsInvalid specifier: '{0}'toperatortversion(t_regextsearchRtformattgrouptstript_spect_prereleases(R
tspecRtmatch((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__init__RscC`sF|jdk	r!dj|j�nd}dj|jjt|�|�S(Ns, prereleases={0!r}Rs<{0}({1!r}{2})>(R(RR$Rt	__class__R	tstr(R
tpre((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__repr___s!		cC`sdj|j�S(Ns{0}{1}(R$R'(R
((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRlscC`s
t|j�S(N(thashR'(R
((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRoscC`s`t|t�r:y|j|�}WqPtk
r6tSXnt||j�sPtS|j|jkS(N(t
isinstanceRR,RtNotImplementedR'(R
R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRrs
cC`s`t|t�r:y|j|�}WqPtk
r6tSXnt||j�sPtS|j|jkS(N(R1RR,RR2R'(R
R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR}s
cC`st|dj|j|��S(Ns_compare_{0}(tgetattrR$t
_operators(R
top((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt
_get_operator�scC`s(t|ttf�s$t|�}n|S(N(R1RRR(R
R!((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_coerce_version�scC`s|jdS(Ni(R'(R
((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR �scC`s|jdS(Ni(R'(R
((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR!�scC`s|jS(N(R((R
((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR�scC`s
||_dS(N(R((R
R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR�scC`s
|j|�S(N(R(R
R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__contains__�scC`sW|dkr|j}n|j|�}|jr;|r;tS|j|j�||j�S(N(RRR7t
is_prereleasetFalseR6R R!(R
RR((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR�scc`s�t}g}i|dk	r!|ntd6}xf|D]^}|j|�}|j||�r2|jr�|pn|jr�|j|�q�t}|Vq2q2W|r�|r�x|D]}|Vq�WndS(NR(R:RtTrueR7RR9Rtappend(R
RRtyieldedtfound_prereleasestkwR!tparsed_version((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR�s
	

N(R	R
R4RR+R/RRRRR6R7tpropertyR R!RRR8RR(((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRNs 
	
							tLegacySpecifiercB`s�eZdZejdedejejB�Zidd6dd6dd6d	d
6dd6d
d6Zd�Z	d�Z
d�Zd�Zd�Z
d�Zd�ZRS(s�
        (?P<operator>(==|!=|<=|>=|<|>))
        \s*
        (?P<version>
            [^,;\s)]* # Since this is a "legacy" specifier, and the version
                      # string can be just about anything, we match everything
                      # except for whitespace, a semi-colon for marker support,
                      # a closing paren since versions can be enclosed in
                      # them, and a comma since it's a version separator.
        )
        s^\s*s\s*$tequals==t	not_equals!=tless_than_equals<=tgreater_than_equals>=t	less_thant<tgreater_thant>cC`s(t|t�s$tt|��}n|S(N(R1RR-(R
R!((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR7�scC`s||j|�kS(N(R7(R
tprospectiveR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_compare_equal�scC`s||j|�kS(N(R7(R
RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_compare_not_equal�scC`s||j|�kS(N(R7(R
RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_compare_less_than_equal�scC`s||j|�kS(N(R7(R
RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_compare_greater_than_equalscC`s||j|�kS(N(R7(R
RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_compare_less_thanscC`s||j|�kS(N(R7(R
RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_compare_greater_thans(R	R
t
_regex_strtretcompiletVERBOSEt
IGNORECASER"R4R7RLRMRNRORPRQ(((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRB�s"

						c`s"tj���fd��}|S(Nc`s#t|t�stS�|||�S(N(R1RR:(R
RKR)(tfn(sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pytwrappeds(t	functoolstwraps(RWRX((RWsK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_require_version_compare
st	SpecifiercB`seZdZejdedejejB�Zidd6dd6dd6d	d
6dd6d
d6dd6dd6Ze	d��Z
e	d��Ze	d��Ze	d��Z
e	d��Ze	d��Ze	d��Zd�Zed��Zejd��ZRS(s
        (?P<operator>(~=|==|!=|<=|>=|<|>|===))
        (?P<version>
            (?:
                # The identity operators allow for an escape hatch that will
                # do an exact string match of the version you wish to install.
                # This will not be parsed by PEP 440 and we cannot determine
                # any semantic meaning from it. This operator is discouraged
                # but included entirely as an escape hatch.
                (?<====)  # Only match for the identity operator
                \s*
                [^\s]*    # We just match everything, except for whitespace
                          # since we are only testing for strict identity.
            )
            |
            (?:
                # The (non)equality operators allow for wild card and local
                # versions to be specified so we have to define these two
                # operators separately to enable that.
                (?<===|!=)            # Only match for equals and not equals

                \s*
                v?
                (?:[0-9]+!)?          # epoch
                [0-9]+(?:\.[0-9]+)*   # release
                (?:                   # pre release
                    [-_\.]?
                    (a|b|c|rc|alpha|beta|pre|preview)
                    [-_\.]?
                    [0-9]*
                )?
                (?:                   # post release
                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
                )?

                # You cannot use a wild card and a dev or local version
                # together so group them with a | and make them optional.
                (?:
                    (?:[-_\.]?dev[-_\.]?[0-9]*)?         # dev release
                    (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local
                    |
                    \.\*  # Wild card syntax of .*
                )?
            )
            |
            (?:
                # The compatible operator requires at least two digits in the
                # release segment.
                (?<=~=)               # Only match for the compatible operator

                \s*
                v?
                (?:[0-9]+!)?          # epoch
                [0-9]+(?:\.[0-9]+)+   # release  (We have a + instead of a *)
                (?:                   # pre release
                    [-_\.]?
                    (a|b|c|rc|alpha|beta|pre|preview)
                    [-_\.]?
                    [0-9]*
                )?
                (?:                                   # post release
                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
                )?
                (?:[-_\.]?dev[-_\.]?[0-9]*)?          # dev release
            )
            |
            (?:
                # All other operators only allow a sub set of what the
                # (non)equality operators do. Specifically they do not allow
                # local versions to be specified nor do they allow the prefix
                # matching wild cards.
                (?<!==|!=|~=)         # We have special cases for these
                                      # operators so we want to make sure they
                                      # don't match here.

                \s*
                v?
                (?:[0-9]+!)?          # epoch
                [0-9]+(?:\.[0-9]+)*   # release
                (?:                   # pre release
                    [-_\.]?
                    (a|b|c|rc|alpha|beta|pre|preview)
                    [-_\.]?
                    [0-9]*
                )?
                (?:                                   # post release
                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
                )?
                (?:[-_\.]?dev[-_\.]?[0-9]*)?          # dev release
            )
        )
        s^\s*s\s*$t
compatibles~=RCs==RDs!=REs<=RFs>=RGRHRIRJt	arbitrarys===cC`sfdjttjd�t|���d �}|d7}|jd�||�oe|jd�||�S(Nt.cS`s|jd�o|jd�S(Ntposttdev(t
startswith(tx((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt<lambda>�si����s.*s>=s==(tjointlistt	itertoolst	takewhilet_version_splitR6(R
RKR)tprefix((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_compare_compatible�s

cC`s�|jd�rht|j�}t|d �}tt|��}|t|� }t||�\}}n't|�}|js�t|j�}n||kS(Ns.*i����(tendswithRtpublicRiR-tlent_pad_versiontlocal(R
RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRL�s	cC`s|j||�S(N(RL(R
RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRM�scC`s|t|�kS(N(R(R
RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRN�scC`s|t|�kS(N(R(R
RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRO�scC`sXt|�}||kstS|jrT|jrTt|j�t|j�krTtSntS(N(RR:R9tbase_versionR;(R
RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRP�scC`s�t|�}||kstS|jrT|jrTt|j�t|j�krTtSn|jdk	r�t|j�t|j�kr�tSntS(N(RR:tis_postreleaseRqRpRR;(R
RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRQ�scC`s"t|�j�t|�j�kS(N(R-tlower(R
RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_compare_arbitraryscC`ss|jdk	r|jS|j\}}|dkro|dkrY|jd�rY|d }nt|�jrotSntS(	Ns==s>=s<=s~=s===s.*i����(s==s>=s<=s~=s===(R(RR'RlRR9R;R:(R
R R!((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRs
cC`s
||_dS(N(R((R
R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRs(R	R
RRRSRTRURVR"R4R[RkRLRMRNRORPRQRtRARR(((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR\s,^
#	s^([0-9]+)((?:a|b|c|rc)[0-9]+)$cC`s\g}xO|jd�D]>}tj|�}|rG|j|j��q|j|�qW|S(NR_(tsplitt
_prefix_regexR#textendtgroupsR<(R!tresultRR*((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRi'sc	C`sgg}}|jttjd�|���|jttjd�|���|j|t|d��|j|t|d��|jddgtdt|d�t|d���|jddgtdt|d�t|d���ttj|��ttj|��fS(NcS`s
|j�S(N(tisdigit(Rc((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRd6RcS`s
|j�S(N(Rz(Rc((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRd7Riit0(R<RfRgRhRntinserttmaxtchain(tlefttrightt
left_splittright_split((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRo2s
""//tSpecifierSetcB`s�eZddd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d	�Zed
��Z
e
jd��Z
d�Zdd
�Zdd�ZRS(RcC`s�g|jd�D]}|j�r|j�^q}t�}xL|D]D}y|jt|��WqDtk
r�|jt|��qDXqDWt|�|_||_	dS(Nt,(
RuR&tsettaddR\RRBt	frozensett_specsR((R
t
specifiersRtstparsedt	specifier((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR+Os4	

cC`s=|jdk	r!dj|j�nd}djt|�|�S(Ns, prereleases={0!r}Rs<SpecifierSet({0!r}{1})>(R(RR$RR-(R
R.((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR/ds!cC`s djtd�|jD���S(NR�cs`s|]}t|�VqdS(N(R-(t.0R�((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pys	<genexpr>ns(RetsortedR�(R
((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRmscC`s
t|j�S(N(R0R�(R
((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRpscC`s�t|t�rt|�}nt|t�s1tSt�}t|j|jB�|_|jdkr�|jdk	r�|j|_nZ|jdk	r�|jdkr�|j|_n-|j|jkr�|j|_ntd��|S(NsFCannot combine SpecifierSets with True and False prerelease overrides.(	R1RR�R2R�R�R(Rt
ValueError(R
RR�((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__and__ss		cC`set|t�rt|�}n7t|t�rBtt|��}nt|t�sUtS|j|jkS(N(R1RR�RR-R2R�(R
R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR�scC`set|t�rt|�}n7t|t�rBtt|��}nt|t�sUtS|j|jkS(N(R1RR�RR-R2R�(R
R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR�scC`s
t|j�S(N(RnR�(R
((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__len__�scC`s
t|j�S(N(titerR�(R
((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__iter__�scC`s:|jdk	r|jS|js#dStd�|jD��S(Ncs`s|]}|jVqdS(N(R(R�R�((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pys	<genexpr>�s(R(RR�tany(R
((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR�s
	cC`s
||_dS(N(R((R
R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR�scC`s
|j|�S(N(R(R
R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR8�sc`spt�ttf�s$t���n�dkr<|j�n�rP�jrPtSt��fd�|j	D��S(Nc3`s$|]}|j�d��VqdS(RN(R(R�R�(RR(sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pys	<genexpr>�s(
R1RRRRRR9R:tallR�(R
RR((RRsK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR�scC`s|dkr|j}n|jrTx,|jD]!}|j|dt|��}q+W|Sg}g}x�|D]{}t|ttf�s�t|�}n|}t|t�r�qgn|j	r�|r�|s�|j
|�q�qg|j
|�qgW|r|r|dkr|S|SdS(NR(RRR�RtboolR1RRRR9R<(R
RRR)tfilteredR>RR@((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR�s*	
N(R	R
RR+R/RRR�RRR�R�RARRR8RR(((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR�Ms						
	
			(t
__future__RRRRRYRgRSt_compatRRR!RRRR�RtABCMetatobjectRRRBR[R\RTRvRiRoR�(((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt<module>s""9�4		�		_vendor/packaging/utils.py000064400000000645151733474000011647 0ustar00# This file is dual licensed under the terms of the Apache License, Version
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.
from __future__ import absolute_import, division, print_function

import re


_canonicalize_regex = re.compile(r"[-_.]+")


def canonicalize_name(name):
    # This is taken from PEP 503.
    return _canonicalize_regex.sub("-", name).lower()
_vendor/packaging/markers.pyc000064400000027267151733474000012327 0ustar00�
�fc@`suddlmZmZmZddlZddlZddlZddlZddlm	Z	m
Z
mZmZddlm
Z
mZmZmZddlmZddlmZddlmZmZd	d
ddd
gZd	efd��YZd
efd��YZdefd��YZdefd��YZdefd��YZdefd��YZ defd��YZ!ed�ed�Bed�Bed�Bed�Bed�Bed�Bed �Bed!�Bed"�Bed#�Bed$�Bed%�Bed&�Bed'�Bed(�Bed)�Bed*�BZ"id#d$6d"d%6dd&6dd'6dd(6dd)6Z#e"j$d+��ed,�ed-�Bed.�Bed/�Bed0�Bed1�Bed2�Bed3�BZ%e%ed4�Bed5�BZ&e&j$d6��ed7�ed8�BZ'e'j$d9��ed:�ed;�BZ(e"e'BZ)ee)e&e)�Z*e*j$d<��ed=�j+�Z,ed>�j+�Z-e�Z.e*ee,e.e-�BZ/e.e/e
e(e.�>ee.eZ0d?�Z1e2d@�Z3idA�d56dB�d46ej4d36ej5d/6ej6d-6ej7d06ej8d.6ej9d26Z:dC�Z;e�Z<dD�Z=dE�Z>dF�Z?dG�Z@defdH��YZAdS(Ii(tabsolute_importtdivisiontprint_functionN(tParseExceptiontParseResultststringStartt	stringEnd(t
ZeroOrMoretGrouptForwardtQuotedString(tLiterali(tstring_types(t	SpecifiertInvalidSpecifiert
InvalidMarkertUndefinedComparisontUndefinedEnvironmentNametMarkertdefault_environmentcB`seZdZRS(sE
    An invalid marker was found, users should refer to PEP 508.
    (t__name__t
__module__t__doc__(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRscB`seZdZRS(sP
    An invalid operation was attempted on a value that doesn't support it.
    (RRR(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRscB`seZdZRS(s\
    A name was attempted to be used that does not exist inside of the
    environment.
    (RRR(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR%stNodecB`s,eZd�Zd�Zd�Zd�ZRS(cC`s
||_dS(N(tvalue(tselfR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyt__init__.scC`s
t|j�S(N(tstrR(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyt__str__1scC`sdj|jjt|��S(Ns<{0}({1!r})>(tformatt	__class__RR(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyt__repr__4scC`s
t�dS(N(tNotImplementedError(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyt	serialize7s(RRRRRR!(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR,s			tVariablecB`seZd�ZRS(cC`s
t|�S(N(R(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR!=s(RRR!(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR";stValuecB`seZd�ZRS(cC`s
dj|�S(Ns"{0}"(R(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR!Cs(RRR!(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR#AstOpcB`seZd�ZRS(cC`s
t|�S(N(R(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR!Is(RRR!(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR$Gstimplementation_versiontplatform_python_implementationtimplementation_nametpython_full_versiontplatform_releasetplatform_versiontplatform_machinetplatform_systemtpython_versiontsys_platformtos_namesos.namessys.platformsplatform.versionsplatform.machinesplatform.python_implementationtpython_implementationtextracC`sttj|d|d��S(Ni(R"tALIASEStget(tstltt((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyt<lambda>its===s==s>=s<=s!=s~=t>t<snot intincC`st|d�S(Ni(R$(R4R5R6((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR7wR8t't"cC`st|d�S(Ni(R#(R4R5R6((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR7zR8tandtorcC`st|d�S(Ni(ttuple(R4R5R6((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR7�R8t(t)cC`s4t|t�r,g|D]}t|�^qS|SdS(N(t
isinstanceRt_coerce_parse_result(tresultsti((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRD�scC`s�t|tttf�st�t|t�rft|�dkrft|dttf�rft|d�St|t�r�d�|D�}|r�dj|�Sddj|�dSn9t|t�r�djg|D]}|j�^q��S|SdS(Niics`s!|]}t|dt�VqdS(tfirstN(t_format_markertFalse(t.0tm((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pys	<genexpr>�st RARB(	RCtlistR@RtAssertionErrortlenRHtjoinR!(tmarkerRGtinnerRK((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRH�s!
&cC`s
||kS(N((tlhstrhs((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR7�R8cC`s
||kS(N((RSRT((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR7�R8cC`s�y%tdj|j�|g��}Wntk
r8nX|j|�Stj|j��}|dkr�tdj	|||���n|||�S(NR8s#Undefined {0!r} on {1!r} and {2!r}.(
R
RPR!Rtcontainst
_operatorsR3tNoneRR(RStopRTtspectoper((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyt_eval_op�s%

cC`s:|j|t�}|tkr6tdj|���n|S(Ns/{0!r} does not exist in evaluation environment.(R3t
_undefinedRR(tenvironmenttnameR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyt_get_env�s
c	C`s,gg}x|D]}t|tttf�s4t�t|t�r`|djt||��qt|t�r�|\}}}t|t�r�t||j	�}|j	}n|j	}t||j	�}|djt
|||��q|dks�t�|dkr|jg�qqWtd�|D��S(Ni����R>R?cs`s|]}t|�VqdS(N(tall(RJtitem((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pys	<genexpr>�s(R>R?(RCRMR@RRNtappendt_evaluate_markersR"R_RR[tany(	tmarkersR]tgroupsRQRSRXRTt	lhs_valuet	rhs_value((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRc�s"	
	 cC`sFdj|�}|j}|dkrB||dt|j�7}n|S(Ns{0.major}.{0.minor}.{0.micro}tfinali(RtreleaselevelRtserial(tinfotversiontkind((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pytformat_full_version�s
	cC`s�ttd�r0ttjj�}tjj}nd}d}i|d6|d6tjd6tj�d6tj	�d6tj
�d	6tj�d
6tj�d6tj�d6tj�d
 d6tjd6S(Ntimplementationt0R8R'R%R/R+R)R,R*R(R&iR-R.(
thasattrtsysRoRpRmR^tostplatformtmachinetreleasetsystemR-R0(tiverR'((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR�s"






cB`s/eZd�Zd�Zd�Zdd�ZRS(cC`seyttj|��|_WnBtk
r`}dj|||j|jd!�}t|��nXdS(Ns+Invalid marker: {0!r}, parse error at {1!r}i(RDtMARKERtparseStringt_markersRRtlocR(RRQteterr_str((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRscC`s
t|j�S(N(RHR|(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRscC`sdjt|��S(Ns<Marker({0!r})>(RR(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRscC`s5t�}|dk	r%|j|�nt|j|�S(s$Evaluate a marker.

        Return the boolean from evaluating the given marker against the
        environment. environment is an optional argument to override all or
        part of the determined environment.

        The environment is determined from the current Python process.
        N(RRWtupdateRcR|(RR]tcurrent_environment((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pytevaluate s		N(RRRRRRWR�(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRs			(Bt
__future__RRRtoperatorRtRuRstsetuptools.extern.pyparsingRRRRRRR	R
RtLt_compatRt
specifiersR
Rt__all__t
ValueErrorRRRtobjectRR"R#R$tVARIABLER2tsetParseActiontVERSION_CMPt	MARKER_OPtMARKER_VALUEtBOOLOPt
MARKER_VARtMARKER_ITEMtsuppresstLPARENtRPARENtMARKER_EXPRtMARKER_ATOMRzRDtTrueRHtlttleteqtnetgetgtRVR[R\R_RcRoRR(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyt<module>s|""	�

	E

		







						_vendor/packaging/utils.pyc000064400000001122151733474000012001 0ustar00�
�fc@`sDddlmZmZmZddlZejd�Zd�ZdS(i(tabsolute_importtdivisiontprint_functionNs[-_.]+cC`stjd|�j�S(Nt-(t_canonicalize_regextsubtlower(tname((sF/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/utils.pytcanonicalize_names(t
__future__RRRtretcompileRR(((sF/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/utils.pyt<module>s_vendor/packaging/_structures.pyo000064400000010115151733474000013241 0ustar00�
�fc@`s^ddlmZmZmZdefd��YZe�Zdefd��YZe�ZdS(i(tabsolute_importtdivisiontprint_functiontInfinitycB`sYeZd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
RS(	cC`sdS(NR((tself((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__repr__	scC`stt|��S(N(thashtrepr(R((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__hash__scC`stS(N(tFalse(Rtother((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__lt__scC`stS(N(R	(RR
((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__le__scC`st||j�S(N(t
isinstancet	__class__(RR
((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__eq__scC`st||j�S(N(R
R(RR
((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__ne__scC`stS(N(tTrue(RR
((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__gt__scC`stS(N(R(RR
((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__ge__scC`stS(N(tNegativeInfinity(R((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__neg__!s(t__name__t
__module__RRRRRRRRR(((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyRs								RcB`sYeZd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
RS(	cC`sdS(Ns	-Infinity((R((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR)scC`stt|��S(N(RR(R((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR,scC`stS(N(R(RR
((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR/scC`stS(N(R(RR
((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR2scC`st||j�S(N(R
R(RR
((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR5scC`st||j�S(N(R
R(RR
((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR8scC`stS(N(R	(RR
((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR;scC`stS(N(R	(RR
((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR>scC`stS(N(R(R((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyRAs(RRRRRRRRRRR(((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR's								N(t
__future__RRRtobjectRR(((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt<module>s	_vendor/packaging/requirements.py000064400000010367151733474000013234 0ustar00# This file is dual licensed under the terms of the Apache License, Version
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.
from __future__ import absolute_import, division, print_function

import string
import re

from setuptools.extern.pyparsing import stringStart, stringEnd, originalTextFor, ParseException
from setuptools.extern.pyparsing import ZeroOrMore, Word, Optional, Regex, Combine
from setuptools.extern.pyparsing import Literal as L  # noqa
from setuptools.extern.six.moves.urllib import parse as urlparse

from .markers import MARKER_EXPR, Marker
from .specifiers import LegacySpecifier, Specifier, SpecifierSet


class InvalidRequirement(ValueError):
    """
    An invalid requirement was found, users should refer to PEP 508.
    """


ALPHANUM = Word(string.ascii_letters + string.digits)

LBRACKET = L("[").suppress()
RBRACKET = L("]").suppress()
LPAREN = L("(").suppress()
RPAREN = L(")").suppress()
COMMA = L(",").suppress()
SEMICOLON = L(";").suppress()
AT = L("@").suppress()

PUNCTUATION = Word("-_.")
IDENTIFIER_END = ALPHANUM | (ZeroOrMore(PUNCTUATION) + ALPHANUM)
IDENTIFIER = Combine(ALPHANUM + ZeroOrMore(IDENTIFIER_END))

NAME = IDENTIFIER("name")
EXTRA = IDENTIFIER

URI = Regex(r'[^ ]+')("url")
URL = (AT + URI)

EXTRAS_LIST = EXTRA + ZeroOrMore(COMMA + EXTRA)
EXTRAS = (LBRACKET + Optional(EXTRAS_LIST) + RBRACKET)("extras")

VERSION_PEP440 = Regex(Specifier._regex_str, re.VERBOSE | re.IGNORECASE)
VERSION_LEGACY = Regex(LegacySpecifier._regex_str, re.VERBOSE | re.IGNORECASE)

VERSION_ONE = VERSION_PEP440 ^ VERSION_LEGACY
VERSION_MANY = Combine(VERSION_ONE + ZeroOrMore(COMMA + VERSION_ONE),
                       joinString=",", adjacent=False)("_raw_spec")
_VERSION_SPEC = Optional(((LPAREN + VERSION_MANY + RPAREN) | VERSION_MANY))
_VERSION_SPEC.setParseAction(lambda s, l, t: t._raw_spec or '')

VERSION_SPEC = originalTextFor(_VERSION_SPEC)("specifier")
VERSION_SPEC.setParseAction(lambda s, l, t: t[1])

MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker")
MARKER_EXPR.setParseAction(
    lambda s, l, t: Marker(s[t._original_start:t._original_end])
)
MARKER_SEPERATOR = SEMICOLON
MARKER = MARKER_SEPERATOR + MARKER_EXPR

VERSION_AND_MARKER = VERSION_SPEC + Optional(MARKER)
URL_AND_MARKER = URL + Optional(MARKER)

NAMED_REQUIREMENT = \
    NAME + Optional(EXTRAS) + (URL_AND_MARKER | VERSION_AND_MARKER)

REQUIREMENT = stringStart + NAMED_REQUIREMENT + stringEnd


class Requirement(object):
    """Parse a requirement.

    Parse a given requirement string into its parts, such as name, specifier,
    URL, and extras. Raises InvalidRequirement on a badly-formed requirement
    string.
    """

    # TODO: Can we test whether something is contained within a requirement?
    #       If so how do we do that? Do we need to test against the _name_ of
    #       the thing as well as the version? What about the markers?
    # TODO: Can we normalize the name and extra name?

    def __init__(self, requirement_string):
        try:
            req = REQUIREMENT.parseString(requirement_string)
        except ParseException as e:
            raise InvalidRequirement(
                "Invalid requirement, parse error at \"{0!r}\"".format(
                    requirement_string[e.loc:e.loc + 8]))

        self.name = req.name
        if req.url:
            parsed_url = urlparse.urlparse(req.url)
            if not (parsed_url.scheme and parsed_url.netloc) or (
                    not parsed_url.scheme and not parsed_url.netloc):
                raise InvalidRequirement("Invalid URL given")
            self.url = req.url
        else:
            self.url = None
        self.extras = set(req.extras.asList() if req.extras else [])
        self.specifier = SpecifierSet(req.specifier)
        self.marker = req.marker if req.marker else None

    def __str__(self):
        parts = [self.name]

        if self.extras:
            parts.append("[{0}]".format(",".join(sorted(self.extras))))

        if self.specifier:
            parts.append(str(self.specifier))

        if self.url:
            parts.append("@ {0}".format(self.url))

        if self.marker:
            parts.append("; {0}".format(self.marker))

        return "".join(parts)

    def __repr__(self):
        return "<Requirement({0!r})>".format(str(self))
_vendor/packaging/__init__.py000064400000001001151733474000012231 0ustar00# This file is dual licensed under the terms of the Apache License, Version
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.
from __future__ import absolute_import, division, print_function

from .__about__ import (
    __author__, __copyright__, __email__, __license__, __summary__, __title__,
    __uri__, __version__
)

__all__ = [
    "__title__", "__summary__", "__uri__", "__version__", "__author__",
    "__email__", "__license__", "__copyright__",
]
_vendor/packaging/utils.pyo000064400000001122151733474000012015 0ustar00�
�fc@`sDddlmZmZmZddlZejd�Zd�ZdS(i(tabsolute_importtdivisiontprint_functionNs[-_.]+cC`stjd|�j�S(Nt-(t_canonicalize_regextsubtlower(tname((sF/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/utils.pytcanonicalize_names(t
__future__RRRtretcompileRR(((sF/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/utils.pyt<module>s_vendor/packaging/version.pyo000064400000034152151733474000012353 0ustar00�
�fc@`snddlmZmZmZddlZddlZddlZddlmZddddd	gZ	ej
d
ddd
dddg�Zd�Zde
fd��YZdefd��YZdefd��YZejdej�Zidd6dd6dd6dd6dd
6Zd�Zd�ZdZdefd ��YZd!�Zejd"�Zd#�Zd$�ZdS(%i(tabsolute_importtdivisiontprint_functionNi(tInfinitytparsetVersiont
LegacyVersiontInvalidVersiontVERSION_PATTERNt_VersiontepochtreleasetdevtpretposttlocalcC`s-yt|�SWntk
r(t|�SXdS(s�
    Parse the given version string and return either a :class:`Version` object
    or a :class:`LegacyVersion` object depending on if the given version is
    a valid PEP 440 version or a legacy version.
    N(RRR(tversion((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyRs
cB`seZdZRS(sF
    An invalid version was found, users should refer to PEP 440.
    (t__name__t
__module__t__doc__(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR$st_BaseVersioncB`sPeZd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z	RS(cC`s
t|j�S(N(thasht_key(tself((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__hash__,scC`s|j|d��S(NcS`s
||kS(N((tsto((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt<lambda>0t(t_compare(Rtother((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__lt__/scC`s|j|d��S(NcS`s
||kS(N((RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR3R(R(RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__le__2scC`s|j|d��S(NcS`s
||kS(N((RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR6R(R(RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__eq__5scC`s|j|d��S(NcS`s
||kS(N((RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR9R(R(RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__ge__8scC`s|j|d��S(NcS`s
||kS(N((RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR<R(R(RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__gt__;scC`s|j|d��S(NcS`s
||kS(N((RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR?R(R(RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__ne__>scC`s&t|t�stS||j|j�S(N(t
isinstanceRtNotImplementedR(RRtmethod((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyRAs(
RRRRR R!R"R#R$R(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR*s							cB`sneZd�Zd�Zd�Zed��Zed��Zed��Zed��Z	ed��Z
RS(cC`s%t|�|_t|j�|_dS(N(tstrt_versiont_legacy_cmpkeyR(RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__init__JscC`s|jS(N(R)(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__str__NscC`sdjtt|���S(Ns<LegacyVersion({0})>(tformattreprR((R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__repr__QscC`s|jS(N(R)(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pytpublicTscC`s|jS(N(R)(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pytbase_versionXscC`sdS(N(tNone(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR\scC`stS(N(tFalse(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt
is_prerelease`scC`stS(N(R3(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pytis_postreleaseds(RRR+R,R/tpropertyR0R1RR4R5(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyRHs			s(\d+ | [a-z]+ | \.| -)tctpreviewsfinal-t-trct@cc`sxxltj|�D][}tj||�}|s|dkrAqn|d dkrb|jd�Vqd|VqWdVdS(Nt.it
0123456789it*s*final(t_legacy_version_component_retsplitt_legacy_version_replacement_maptgettzfill(Rtpart((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt_parse_version_partsrs
cC`s�d}g}x�t|j��D]�}|jd�r�|dkrjx'|rf|ddkrf|j�qCWnx'|r�|ddkr�|j�qmWn|j|�qWt|�}||fS(Ni����R>s*finals*final-t00000000(REtlowert
startswithtpoptappendttuple(RR
tpartsRD((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR*�ss�
    v?
    (?:
        (?:(?P<epoch>[0-9]+)!)?                           # epoch
        (?P<release>[0-9]+(?:\.[0-9]+)*)                  # release segment
        (?P<pre>                                          # pre-release
            [-_\.]?
            (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview))
            [-_\.]?
            (?P<pre_n>[0-9]+)?
        )?
        (?P<post>                                         # post release
            (?:-(?P<post_n1>[0-9]+))
            |
            (?:
                [-_\.]?
                (?P<post_l>post|rev|r)
                [-_\.]?
                (?P<post_n2>[0-9]+)?
            )
        )?
        (?P<dev>                                          # dev release
            [-_\.]?
            (?P<dev_l>dev)
            [-_\.]?
            (?P<dev_n>[0-9]+)?
        )?
    )
    (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))?       # local version
cB`s�eZejdedejejB�Zd�Zd�Z	d�Z
ed��Zed��Z
ed��Zed��Zed	��ZRS(
s^\s*s\s*$cC`s[|jj|�}|s0tdj|���ntd|jd�rZt|jd��nddtd�|jd�jd�D��dt	|jd�|jd	��d
t	|jd�|jd�p�|jd
��dt	|jd�|jd��dt
|jd���|_t|jj
|jj|jj|jj|jj|jj�|_dS(NsInvalid version: '{0}'R
iRcs`s|]}t|�VqdS(N(tint(t.0ti((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pys	<genexpr>�sR<R
tpre_ltpre_nRtpost_ltpost_n1tpost_n2Rtdev_ltdev_nR(t_regextsearchRR-R	tgroupRMRKR@t_parse_letter_versiont_parse_local_versionR)t_cmpkeyR
RR
RRRR(RRtmatch((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR+�s.*(!					cC`sdjtt|���S(Ns<Version({0})>(R-R.R((R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR/�scC`sSg}|jjdkr7|jdj|jj��n|jdjd�|jjD���|jjdk	r�|jdjd�|jjD���n|jjdk	r�|jdj|jjd��n|jj	dk	r|jd	j|jj	d��n|jj
dk	rF|jd
jdjd�|jj
D����ndj|�S(Nis{0}!R<cs`s|]}t|�VqdS(N(R((RNtx((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pys	<genexpr>�sRcs`s|]}t|�VqdS(N(R((RNR^((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pys	<genexpr>�ss.post{0}is.dev{0}s+{0}cs`s|]}t|�VqdS(N(R((RNR^((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pys	<genexpr>s(R)R
RJR-tjoinRR
R2RRR(RRL((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR,�s&)##,cC`st|�jdd�dS(Nt+ii(R(R@(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR0
scC`sjg}|jjdkr7|jdj|jj��n|jdjd�|jjD���dj|�S(Nis{0}!R<cs`s|]}t|�VqdS(N(R((RNR^((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pys	<genexpr>sR(R)R
RJR-R_R(RRL((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR1s
&cC`s0t|�}d|kr,|jdd�dSdS(NR`i(R(R@(Rtversion_string((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyRscC`st|jjp|jj�S(N(tboolR)RR
(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR4!scC`st|jj�S(N(RbR)R(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR5%s(RRtretcompileRtVERBOSEt
IGNORECASERWR+R/R,R6R0R1RR4R5(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR�s	#		
cC`s�|r�|dkrd}n|j�}|dkr<d}n?|dkrQd}n*|d
krfd	}n|dkr{d}n|t|�fS|r�|r�d}|t|�fSdS(NitalphatatbetatbR7R
R8R:trevtrR(R7R
R8(RkRl(R2RGRM(tlettertnumber((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyRZ*s 					
s[\._-]cC`s-|dk	r)td�tj|�D��SdS(sR
    Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve").
    cs`s3|])}|j�s!|j�n	t|�VqdS(N(tisdigitRGRM(RNRD((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pys	<genexpr>RsN(R2RKt_local_version_seperatorsR@(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR[LscC`s�ttttjd�t|�����}|dkr[|dkr[|dk	r[t}n|dkrpt}n|dkr�t}n|dkr�t}n|dkr�t}ntd�|D��}||||||fS(NcS`s
|dkS(Ni((R^((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR`Rcs`s7|]-}t|t�r$|dfn
t|fVqdS(RN(R%RMR(RNRO((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pys	<genexpr>�s(RKtreversedtlistt	itertoolst	dropwhileR2R(R
RR
RRR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR\Ws&	$
	
	
	
(t
__future__RRRtcollectionsRsRct_structuresRt__all__t
namedtupleR	Rt
ValueErrorRtobjectRRRdReR?RARER*RRRZRpR[R\(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt<module>s0	!&		9k		_vendor/packaging/_compat.py000064400000001534151733474000012127 0ustar00# This file is dual licensed under the terms of the Apache License, Version
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.
from __future__ import absolute_import, division, print_function

import sys


PY2 = sys.version_info[0] == 2
PY3 = sys.version_info[0] == 3

# flake8: noqa

if PY3:
    string_types = str,
else:
    string_types = basestring,


def with_metaclass(meta, *bases):
    """
    Create a base class with a metaclass.
    """
    # This requires a bit of explanation: the basic idea is to make a dummy
    # metaclass for one level of class instantiation that replaces itself with
    # the actual metaclass.
    class metaclass(meta):
        def __new__(cls, name, this_bases, d):
            return meta(name, bases, d)
    return type.__new__(metaclass, 'temporary_class', (), {})
_vendor/packaging/_compat.pyc000064400000002334151733474000012271 0ustar00�
�fc@`svddlmZmZmZddlZejddkZejddkZer`efZ	n	e
fZ	d�ZdS(i(tabsolute_importtdivisiontprint_functionNiic`s5d�f��fd��Y}tj|ddi�S(s/
    Create a base class with a metaclass.
    t	metaclassc`seZ��fd�ZRS(c`s�|�|�S(N((tclstnamet
this_basestd(tbasestmeta(sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.pyt__new__s(t__name__t
__module__R
((RR	(sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.pyRsttemporary_class((ttypeR
(R	RR((RR	sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.pytwith_metaclasss(t
__future__RRRtsystversion_infotPY2tPY3tstrtstring_typest
basestringR(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.pyt<module>s	_vendor/packaging/specifiers.pyc000064400000061357151733474000013015 0ustar00�
�fc@`s<ddlmZmZmZddlZddlZddlZddlZddlm	Z	m
Z
ddlmZm
Z
mZdefd��YZde
eje�fd	��YZd
efd��YZdefd
��YZd�Zdefd��YZejd�Zd�Zd�Zdefd��YZdS(i(tabsolute_importtdivisiontprint_functionNi(tstring_typestwith_metaclass(tVersiont
LegacyVersiontparsetInvalidSpecifiercB`seZdZRS(sH
    An invalid specifier was found, users should refer to PEP 440.
    (t__name__t
__module__t__doc__(((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRst
BaseSpecifiercB`s�eZejd��Zejd��Zejd��Zejd��Zejd��Z	e	j
d��Z	ejdd��Zejdd��Z
RS(	cC`sdS(s�
        Returns the str representation of this Specifier like object. This
        should be representative of the Specifier itself.
        N((tself((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__str__tcC`sdS(sF
        Returns a hash value for this Specifier like object.
        N((R
((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__hash__RcC`sdS(sq
        Returns a boolean representing whether or not the two Specifier like
        objects are equal.
        N((R
tother((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__eq__$RcC`sdS(su
        Returns a boolean representing whether or not the two Specifier like
        objects are not equal.
        N((R
R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__ne__+RcC`sdS(sg
        Returns whether or not pre-releases as a whole are allowed by this
        specifier.
        N((R
((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pytprereleases2RcC`sdS(sd
        Sets whether or not pre-releases as a whole are allowed by this
        specifier.
        N((R
tvalue((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR9RcC`sdS(sR
        Determines if the given item is contained within this specifier.
        N((R
titemR((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pytcontains@RcC`sdS(s�
        Takes an iterable of items and filters them so that only items which
        are contained within this specifier are allowed in it.
        N((R
titerableR((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pytfilterFRN(R	R
tabctabstractmethodRRRRtabstractpropertyRtsettertNoneRR(((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRst_IndividualSpecifiercB`s�eZiZddd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d�Zed	��Z
ed
��Zed��Zejd��Zd
�Zdd�Zdd�ZRS(RcC`sj|jj|�}|s0tdj|���n|jd�j�|jd�j�f|_||_dS(NsInvalid specifier: '{0}'toperatortversion(t_regextsearchRtformattgrouptstript_spect_prereleases(R
tspecRtmatch((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__init__RscC`sF|jdk	r!dj|j�nd}dj|jjt|�|�S(Ns, prereleases={0!r}Rs<{0}({1!r}{2})>(R(RR$Rt	__class__R	tstr(R
tpre((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__repr___s!		cC`sdj|j�S(Ns{0}{1}(R$R'(R
((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRlscC`s
t|j�S(N(thashR'(R
((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRoscC`s`t|t�r:y|j|�}WqPtk
r6tSXnt||j�sPtS|j|jkS(N(t
isinstanceRR,RtNotImplementedR'(R
R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRrs
cC`s`t|t�r:y|j|�}WqPtk
r6tSXnt||j�sPtS|j|jkS(N(R1RR,RR2R'(R
R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR}s
cC`st|dj|j|��S(Ns_compare_{0}(tgetattrR$t
_operators(R
top((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt
_get_operator�scC`s(t|ttf�s$t|�}n|S(N(R1RRR(R
R!((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_coerce_version�scC`s|jdS(Ni(R'(R
((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR �scC`s|jdS(Ni(R'(R
((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR!�scC`s|jS(N(R((R
((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR�scC`s
||_dS(N(R((R
R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR�scC`s
|j|�S(N(R(R
R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__contains__�scC`sW|dkr|j}n|j|�}|jr;|r;tS|j|j�||j�S(N(RRR7t
is_prereleasetFalseR6R R!(R
RR((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR�scc`s�t}g}i|dk	r!|ntd6}xf|D]^}|j|�}|j||�r2|jr�|pn|jr�|j|�q�t}|Vq2q2W|r�|r�x|D]}|Vq�WndS(NR(R:RtTrueR7RR9Rtappend(R
RRtyieldedtfound_prereleasestkwR!tparsed_version((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR�s
	

N(R	R
R4RR+R/RRRRR6R7tpropertyR R!RRR8RR(((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRNs 
	
							tLegacySpecifiercB`s�eZdZejdedejejB�Zidd6dd6dd6d	d
6dd6d
d6Zd�Z	d�Z
d�Zd�Zd�Z
d�Zd�ZRS(s�
        (?P<operator>(==|!=|<=|>=|<|>))
        \s*
        (?P<version>
            [^,;\s)]* # Since this is a "legacy" specifier, and the version
                      # string can be just about anything, we match everything
                      # except for whitespace, a semi-colon for marker support,
                      # a closing paren since versions can be enclosed in
                      # them, and a comma since it's a version separator.
        )
        s^\s*s\s*$tequals==t	not_equals!=tless_than_equals<=tgreater_than_equals>=t	less_thant<tgreater_thant>cC`s(t|t�s$tt|��}n|S(N(R1RR-(R
R!((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR7�scC`s||j|�kS(N(R7(R
tprospectiveR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_compare_equal�scC`s||j|�kS(N(R7(R
RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_compare_not_equal�scC`s||j|�kS(N(R7(R
RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_compare_less_than_equal�scC`s||j|�kS(N(R7(R
RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_compare_greater_than_equalscC`s||j|�kS(N(R7(R
RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_compare_less_thanscC`s||j|�kS(N(R7(R
RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_compare_greater_thans(R	R
t
_regex_strtretcompiletVERBOSEt
IGNORECASER"R4R7RLRMRNRORPRQ(((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRB�s"

						c`s"tj���fd��}|S(Nc`s#t|t�stS�|||�S(N(R1RR:(R
RKR)(tfn(sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pytwrappeds(t	functoolstwraps(RWRX((RWsK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_require_version_compare
st	SpecifiercB`seZdZejdedejejB�Zidd6dd6dd6d	d
6dd6d
d6dd6dd6Ze	d��Z
e	d��Ze	d��Ze	d��Z
e	d��Ze	d��Ze	d��Zd�Zed��Zejd��ZRS(s
        (?P<operator>(~=|==|!=|<=|>=|<|>|===))
        (?P<version>
            (?:
                # The identity operators allow for an escape hatch that will
                # do an exact string match of the version you wish to install.
                # This will not be parsed by PEP 440 and we cannot determine
                # any semantic meaning from it. This operator is discouraged
                # but included entirely as an escape hatch.
                (?<====)  # Only match for the identity operator
                \s*
                [^\s]*    # We just match everything, except for whitespace
                          # since we are only testing for strict identity.
            )
            |
            (?:
                # The (non)equality operators allow for wild card and local
                # versions to be specified so we have to define these two
                # operators separately to enable that.
                (?<===|!=)            # Only match for equals and not equals

                \s*
                v?
                (?:[0-9]+!)?          # epoch
                [0-9]+(?:\.[0-9]+)*   # release
                (?:                   # pre release
                    [-_\.]?
                    (a|b|c|rc|alpha|beta|pre|preview)
                    [-_\.]?
                    [0-9]*
                )?
                (?:                   # post release
                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
                )?

                # You cannot use a wild card and a dev or local version
                # together so group them with a | and make them optional.
                (?:
                    (?:[-_\.]?dev[-_\.]?[0-9]*)?         # dev release
                    (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local
                    |
                    \.\*  # Wild card syntax of .*
                )?
            )
            |
            (?:
                # The compatible operator requires at least two digits in the
                # release segment.
                (?<=~=)               # Only match for the compatible operator

                \s*
                v?
                (?:[0-9]+!)?          # epoch
                [0-9]+(?:\.[0-9]+)+   # release  (We have a + instead of a *)
                (?:                   # pre release
                    [-_\.]?
                    (a|b|c|rc|alpha|beta|pre|preview)
                    [-_\.]?
                    [0-9]*
                )?
                (?:                                   # post release
                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
                )?
                (?:[-_\.]?dev[-_\.]?[0-9]*)?          # dev release
            )
            |
            (?:
                # All other operators only allow a sub set of what the
                # (non)equality operators do. Specifically they do not allow
                # local versions to be specified nor do they allow the prefix
                # matching wild cards.
                (?<!==|!=|~=)         # We have special cases for these
                                      # operators so we want to make sure they
                                      # don't match here.

                \s*
                v?
                (?:[0-9]+!)?          # epoch
                [0-9]+(?:\.[0-9]+)*   # release
                (?:                   # pre release
                    [-_\.]?
                    (a|b|c|rc|alpha|beta|pre|preview)
                    [-_\.]?
                    [0-9]*
                )?
                (?:                                   # post release
                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
                )?
                (?:[-_\.]?dev[-_\.]?[0-9]*)?          # dev release
            )
        )
        s^\s*s\s*$t
compatibles~=RCs==RDs!=REs<=RFs>=RGRHRIRJt	arbitrarys===cC`sfdjttjd�t|���d �}|d7}|jd�||�oe|jd�||�S(Nt.cS`s|jd�o|jd�S(Ntposttdev(t
startswith(tx((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt<lambda>�si����s.*s>=s==(tjointlistt	itertoolst	takewhilet_version_splitR6(R
RKR)tprefix((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_compare_compatible�s

cC`s�|jd�rht|j�}t|d �}tt|��}|t|� }t||�\}}n't|�}|js�t|j�}n||kS(Ns.*i����(tendswithRtpublicRiR-tlent_pad_versiontlocal(R
RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRL�s	cC`s|j||�S(N(RL(R
RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRM�scC`s|t|�kS(N(R(R
RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRN�scC`s|t|�kS(N(R(R
RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRO�scC`sXt|�}||kstS|jrT|jrTt|j�t|j�krTtSntS(N(RR:R9tbase_versionR;(R
RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRP�scC`s�t|�}||kstS|jrT|jrTt|j�t|j�krTtSn|jdk	r�t|j�t|j�kr�tSntS(N(RR:tis_postreleaseRqRpRR;(R
RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRQ�scC`s"t|�j�t|�j�kS(N(R-tlower(R
RKR)((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt_compare_arbitraryscC`ss|jdk	r|jS|j\}}|dkro|dkrY|jd�rY|d }nt|�jrotSntS(	Ns==s>=s<=s~=s===s.*i����(s==s>=s<=s~=s===(R(RR'RlRR9R;R:(R
R R!((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRs
cC`s
||_dS(N(R((R
R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRs(R	R
RRRSRTRURVR"R4R[RkRLRMRNRORPRQRtRARR(((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR\s,^
#	s^([0-9]+)((?:a|b|c|rc)[0-9]+)$cC`s\g}xO|jd�D]>}tj|�}|rG|j|j��q|j|�qW|S(NR_(tsplitt
_prefix_regexR#textendtgroupsR<(R!tresultRR*((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRi'sc	C`sgg}}|jttjd�|���|jttjd�|���|j|t|d��|j|t|d��|jddgtdt|d�t|d���|jddgtdt|d�t|d���ttj|��ttj|��fS(NcS`s
|j�S(N(tisdigit(Rc((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRd6RcS`s
|j�S(N(Rz(Rc((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRd7Riit0(R<RfRgRhRntinserttmaxtchain(tlefttrightt
left_splittright_split((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRo2s
""//tSpecifierSetcB`s�eZddd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d	�Zed
��Z
e
jd��Z
d�Zdd
�Zdd�ZRS(RcC`s�g|jd�D]}|j�r|j�^q}t�}xL|D]D}y|jt|��WqDtk
r�|jt|��qDXqDWt|�|_||_	dS(Nt,(
RuR&tsettaddR\RRBt	frozensett_specsR((R
t
specifiersRtstparsedt	specifier((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR+Os4	

cC`s=|jdk	r!dj|j�nd}djt|�|�S(Ns, prereleases={0!r}Rs<SpecifierSet({0!r}{1})>(R(RR$RR-(R
R.((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR/ds!cC`s djtd�|jD���S(NR�cs`s|]}t|�VqdS(N(R-(t.0R�((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pys	<genexpr>ns(RetsortedR�(R
((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRmscC`s
t|j�S(N(R0R�(R
((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyRpscC`s�t|t�rt|�}nt|t�s1tSt�}t|j|jB�|_|jdkr�|jdk	r�|j|_nZ|jdk	r�|jdkr�|j|_n-|j|jkr�|j|_ntd��|S(NsFCannot combine SpecifierSets with True and False prerelease overrides.(	R1RR�R2R�R�R(Rt
ValueError(R
RR�((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__and__ss		cC`set|t�rt|�}n7t|t�rBtt|��}nt|t�sUtS|j|jkS(N(R1RR�RR-R2R�(R
R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR�scC`set|t�rt|�}n7t|t�rBtt|��}nt|t�sUtS|j|jkS(N(R1RR�RR-R2R�(R
R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR�scC`s
t|j�S(N(RnR�(R
((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__len__�scC`s
t|j�S(N(titerR�(R
((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt__iter__�scC`s:|jdk	r|jS|js#dStd�|jD��S(Ncs`s|]}|jVqdS(N(R(R�R�((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pys	<genexpr>�s(R(RR�tany(R
((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR�s
	cC`s
||_dS(N(R((R
R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR�scC`s
|j|�S(N(R(R
R((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR8�sc`spt�ttf�s$t���n�dkr<|j�n�rP�jrPtSt��fd�|j	D��S(Nc3`s$|]}|j�d��VqdS(RN(R(R�R�(RR(sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pys	<genexpr>�s(
R1RRRRRR9R:tallR�(R
RR((RRsK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR�scC`s|dkr|j}n|jrTx,|jD]!}|j|dt|��}q+W|Sg}g}x�|D]{}t|ttf�s�t|�}n|}t|t�r�qgn|j	r�|r�|s�|j
|�q�qg|j
|�qgW|r|r|dkr|S|SdS(NR(RRR�RtboolR1RRRR9R<(R
RRR)tfilteredR>RR@((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR�s*	
N(R	R
RR+R/RRR�RRR�R�RARRR8RR(((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyR�Ms						
	
			(t
__future__RRRRRYRgRSt_compatRRR!RRRR�RtABCMetatobjectRRRBR[R\RTRvRiRoR�(((sK/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/specifiers.pyt<module>s""9�4		�		_vendor/packaging/__init__.pyo000064400000001143151733474000012417 0ustar00�
�fc@`sxddlmZmZmZddlmZmZmZmZm	Z	m
Z
mZmZdddddd	d
dgZ
dS(
i(tabsolute_importtdivisiontprint_functioni(t
__author__t
__copyright__t	__email__t__license__t__summary__t	__title__t__uri__t__version__RRR	R
RRRRN(t
__future__RRRt	__about__RRRRRRR	R
t__all__(((sI/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/__init__.pyt<module>s:_vendor/packaging/version.py000064400000026444151733474000012201 0ustar00# This file is dual licensed under the terms of the Apache License, Version
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.
from __future__ import absolute_import, division, print_function

import collections
import itertools
import re

from ._structures import Infinity


__all__ = [
    "parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN"
]


_Version = collections.namedtuple(
    "_Version",
    ["epoch", "release", "dev", "pre", "post", "local"],
)


def parse(version):
    """
    Parse the given version string and return either a :class:`Version` object
    or a :class:`LegacyVersion` object depending on if the given version is
    a valid PEP 440 version or a legacy version.
    """
    try:
        return Version(version)
    except InvalidVersion:
        return LegacyVersion(version)


class InvalidVersion(ValueError):
    """
    An invalid version was found, users should refer to PEP 440.
    """


class _BaseVersion(object):

    def __hash__(self):
        return hash(self._key)

    def __lt__(self, other):
        return self._compare(other, lambda s, o: s < o)

    def __le__(self, other):
        return self._compare(other, lambda s, o: s <= o)

    def __eq__(self, other):
        return self._compare(other, lambda s, o: s == o)

    def __ge__(self, other):
        return self._compare(other, lambda s, o: s >= o)

    def __gt__(self, other):
        return self._compare(other, lambda s, o: s > o)

    def __ne__(self, other):
        return self._compare(other, lambda s, o: s != o)

    def _compare(self, other, method):
        if not isinstance(other, _BaseVersion):
            return NotImplemented

        return method(self._key, other._key)


class LegacyVersion(_BaseVersion):

    def __init__(self, version):
        self._version = str(version)
        self._key = _legacy_cmpkey(self._version)

    def __str__(self):
        return self._version

    def __repr__(self):
        return "<LegacyVersion({0})>".format(repr(str(self)))

    @property
    def public(self):
        return self._version

    @property
    def base_version(self):
        return self._version

    @property
    def local(self):
        return None

    @property
    def is_prerelease(self):
        return False

    @property
    def is_postrelease(self):
        return False


_legacy_version_component_re = re.compile(
    r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE,
)

_legacy_version_replacement_map = {
    "pre": "c", "preview": "c", "-": "final-", "rc": "c", "dev": "@",
}


def _parse_version_parts(s):
    for part in _legacy_version_component_re.split(s):
        part = _legacy_version_replacement_map.get(part, part)

        if not part or part == ".":
            continue

        if part[:1] in "0123456789":
            # pad for numeric comparison
            yield part.zfill(8)
        else:
            yield "*" + part

    # ensure that alpha/beta/candidate are before final
    yield "*final"


def _legacy_cmpkey(version):
    # We hardcode an epoch of -1 here. A PEP 440 version can only have a epoch
    # greater than or equal to 0. This will effectively put the LegacyVersion,
    # which uses the defacto standard originally implemented by setuptools,
    # as before all PEP 440 versions.
    epoch = -1

    # This scheme is taken from pkg_resources.parse_version setuptools prior to
    # it's adoption of the packaging library.
    parts = []
    for part in _parse_version_parts(version.lower()):
        if part.startswith("*"):
            # remove "-" before a prerelease tag
            if part < "*final":
                while parts and parts[-1] == "*final-":
                    parts.pop()

            # remove trailing zeros from each series of numeric parts
            while parts and parts[-1] == "00000000":
                parts.pop()

        parts.append(part)
    parts = tuple(parts)

    return epoch, parts

# Deliberately not anchored to the start and end of the string, to make it
# easier for 3rd party code to reuse
VERSION_PATTERN = r"""
    v?
    (?:
        (?:(?P<epoch>[0-9]+)!)?                           # epoch
        (?P<release>[0-9]+(?:\.[0-9]+)*)                  # release segment
        (?P<pre>                                          # pre-release
            [-_\.]?
            (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview))
            [-_\.]?
            (?P<pre_n>[0-9]+)?
        )?
        (?P<post>                                         # post release
            (?:-(?P<post_n1>[0-9]+))
            |
            (?:
                [-_\.]?
                (?P<post_l>post|rev|r)
                [-_\.]?
                (?P<post_n2>[0-9]+)?
            )
        )?
        (?P<dev>                                          # dev release
            [-_\.]?
            (?P<dev_l>dev)
            [-_\.]?
            (?P<dev_n>[0-9]+)?
        )?
    )
    (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))?       # local version
"""


class Version(_BaseVersion):

    _regex = re.compile(
        r"^\s*" + VERSION_PATTERN + r"\s*$",
        re.VERBOSE | re.IGNORECASE,
    )

    def __init__(self, version):
        # Validate the version and parse it into pieces
        match = self._regex.search(version)
        if not match:
            raise InvalidVersion("Invalid version: '{0}'".format(version))

        # Store the parsed out pieces of the version
        self._version = _Version(
            epoch=int(match.group("epoch")) if match.group("epoch") else 0,
            release=tuple(int(i) for i in match.group("release").split(".")),
            pre=_parse_letter_version(
                match.group("pre_l"),
                match.group("pre_n"),
            ),
            post=_parse_letter_version(
                match.group("post_l"),
                match.group("post_n1") or match.group("post_n2"),
            ),
            dev=_parse_letter_version(
                match.group("dev_l"),
                match.group("dev_n"),
            ),
            local=_parse_local_version(match.group("local")),
        )

        # Generate a key which will be used for sorting
        self._key = _cmpkey(
            self._version.epoch,
            self._version.release,
            self._version.pre,
            self._version.post,
            self._version.dev,
            self._version.local,
        )

    def __repr__(self):
        return "<Version({0})>".format(repr(str(self)))

    def __str__(self):
        parts = []

        # Epoch
        if self._version.epoch != 0:
            parts.append("{0}!".format(self._version.epoch))

        # Release segment
        parts.append(".".join(str(x) for x in self._version.release))

        # Pre-release
        if self._version.pre is not None:
            parts.append("".join(str(x) for x in self._version.pre))

        # Post-release
        if self._version.post is not None:
            parts.append(".post{0}".format(self._version.post[1]))

        # Development release
        if self._version.dev is not None:
            parts.append(".dev{0}".format(self._version.dev[1]))

        # Local version segment
        if self._version.local is not None:
            parts.append(
                "+{0}".format(".".join(str(x) for x in self._version.local))
            )

        return "".join(parts)

    @property
    def public(self):
        return str(self).split("+", 1)[0]

    @property
    def base_version(self):
        parts = []

        # Epoch
        if self._version.epoch != 0:
            parts.append("{0}!".format(self._version.epoch))

        # Release segment
        parts.append(".".join(str(x) for x in self._version.release))

        return "".join(parts)

    @property
    def local(self):
        version_string = str(self)
        if "+" in version_string:
            return version_string.split("+", 1)[1]

    @property
    def is_prerelease(self):
        return bool(self._version.dev or self._version.pre)

    @property
    def is_postrelease(self):
        return bool(self._version.post)


def _parse_letter_version(letter, number):
    if letter:
        # We consider there to be an implicit 0 in a pre-release if there is
        # not a numeral associated with it.
        if number is None:
            number = 0

        # We normalize any letters to their lower case form
        letter = letter.lower()

        # We consider some words to be alternate spellings of other words and
        # in those cases we want to normalize the spellings to our preferred
        # spelling.
        if letter == "alpha":
            letter = "a"
        elif letter == "beta":
            letter = "b"
        elif letter in ["c", "pre", "preview"]:
            letter = "rc"
        elif letter in ["rev", "r"]:
            letter = "post"

        return letter, int(number)
    if not letter and number:
        # We assume if we are given a number, but we are not given a letter
        # then this is using the implicit post release syntax (e.g. 1.0-1)
        letter = "post"

        return letter, int(number)


_local_version_seperators = re.compile(r"[\._-]")


def _parse_local_version(local):
    """
    Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve").
    """
    if local is not None:
        return tuple(
            part.lower() if not part.isdigit() else int(part)
            for part in _local_version_seperators.split(local)
        )


def _cmpkey(epoch, release, pre, post, dev, local):
    # When we compare a release version, we want to compare it with all of the
    # trailing zeros removed. So we'll use a reverse the list, drop all the now
    # leading zeros until we come to something non zero, then take the rest
    # re-reverse it back into the correct order and make it a tuple and use
    # that for our sorting key.
    release = tuple(
        reversed(list(
            itertools.dropwhile(
                lambda x: x == 0,
                reversed(release),
            )
        ))
    )

    # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0.
    # We'll do this by abusing the pre segment, but we _only_ want to do this
    # if there is not a pre or a post segment. If we have one of those then
    # the normal sorting rules will handle this case correctly.
    if pre is None and post is None and dev is not None:
        pre = -Infinity
    # Versions without a pre-release (except as noted above) should sort after
    # those with one.
    elif pre is None:
        pre = Infinity

    # Versions without a post segment should sort before those with one.
    if post is None:
        post = -Infinity

    # Versions without a development segment should sort after those with one.
    if dev is None:
        dev = Infinity

    if local is None:
        # Versions without a local segment should sort before those with one.
        local = -Infinity
    else:
        # Versions with a local segment need that segment parsed to implement
        # the sorting rules in PEP440.
        # - Alpha numeric segments sort before numeric segments
        # - Alpha numeric segments sort lexicographically
        # - Numeric segments sort numerically
        # - Shorter versions sort before longer versions when the prefixes
        #   match exactly
        local = tuple(
            (i, "") if isinstance(i, int) else (-Infinity, i)
            for i in local
        )

    return epoch, release, pre, post, dev, local
_vendor/packaging/_compat.pyo000064400000002334151733474000012305 0ustar00�
�fc@`svddlmZmZmZddlZejddkZejddkZer`efZ	n	e
fZ	d�ZdS(i(tabsolute_importtdivisiontprint_functionNiic`s5d�f��fd��Y}tj|ddi�S(s/
    Create a base class with a metaclass.
    t	metaclassc`seZ��fd�ZRS(c`s�|�|�S(N((tclstnamet
this_basestd(tbasestmeta(sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.pyt__new__s(t__name__t
__module__R
((RR	(sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.pyRsttemporary_class((ttypeR
(R	RR((RR	sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.pytwith_metaclasss(t
__future__RRRtsystversion_infotPY2tPY3tstrtstring_typest
basestringR(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_compat.pyt<module>s	_vendor/packaging/markers.pyo000064400000027055151733474000012336 0ustar00�
�fc@`suddlmZmZmZddlZddlZddlZddlZddlm	Z	m
Z
mZmZddlm
Z
mZmZmZddlmZddlmZddlmZmZd	d
ddd
gZd	efd��YZd
efd��YZdefd��YZdefd��YZdefd��YZdefd��YZ defd��YZ!ed�ed�Bed�Bed�Bed�Bed�Bed�Bed �Bed!�Bed"�Bed#�Bed$�Bed%�Bed&�Bed'�Bed(�Bed)�Bed*�BZ"id#d$6d"d%6dd&6dd'6dd(6dd)6Z#e"j$d+��ed,�ed-�Bed.�Bed/�Bed0�Bed1�Bed2�Bed3�BZ%e%ed4�Bed5�BZ&e&j$d6��ed7�ed8�BZ'e'j$d9��ed:�ed;�BZ(e"e'BZ)ee)e&e)�Z*e*j$d<��ed=�j+�Z,ed>�j+�Z-e�Z.e*ee,e.e-�BZ/e.e/e
e(e.�>ee.eZ0d?�Z1e2d@�Z3idA�d56dB�d46ej4d36ej5d/6ej6d-6ej7d06ej8d.6ej9d26Z:dC�Z;e�Z<dD�Z=dE�Z>dF�Z?dG�Z@defdH��YZAdS(Ii(tabsolute_importtdivisiontprint_functionN(tParseExceptiontParseResultststringStartt	stringEnd(t
ZeroOrMoretGrouptForwardtQuotedString(tLiterali(tstring_types(t	SpecifiertInvalidSpecifiert
InvalidMarkertUndefinedComparisontUndefinedEnvironmentNametMarkertdefault_environmentcB`seZdZRS(sE
    An invalid marker was found, users should refer to PEP 508.
    (t__name__t
__module__t__doc__(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRscB`seZdZRS(sP
    An invalid operation was attempted on a value that doesn't support it.
    (RRR(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRscB`seZdZRS(s\
    A name was attempted to be used that does not exist inside of the
    environment.
    (RRR(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR%stNodecB`s,eZd�Zd�Zd�Zd�ZRS(cC`s
||_dS(N(tvalue(tselfR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyt__init__.scC`s
t|j�S(N(tstrR(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyt__str__1scC`sdj|jjt|��S(Ns<{0}({1!r})>(tformatt	__class__RR(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyt__repr__4scC`s
t�dS(N(tNotImplementedError(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyt	serialize7s(RRRRRR!(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR,s			tVariablecB`seZd�ZRS(cC`s
t|�S(N(R(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR!=s(RRR!(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR";stValuecB`seZd�ZRS(cC`s
dj|�S(Ns"{0}"(R(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR!Cs(RRR!(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR#AstOpcB`seZd�ZRS(cC`s
t|�S(N(R(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR!Is(RRR!(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR$Gstimplementation_versiontplatform_python_implementationtimplementation_nametpython_full_versiontplatform_releasetplatform_versiontplatform_machinetplatform_systemtpython_versiontsys_platformtos_namesos.namessys.platformsplatform.versionsplatform.machinesplatform.python_implementationtpython_implementationtextracC`sttj|d|d��S(Ni(R"tALIASEStget(tstltt((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyt<lambda>its===s==s>=s<=s!=s~=t>t<snot intincC`st|d�S(Ni(R$(R4R5R6((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR7wR8t't"cC`st|d�S(Ni(R#(R4R5R6((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR7zR8tandtorcC`st|d�S(Ni(ttuple(R4R5R6((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR7�R8t(t)cC`s4t|t�r,g|D]}t|�^qS|SdS(N(t
isinstanceRt_coerce_parse_result(tresultsti((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRD�scC`s�t|t�rHt|�dkrHt|dttf�rHt|d�St|t�r�d�|D�}|rzdj|�Sddj|�dSn9t|t�r�djg|D]}|j�^q��S|SdS(Niics`s!|]}t|dt�VqdS(tfirstN(t_format_markertFalse(t.0tm((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pys	<genexpr>�st RARB(RCtlisttlenR@RHtjoinR!(tmarkerRGtinnerRK((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRH�s!
&cC`s
||kS(N((tlhstrhs((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR7�R8cC`s
||kS(N((RRRS((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR7�R8cC`s�y%tdj|j�|g��}Wntk
r8nX|j|�Stj|j��}|dkr�tdj	|||���n|||�S(NR8s#Undefined {0!r} on {1!r} and {2!r}.(
R
ROR!Rtcontainst
_operatorsR3tNoneRR(RRtopRStspectoper((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyt_eval_op�s%

cC`s:|j|t�}|tkr6tdj|���n|S(Ns/{0!r} does not exist in evaluation environment.(R3t
_undefinedRR(tenvironmenttnameR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyt_get_env�s
c	C`s�gg}x�|D]�}t|t�rB|djt||��qt|t�r�|\}}}t|t�r�t||j�}|j}n|j}t||j�}|djt|||��q|dkr|jg�qqWt	d�|D��S(Ni����R?cs`s|]}t|�VqdS(N(tall(RJtitem((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pys	<genexpr>�s(
RCRMtappendt_evaluate_markersR@R"R^RRZtany(	tmarkersR\tgroupsRPRRRWRSt	lhs_valuet	rhs_value((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRb�s	
	 cC`sFdj|�}|j}|dkrB||dt|j�7}n|S(Ns{0.major}.{0.minor}.{0.micro}tfinali(RtreleaselevelRtserial(tinfotversiontkind((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pytformat_full_version�s
	cC`s�ttd�r0ttjj�}tjj}nd}d}i|d6|d6tjd6tj�d6tj	�d6tj
�d	6tj�d
6tj�d6tj�d6tj�d
 d6tjd6S(Ntimplementationt0R8R'R%R/R+R)R,R*R(R&iR-R.(
thasattrtsysRnRoRlR]tostplatformtmachinetreleasetsystemR-R0(tiverR'((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyR�s"






cB`s/eZd�Zd�Zd�Zdd�ZRS(cC`seyttj|��|_WnBtk
r`}dj|||j|jd!�}t|��nXdS(Ns+Invalid marker: {0!r}, parse error at {1!r}i(RDtMARKERtparseStringt_markersRRtlocR(RRPteterr_str((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRscC`s
t|j�S(N(RHR{(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRscC`sdjt|��S(Ns<Marker({0!r})>(RR(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRscC`s5t�}|dk	r%|j|�nt|j|�S(s$Evaluate a marker.

        Return the boolean from evaluating the given marker against the
        environment. environment is an optional argument to override all or
        part of the determined environment.

        The environment is determined from the current Python process.
        N(RRVtupdateRbR{(RR\tcurrent_environment((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pytevaluate s		N(RRRRRRVR�(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyRs			(Bt
__future__RRRtoperatorRsRtRrtsetuptools.extern.pyparsingRRRRRRR	R
RtLt_compatRt
specifiersR
Rt__all__t
ValueErrorRRRtobjectRR"R#R$tVARIABLER2tsetParseActiontVERSION_CMPt	MARKER_OPtMARKER_VALUEtBOOLOPt
MARKER_VARtMARKER_ITEMtsuppresstLPARENtRPARENtMARKER_EXPRtMARKER_ATOMRyRDtTrueRHtlttleteqtnetgetgtRURZR[R^RbRnRR(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/markers.pyt<module>s|""	�

	E

		







						_vendor/packaging/markers.py000064400000020057151733474000012152 0ustar00# This file is dual licensed under the terms of the Apache License, Version
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.
from __future__ import absolute_import, division, print_function

import operator
import os
import platform
import sys

from setuptools.extern.pyparsing import ParseException, ParseResults, stringStart, stringEnd
from setuptools.extern.pyparsing import ZeroOrMore, Group, Forward, QuotedString
from setuptools.extern.pyparsing import Literal as L  # noqa

from ._compat import string_types
from .specifiers import Specifier, InvalidSpecifier


__all__ = [
    "InvalidMarker", "UndefinedComparison", "UndefinedEnvironmentName",
    "Marker", "default_environment",
]


class InvalidMarker(ValueError):
    """
    An invalid marker was found, users should refer to PEP 508.
    """


class UndefinedComparison(ValueError):
    """
    An invalid operation was attempted on a value that doesn't support it.
    """


class UndefinedEnvironmentName(ValueError):
    """
    A name was attempted to be used that does not exist inside of the
    environment.
    """


class Node(object):

    def __init__(self, value):
        self.value = value

    def __str__(self):
        return str(self.value)

    def __repr__(self):
        return "<{0}({1!r})>".format(self.__class__.__name__, str(self))

    def serialize(self):
        raise NotImplementedError


class Variable(Node):

    def serialize(self):
        return str(self)


class Value(Node):

    def serialize(self):
        return '"{0}"'.format(self)


class Op(Node):

    def serialize(self):
        return str(self)


VARIABLE = (
    L("implementation_version") |
    L("platform_python_implementation") |
    L("implementation_name") |
    L("python_full_version") |
    L("platform_release") |
    L("platform_version") |
    L("platform_machine") |
    L("platform_system") |
    L("python_version") |
    L("sys_platform") |
    L("os_name") |
    L("os.name") |  # PEP-345
    L("sys.platform") |  # PEP-345
    L("platform.version") |  # PEP-345
    L("platform.machine") |  # PEP-345
    L("platform.python_implementation") |  # PEP-345
    L("python_implementation") |  # undocumented setuptools legacy
    L("extra")
)
ALIASES = {
    'os.name': 'os_name',
    'sys.platform': 'sys_platform',
    'platform.version': 'platform_version',
    'platform.machine': 'platform_machine',
    'platform.python_implementation': 'platform_python_implementation',
    'python_implementation': 'platform_python_implementation'
}
VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0])))

VERSION_CMP = (
    L("===") |
    L("==") |
    L(">=") |
    L("<=") |
    L("!=") |
    L("~=") |
    L(">") |
    L("<")
)

MARKER_OP = VERSION_CMP | L("not in") | L("in")
MARKER_OP.setParseAction(lambda s, l, t: Op(t[0]))

MARKER_VALUE = QuotedString("'") | QuotedString('"')
MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0]))

BOOLOP = L("and") | L("or")

MARKER_VAR = VARIABLE | MARKER_VALUE

MARKER_ITEM = Group(MARKER_VAR + MARKER_OP + MARKER_VAR)
MARKER_ITEM.setParseAction(lambda s, l, t: tuple(t[0]))

LPAREN = L("(").suppress()
RPAREN = L(")").suppress()

MARKER_EXPR = Forward()
MARKER_ATOM = MARKER_ITEM | Group(LPAREN + MARKER_EXPR + RPAREN)
MARKER_EXPR << MARKER_ATOM + ZeroOrMore(BOOLOP + MARKER_EXPR)

MARKER = stringStart + MARKER_EXPR + stringEnd


def _coerce_parse_result(results):
    if isinstance(results, ParseResults):
        return [_coerce_parse_result(i) for i in results]
    else:
        return results


def _format_marker(marker, first=True):
    assert isinstance(marker, (list, tuple, string_types))

    # Sometimes we have a structure like [[...]] which is a single item list
    # where the single item is itself it's own list. In that case we want skip
    # the rest of this function so that we don't get extraneous () on the
    # outside.
    if (isinstance(marker, list) and len(marker) == 1 and
            isinstance(marker[0], (list, tuple))):
        return _format_marker(marker[0])

    if isinstance(marker, list):
        inner = (_format_marker(m, first=False) for m in marker)
        if first:
            return " ".join(inner)
        else:
            return "(" + " ".join(inner) + ")"
    elif isinstance(marker, tuple):
        return " ".join([m.serialize() for m in marker])
    else:
        return marker


_operators = {
    "in": lambda lhs, rhs: lhs in rhs,
    "not in": lambda lhs, rhs: lhs not in rhs,
    "<": operator.lt,
    "<=": operator.le,
    "==": operator.eq,
    "!=": operator.ne,
    ">=": operator.ge,
    ">": operator.gt,
}


def _eval_op(lhs, op, rhs):
    try:
        spec = Specifier("".join([op.serialize(), rhs]))
    except InvalidSpecifier:
        pass
    else:
        return spec.contains(lhs)

    oper = _operators.get(op.serialize())
    if oper is None:
        raise UndefinedComparison(
            "Undefined {0!r} on {1!r} and {2!r}.".format(op, lhs, rhs)
        )

    return oper(lhs, rhs)


_undefined = object()


def _get_env(environment, name):
    value = environment.get(name, _undefined)

    if value is _undefined:
        raise UndefinedEnvironmentName(
            "{0!r} does not exist in evaluation environment.".format(name)
        )

    return value


def _evaluate_markers(markers, environment):
    groups = [[]]

    for marker in markers:
        assert isinstance(marker, (list, tuple, string_types))

        if isinstance(marker, list):
            groups[-1].append(_evaluate_markers(marker, environment))
        elif isinstance(marker, tuple):
            lhs, op, rhs = marker

            if isinstance(lhs, Variable):
                lhs_value = _get_env(environment, lhs.value)
                rhs_value = rhs.value
            else:
                lhs_value = lhs.value
                rhs_value = _get_env(environment, rhs.value)

            groups[-1].append(_eval_op(lhs_value, op, rhs_value))
        else:
            assert marker in ["and", "or"]
            if marker == "or":
                groups.append([])

    return any(all(item) for item in groups)


def format_full_version(info):
    version = '{0.major}.{0.minor}.{0.micro}'.format(info)
    kind = info.releaselevel
    if kind != 'final':
        version += kind[0] + str(info.serial)
    return version


def default_environment():
    if hasattr(sys, 'implementation'):
        iver = format_full_version(sys.implementation.version)
        implementation_name = sys.implementation.name
    else:
        iver = '0'
        implementation_name = ''

    return {
        "implementation_name": implementation_name,
        "implementation_version": iver,
        "os_name": os.name,
        "platform_machine": platform.machine(),
        "platform_release": platform.release(),
        "platform_system": platform.system(),
        "platform_version": platform.version(),
        "python_full_version": platform.python_version(),
        "platform_python_implementation": platform.python_implementation(),
        "python_version": platform.python_version()[:3],
        "sys_platform": sys.platform,
    }


class Marker(object):

    def __init__(self, marker):
        try:
            self._markers = _coerce_parse_result(MARKER.parseString(marker))
        except ParseException as e:
            err_str = "Invalid marker: {0!r}, parse error at {1!r}".format(
                marker, marker[e.loc:e.loc + 8])
            raise InvalidMarker(err_str)

    def __str__(self):
        return _format_marker(self._markers)

    def __repr__(self):
        return "<Marker({0!r})>".format(str(self))

    def evaluate(self, environment=None):
        """Evaluate a marker.

        Return the boolean from evaluating the given marker against the
        environment. environment is an optional argument to override all or
        part of the determined environment.

        The environment is determined from the current Python process.
        """
        current_environment = default_environment()
        if environment is not None:
            current_environment.update(environment)

        return _evaluate_markers(self._markers, current_environment)
_vendor/packaging/requirements.pyc000064400000012054151733474000013372 0ustar00�
�fc@`sYddlmZmZmZddlZddlZddlmZmZm	Z	m
Z
ddlmZmZm
Z
mZmZddlmZddlmZddlmZmZdd	lmZmZmZd
efd��YZeejej�Z ed�j!�Z"ed
�j!�Z#ed�j!�Z$ed�j!�Z%ed�j!�Z&ed�j!�Z'ed�j!�Z(ed�Z)e ee)�e BZ*ee ee*��Z+e+d�Z,e+Z-ed�d�Z.e(e.Z/e-ee&e-�Z0e"e
e0�e#d�Z1eej2ej3ej4B�Z5eej2ej3ej4B�Z6e5e6AZ7ee7ee&e7�ddde8�d�Z9e
e$e9e%e9B�Z:e:j;d��e	e:�d�Z<e<j;d��e	e��d�Zej;d��e'Z=e=eZ>e<e
e>�Z?e/e
e>�Z@e,e
e1�e@e?BZAeeAeZBd eCfd!��YZDdS("i(tabsolute_importtdivisiontprint_functionN(tstringStartt	stringEndtoriginalTextFortParseException(t
ZeroOrMoretWordtOptionaltRegextCombine(tLiteral(tparsei(tMARKER_EXPRtMarker(tLegacySpecifiert	SpecifiertSpecifierSettInvalidRequirementcB`seZdZRS(sJ
    An invalid requirement was found, users should refer to PEP 508.
    (t__name__t
__module__t__doc__(((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyRst[t]t(t)t,t;t@s-_.tnames[^ ]+turltextrast
joinStringtadjacentt	_raw_speccC`s
|jpdS(Nt(R#(tstltt((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyt<lambda>6R$t	specifiercC`s|dS(Ni((R%R&R'((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyR(9R$tmarkercC`st||j|j!�S(N(Rt_original_startt
_original_end(R%R&R'((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyR(=R$tRequirementcB`s)eZdZd�Zd�Zd�ZRS(s�Parse a requirement.

    Parse a given requirement string into its parts, such as name, specifier,
    URL, and extras. Raises InvalidRequirement on a badly-formed requirement
    string.
    cC`sytj|�}Wn9tk
rN}tdj||j|jd!���nX|j|_|jr�tj|j�}|j	o�|j
s�|j	r�|j
r�td��n|j|_n	d|_t|j
r�|j
j�ng�|_
t|j�|_|jr|jnd|_dS(Ns+Invalid requirement, parse error at "{0!r}"isInvalid URL given(tREQUIREMENTtparseStringRRtformattlocRRturlparsetschemetnetloctNonetsetR tasListRR)R*(tselftrequirement_stringtreqtet
parsed_url((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyt__init__Xs"!		'cC`s�|jg}|jr@|jdjdjt|j����n|jrb|jt|j��n|jr�|jdj|j��n|j	r�|jdj|j	��ndj|�S(Ns[{0}]Rs@ {0}s; {0}R$(
RR tappendR0tjointsortedR)tstrRR*(R8tparts((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyt__str__ms	+			cC`sdjt|��S(Ns<Requirement({0!r})>(R0RA(R8((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyt__repr__~s(RRRR=RCRD(((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyR-Ks		(Et
__future__RRRtstringtretsetuptools.extern.pyparsingRRRRRRR	R
RRtLt"setuptools.extern.six.moves.urllibR
R2tmarkersRRt
specifiersRRRt
ValueErrorRt
ascii_letterstdigitstALPHANUMtsuppresstLBRACKETtRBRACKETtLPARENtRPARENtCOMMAt	SEMICOLONtATtPUNCTUATIONtIDENTIFIER_ENDt
IDENTIFIERtNAMEtEXTRAtURItURLtEXTRAS_LISTtEXTRASt
_regex_strtVERBOSEt
IGNORECASEtVERSION_PEP440tVERSION_LEGACYtVERSION_ONEtFalsetVERSION_MANYt
_VERSION_SPECtsetParseActiontVERSION_SPECtMARKER_SEPERATORtMARKERtVERSION_AND_MARKERtURL_AND_MARKERtNAMED_REQUIREMENTR.tobjectR-(((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyt<module>sZ"(



_vendor/packaging/__about__.py000064400000001320151733474000012404 0ustar00# This file is dual licensed under the terms of the Apache License, Version
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.
from __future__ import absolute_import, division, print_function

__all__ = [
    "__title__", "__summary__", "__uri__", "__version__", "__author__",
    "__email__", "__license__", "__copyright__",
]

__title__ = "packaging"
__summary__ = "Core utilities for Python packages"
__uri__ = "https://github.com/pypa/packaging"

__version__ = "16.8"

__author__ = "Donald Stufft and individual contributors"
__email__ = "donald@stufft.io"

__license__ = "BSD or Apache License, Version 2.0"
__copyright__ = "Copyright 2014-2016 %s" % __author__
_vendor/packaging/_structures.pyc000064400000010115151733474000013225 0ustar00�
�fc@`s^ddlmZmZmZdefd��YZe�Zdefd��YZe�ZdS(i(tabsolute_importtdivisiontprint_functiontInfinitycB`sYeZd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
RS(	cC`sdS(NR((tself((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__repr__	scC`stt|��S(N(thashtrepr(R((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__hash__scC`stS(N(tFalse(Rtother((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__lt__scC`stS(N(R	(RR
((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__le__scC`st||j�S(N(t
isinstancet	__class__(RR
((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__eq__scC`st||j�S(N(R
R(RR
((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__ne__scC`stS(N(tTrue(RR
((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__gt__scC`stS(N(R(RR
((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__ge__scC`stS(N(tNegativeInfinity(R((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt__neg__!s(t__name__t
__module__RRRRRRRRR(((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyRs								RcB`sYeZd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
RS(	cC`sdS(Ns	-Infinity((R((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR)scC`stt|��S(N(RR(R((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR,scC`stS(N(R(RR
((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR/scC`stS(N(R(RR
((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR2scC`st||j�S(N(R
R(RR
((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR5scC`st||j�S(N(R
R(RR
((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR8scC`stS(N(R	(RR
((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR;scC`stS(N(R	(RR
((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR>scC`stS(N(R(R((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyRAs(RRRRRRRRRRR(((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyR's								N(t
__future__RRRtobjectRR(((sL/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/_structures.pyt<module>s	_vendor/packaging/__init__.pyc000064400000001143151733474000012403 0ustar00�
�fc@`sxddlmZmZmZddlmZmZmZmZm	Z	m
Z
mZmZdddddd	d
dgZ
dS(
i(tabsolute_importtdivisiontprint_functioni(t
__author__t
__copyright__t	__email__t__license__t__summary__t	__title__t__uri__t__version__RRR	R
RRRRN(t
__future__RRRt	__about__RRRRRRR	R
t__all__(((sI/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/__init__.pyt<module>s:_vendor/packaging/__about__.pyo000064400000001425151733474000012571 0ustar00�
�fc@`srddlmZmZmZdddddddd	gZd
ZdZdZd
ZdZ	dZ
dZde	ZdS(i(tabsolute_importtdivisiontprint_functiont	__title__t__summary__t__uri__t__version__t
__author__t	__email__t__license__t
__copyright__t	packagings"Core utilities for Python packagess!https://github.com/pypa/packagings16.8s)Donald Stufft and individual contributorssdonald@stufft.ios"BSD or Apache License, Version 2.0sCopyright 2014-2016 %sN(
t
__future__RRRt__all__RRRRRRR	R
(((sJ/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/__about__.pyt<module>s_vendor/packaging/requirements.pyo000064400000012054151733474000013406 0ustar00�
�fc@`sYddlmZmZmZddlZddlZddlmZmZm	Z	m
Z
ddlmZmZm
Z
mZmZddlmZddlmZddlmZmZdd	lmZmZmZd
efd��YZeejej�Z ed�j!�Z"ed
�j!�Z#ed�j!�Z$ed�j!�Z%ed�j!�Z&ed�j!�Z'ed�j!�Z(ed�Z)e ee)�e BZ*ee ee*��Z+e+d�Z,e+Z-ed�d�Z.e(e.Z/e-ee&e-�Z0e"e
e0�e#d�Z1eej2ej3ej4B�Z5eej2ej3ej4B�Z6e5e6AZ7ee7ee&e7�ddde8�d�Z9e
e$e9e%e9B�Z:e:j;d��e	e:�d�Z<e<j;d��e	e��d�Zej;d��e'Z=e=eZ>e<e
e>�Z?e/e
e>�Z@e,e
e1�e@e?BZAeeAeZBd eCfd!��YZDdS("i(tabsolute_importtdivisiontprint_functionN(tstringStartt	stringEndtoriginalTextFortParseException(t
ZeroOrMoretWordtOptionaltRegextCombine(tLiteral(tparsei(tMARKER_EXPRtMarker(tLegacySpecifiert	SpecifiertSpecifierSettInvalidRequirementcB`seZdZRS(sJ
    An invalid requirement was found, users should refer to PEP 508.
    (t__name__t
__module__t__doc__(((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyRst[t]t(t)t,t;t@s-_.tnames[^ ]+turltextrast
joinStringtadjacentt	_raw_speccC`s
|jpdS(Nt(R#(tstltt((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyt<lambda>6R$t	specifiercC`s|dS(Ni((R%R&R'((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyR(9R$tmarkercC`st||j|j!�S(N(Rt_original_startt
_original_end(R%R&R'((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyR(=R$tRequirementcB`s)eZdZd�Zd�Zd�ZRS(s�Parse a requirement.

    Parse a given requirement string into its parts, such as name, specifier,
    URL, and extras. Raises InvalidRequirement on a badly-formed requirement
    string.
    cC`sytj|�}Wn9tk
rN}tdj||j|jd!���nX|j|_|jr�tj|j�}|j	o�|j
s�|j	r�|j
r�td��n|j|_n	d|_t|j
r�|j
j�ng�|_
t|j�|_|jr|jnd|_dS(Ns+Invalid requirement, parse error at "{0!r}"isInvalid URL given(tREQUIREMENTtparseStringRRtformattlocRRturlparsetschemetnetloctNonetsetR tasListRR)R*(tselftrequirement_stringtreqtet
parsed_url((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyt__init__Xs"!		'cC`s�|jg}|jr@|jdjdjt|j����n|jrb|jt|j��n|jr�|jdj|j��n|j	r�|jdj|j	��ndj|�S(Ns[{0}]Rs@ {0}s; {0}R$(
RR tappendR0tjointsortedR)tstrRR*(R8tparts((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyt__str__ms	+			cC`sdjt|��S(Ns<Requirement({0!r})>(R0RA(R8((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyt__repr__~s(RRRR=RCRD(((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyR-Ks		(Et
__future__RRRtstringtretsetuptools.extern.pyparsingRRRRRRR	R
RRtLt"setuptools.extern.six.moves.urllibR
R2tmarkersRRt
specifiersRRRt
ValueErrorRt
ascii_letterstdigitstALPHANUMtsuppresstLBRACKETtRBRACKETtLPARENtRPARENtCOMMAt	SEMICOLONtATtPUNCTUATIONtIDENTIFIER_ENDt
IDENTIFIERtNAMEtEXTRAtURItURLtEXTRAS_LISTtEXTRASt
_regex_strtVERBOSEt
IGNORECASEtVERSION_PEP440tVERSION_LEGACYtVERSION_ONEtFalsetVERSION_MANYt
_VERSION_SPECtsetParseActiontVERSION_SPECtMARKER_SEPERATORtMARKERtVERSION_AND_MARKERtURL_AND_MARKERtNAMED_REQUIREMENTR.tobjectR-(((sM/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/requirements.pyt<module>sZ"(



_vendor/packaging/_structures.py000064400000002610151733474000013063 0ustar00# This file is dual licensed under the terms of the Apache License, Version
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.
from __future__ import absolute_import, division, print_function


class Infinity(object):

    def __repr__(self):
        return "Infinity"

    def __hash__(self):
        return hash(repr(self))

    def __lt__(self, other):
        return False

    def __le__(self, other):
        return False

    def __eq__(self, other):
        return isinstance(other, self.__class__)

    def __ne__(self, other):
        return not isinstance(other, self.__class__)

    def __gt__(self, other):
        return True

    def __ge__(self, other):
        return True

    def __neg__(self):
        return NegativeInfinity

Infinity = Infinity()


class NegativeInfinity(object):

    def __repr__(self):
        return "-Infinity"

    def __hash__(self):
        return hash(repr(self))

    def __lt__(self, other):
        return True

    def __le__(self, other):
        return True

    def __eq__(self, other):
        return isinstance(other, self.__class__)

    def __ne__(self, other):
        return not isinstance(other, self.__class__)

    def __gt__(self, other):
        return False

    def __ge__(self, other):
        return False

    def __neg__(self):
        return Infinity

NegativeInfinity = NegativeInfinity()
_vendor/packaging/specifiers.py000064400000066571151733474000012655 0ustar00# This file is dual licensed under the terms of the Apache License, Version
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.
from __future__ import absolute_import, division, print_function

import abc
import functools
import itertools
import re

from ._compat import string_types, with_metaclass
from .version import Version, LegacyVersion, parse


class InvalidSpecifier(ValueError):
    """
    An invalid specifier was found, users should refer to PEP 440.
    """


class BaseSpecifier(with_metaclass(abc.ABCMeta, object)):

    @abc.abstractmethod
    def __str__(self):
        """
        Returns the str representation of this Specifier like object. This
        should be representative of the Specifier itself.
        """

    @abc.abstractmethod
    def __hash__(self):
        """
        Returns a hash value for this Specifier like object.
        """

    @abc.abstractmethod
    def __eq__(self, other):
        """
        Returns a boolean representing whether or not the two Specifier like
        objects are equal.
        """

    @abc.abstractmethod
    def __ne__(self, other):
        """
        Returns a boolean representing whether or not the two Specifier like
        objects are not equal.
        """

    @abc.abstractproperty
    def prereleases(self):
        """
        Returns whether or not pre-releases as a whole are allowed by this
        specifier.
        """

    @prereleases.setter
    def prereleases(self, value):
        """
        Sets whether or not pre-releases as a whole are allowed by this
        specifier.
        """

    @abc.abstractmethod
    def contains(self, item, prereleases=None):
        """
        Determines if the given item is contained within this specifier.
        """

    @abc.abstractmethod
    def filter(self, iterable, prereleases=None):
        """
        Takes an iterable of items and filters them so that only items which
        are contained within this specifier are allowed in it.
        """


class _IndividualSpecifier(BaseSpecifier):

    _operators = {}

    def __init__(self, spec="", prereleases=None):
        match = self._regex.search(spec)
        if not match:
            raise InvalidSpecifier("Invalid specifier: '{0}'".format(spec))

        self._spec = (
            match.group("operator").strip(),
            match.group("version").strip(),
        )

        # Store whether or not this Specifier should accept prereleases
        self._prereleases = prereleases

    def __repr__(self):
        pre = (
            ", prereleases={0!r}".format(self.prereleases)
            if self._prereleases is not None
            else ""
        )

        return "<{0}({1!r}{2})>".format(
            self.__class__.__name__,
            str(self),
            pre,
        )

    def __str__(self):
        return "{0}{1}".format(*self._spec)

    def __hash__(self):
        return hash(self._spec)

    def __eq__(self, other):
        if isinstance(other, string_types):
            try:
                other = self.__class__(other)
            except InvalidSpecifier:
                return NotImplemented
        elif not isinstance(other, self.__class__):
            return NotImplemented

        return self._spec == other._spec

    def __ne__(self, other):
        if isinstance(other, string_types):
            try:
                other = self.__class__(other)
            except InvalidSpecifier:
                return NotImplemented
        elif not isinstance(other, self.__class__):
            return NotImplemented

        return self._spec != other._spec

    def _get_operator(self, op):
        return getattr(self, "_compare_{0}".format(self._operators[op]))

    def _coerce_version(self, version):
        if not isinstance(version, (LegacyVersion, Version)):
            version = parse(version)
        return version

    @property
    def operator(self):
        return self._spec[0]

    @property
    def version(self):
        return self._spec[1]

    @property
    def prereleases(self):
        return self._prereleases

    @prereleases.setter
    def prereleases(self, value):
        self._prereleases = value

    def __contains__(self, item):
        return self.contains(item)

    def contains(self, item, prereleases=None):
        # Determine if prereleases are to be allowed or not.
        if prereleases is None:
            prereleases = self.prereleases

        # Normalize item to a Version or LegacyVersion, this allows us to have
        # a shortcut for ``"2.0" in Specifier(">=2")
        item = self._coerce_version(item)

        # Determine if we should be supporting prereleases in this specifier
        # or not, if we do not support prereleases than we can short circuit
        # logic if this version is a prereleases.
        if item.is_prerelease and not prereleases:
            return False

        # Actually do the comparison to determine if this item is contained
        # within this Specifier or not.
        return self._get_operator(self.operator)(item, self.version)

    def filter(self, iterable, prereleases=None):
        yielded = False
        found_prereleases = []

        kw = {"prereleases": prereleases if prereleases is not None else True}

        # Attempt to iterate over all the values in the iterable and if any of
        # them match, yield them.
        for version in iterable:
            parsed_version = self._coerce_version(version)

            if self.contains(parsed_version, **kw):
                # If our version is a prerelease, and we were not set to allow
                # prereleases, then we'll store it for later incase nothing
                # else matches this specifier.
                if (parsed_version.is_prerelease and not
                        (prereleases or self.prereleases)):
                    found_prereleases.append(version)
                # Either this is not a prerelease, or we should have been
                # accepting prereleases from the begining.
                else:
                    yielded = True
                    yield version

        # Now that we've iterated over everything, determine if we've yielded
        # any values, and if we have not and we have any prereleases stored up
        # then we will go ahead and yield the prereleases.
        if not yielded and found_prereleases:
            for version in found_prereleases:
                yield version


class LegacySpecifier(_IndividualSpecifier):

    _regex_str = (
        r"""
        (?P<operator>(==|!=|<=|>=|<|>))
        \s*
        (?P<version>
            [^,;\s)]* # Since this is a "legacy" specifier, and the version
                      # string can be just about anything, we match everything
                      # except for whitespace, a semi-colon for marker support,
                      # a closing paren since versions can be enclosed in
                      # them, and a comma since it's a version separator.
        )
        """
    )

    _regex = re.compile(
        r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE)

    _operators = {
        "==": "equal",
        "!=": "not_equal",
        "<=": "less_than_equal",
        ">=": "greater_than_equal",
        "<": "less_than",
        ">": "greater_than",
    }

    def _coerce_version(self, version):
        if not isinstance(version, LegacyVersion):
            version = LegacyVersion(str(version))
        return version

    def _compare_equal(self, prospective, spec):
        return prospective == self._coerce_version(spec)

    def _compare_not_equal(self, prospective, spec):
        return prospective != self._coerce_version(spec)

    def _compare_less_than_equal(self, prospective, spec):
        return prospective <= self._coerce_version(spec)

    def _compare_greater_than_equal(self, prospective, spec):
        return prospective >= self._coerce_version(spec)

    def _compare_less_than(self, prospective, spec):
        return prospective < self._coerce_version(spec)

    def _compare_greater_than(self, prospective, spec):
        return prospective > self._coerce_version(spec)


def _require_version_compare(fn):
    @functools.wraps(fn)
    def wrapped(self, prospective, spec):
        if not isinstance(prospective, Version):
            return False
        return fn(self, prospective, spec)
    return wrapped


class Specifier(_IndividualSpecifier):

    _regex_str = (
        r"""
        (?P<operator>(~=|==|!=|<=|>=|<|>|===))
        (?P<version>
            (?:
                # The identity operators allow for an escape hatch that will
                # do an exact string match of the version you wish to install.
                # This will not be parsed by PEP 440 and we cannot determine
                # any semantic meaning from it. This operator is discouraged
                # but included entirely as an escape hatch.
                (?<====)  # Only match for the identity operator
                \s*
                [^\s]*    # We just match everything, except for whitespace
                          # since we are only testing for strict identity.
            )
            |
            (?:
                # The (non)equality operators allow for wild card and local
                # versions to be specified so we have to define these two
                # operators separately to enable that.
                (?<===|!=)            # Only match for equals and not equals

                \s*
                v?
                (?:[0-9]+!)?          # epoch
                [0-9]+(?:\.[0-9]+)*   # release
                (?:                   # pre release
                    [-_\.]?
                    (a|b|c|rc|alpha|beta|pre|preview)
                    [-_\.]?
                    [0-9]*
                )?
                (?:                   # post release
                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
                )?

                # You cannot use a wild card and a dev or local version
                # together so group them with a | and make them optional.
                (?:
                    (?:[-_\.]?dev[-_\.]?[0-9]*)?         # dev release
                    (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local
                    |
                    \.\*  # Wild card syntax of .*
                )?
            )
            |
            (?:
                # The compatible operator requires at least two digits in the
                # release segment.
                (?<=~=)               # Only match for the compatible operator

                \s*
                v?
                (?:[0-9]+!)?          # epoch
                [0-9]+(?:\.[0-9]+)+   # release  (We have a + instead of a *)
                (?:                   # pre release
                    [-_\.]?
                    (a|b|c|rc|alpha|beta|pre|preview)
                    [-_\.]?
                    [0-9]*
                )?
                (?:                                   # post release
                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
                )?
                (?:[-_\.]?dev[-_\.]?[0-9]*)?          # dev release
            )
            |
            (?:
                # All other operators only allow a sub set of what the
                # (non)equality operators do. Specifically they do not allow
                # local versions to be specified nor do they allow the prefix
                # matching wild cards.
                (?<!==|!=|~=)         # We have special cases for these
                                      # operators so we want to make sure they
                                      # don't match here.

                \s*
                v?
                (?:[0-9]+!)?          # epoch
                [0-9]+(?:\.[0-9]+)*   # release
                (?:                   # pre release
                    [-_\.]?
                    (a|b|c|rc|alpha|beta|pre|preview)
                    [-_\.]?
                    [0-9]*
                )?
                (?:                                   # post release
                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
                )?
                (?:[-_\.]?dev[-_\.]?[0-9]*)?          # dev release
            )
        )
        """
    )

    _regex = re.compile(
        r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE)

    _operators = {
        "~=": "compatible",
        "==": "equal",
        "!=": "not_equal",
        "<=": "less_than_equal",
        ">=": "greater_than_equal",
        "<": "less_than",
        ">": "greater_than",
        "===": "arbitrary",
    }

    @_require_version_compare
    def _compare_compatible(self, prospective, spec):
        # Compatible releases have an equivalent combination of >= and ==. That
        # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to
        # implement this in terms of the other specifiers instead of
        # implementing it ourselves. The only thing we need to do is construct
        # the other specifiers.

        # We want everything but the last item in the version, but we want to
        # ignore post and dev releases and we want to treat the pre-release as
        # it's own separate segment.
        prefix = ".".join(
            list(
                itertools.takewhile(
                    lambda x: (not x.startswith("post") and not
                               x.startswith("dev")),
                    _version_split(spec),
                )
            )[:-1]
        )

        # Add the prefix notation to the end of our string
        prefix += ".*"

        return (self._get_operator(">=")(prospective, spec) and
                self._get_operator("==")(prospective, prefix))

    @_require_version_compare
    def _compare_equal(self, prospective, spec):
        # We need special logic to handle prefix matching
        if spec.endswith(".*"):
            # In the case of prefix matching we want to ignore local segment.
            prospective = Version(prospective.public)
            # Split the spec out by dots, and pretend that there is an implicit
            # dot in between a release segment and a pre-release segment.
            spec = _version_split(spec[:-2])  # Remove the trailing .*

            # Split the prospective version out by dots, and pretend that there
            # is an implicit dot in between a release segment and a pre-release
            # segment.
            prospective = _version_split(str(prospective))

            # Shorten the prospective version to be the same length as the spec
            # so that we can determine if the specifier is a prefix of the
            # prospective version or not.
            prospective = prospective[:len(spec)]

            # Pad out our two sides with zeros so that they both equal the same
            # length.
            spec, prospective = _pad_version(spec, prospective)
        else:
            # Convert our spec string into a Version
            spec = Version(spec)

            # If the specifier does not have a local segment, then we want to
            # act as if the prospective version also does not have a local
            # segment.
            if not spec.local:
                prospective = Version(prospective.public)

        return prospective == spec

    @_require_version_compare
    def _compare_not_equal(self, prospective, spec):
        return not self._compare_equal(prospective, spec)

    @_require_version_compare
    def _compare_less_than_equal(self, prospective, spec):
        return prospective <= Version(spec)

    @_require_version_compare
    def _compare_greater_than_equal(self, prospective, spec):
        return prospective >= Version(spec)

    @_require_version_compare
    def _compare_less_than(self, prospective, spec):
        # Convert our spec to a Version instance, since we'll want to work with
        # it as a version.
        spec = Version(spec)

        # Check to see if the prospective version is less than the spec
        # version. If it's not we can short circuit and just return False now
        # instead of doing extra unneeded work.
        if not prospective < spec:
            return False

        # This special case is here so that, unless the specifier itself
        # includes is a pre-release version, that we do not accept pre-release
        # versions for the version mentioned in the specifier (e.g. <3.1 should
        # not match 3.1.dev0, but should match 3.0.dev0).
        if not spec.is_prerelease and prospective.is_prerelease:
            if Version(prospective.base_version) == Version(spec.base_version):
                return False

        # If we've gotten to here, it means that prospective version is both
        # less than the spec version *and* it's not a pre-release of the same
        # version in the spec.
        return True

    @_require_version_compare
    def _compare_greater_than(self, prospective, spec):
        # Convert our spec to a Version instance, since we'll want to work with
        # it as a version.
        spec = Version(spec)

        # Check to see if the prospective version is greater than the spec
        # version. If it's not we can short circuit and just return False now
        # instead of doing extra unneeded work.
        if not prospective > spec:
            return False

        # This special case is here so that, unless the specifier itself
        # includes is a post-release version, that we do not accept
        # post-release versions for the version mentioned in the specifier
        # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0).
        if not spec.is_postrelease and prospective.is_postrelease:
            if Version(prospective.base_version) == Version(spec.base_version):
                return False

        # Ensure that we do not allow a local version of the version mentioned
        # in the specifier, which is techincally greater than, to match.
        if prospective.local is not None:
            if Version(prospective.base_version) == Version(spec.base_version):
                return False

        # If we've gotten to here, it means that prospective version is both
        # greater than the spec version *and* it's not a pre-release of the
        # same version in the spec.
        return True

    def _compare_arbitrary(self, prospective, spec):
        return str(prospective).lower() == str(spec).lower()

    @property
    def prereleases(self):
        # If there is an explicit prereleases set for this, then we'll just
        # blindly use that.
        if self._prereleases is not None:
            return self._prereleases

        # Look at all of our specifiers and determine if they are inclusive
        # operators, and if they are if they are including an explicit
        # prerelease.
        operator, version = self._spec
        if operator in ["==", ">=", "<=", "~=", "==="]:
            # The == specifier can include a trailing .*, if it does we
            # want to remove before parsing.
            if operator == "==" and version.endswith(".*"):
                version = version[:-2]

            # Parse the version, and if it is a pre-release than this
            # specifier allows pre-releases.
            if parse(version).is_prerelease:
                return True

        return False

    @prereleases.setter
    def prereleases(self, value):
        self._prereleases = value


_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$")


def _version_split(version):
    result = []
    for item in version.split("."):
        match = _prefix_regex.search(item)
        if match:
            result.extend(match.groups())
        else:
            result.append(item)
    return result


def _pad_version(left, right):
    left_split, right_split = [], []

    # Get the release segment of our versions
    left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left)))
    right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right)))

    # Get the rest of our versions
    left_split.append(left[len(left_split[0]):])
    right_split.append(right[len(right_split[0]):])

    # Insert our padding
    left_split.insert(
        1,
        ["0"] * max(0, len(right_split[0]) - len(left_split[0])),
    )
    right_split.insert(
        1,
        ["0"] * max(0, len(left_split[0]) - len(right_split[0])),
    )

    return (
        list(itertools.chain(*left_split)),
        list(itertools.chain(*right_split)),
    )


class SpecifierSet(BaseSpecifier):

    def __init__(self, specifiers="", prereleases=None):
        # Split on , to break each indidivual specifier into it's own item, and
        # strip each item to remove leading/trailing whitespace.
        specifiers = [s.strip() for s in specifiers.split(",") if s.strip()]

        # Parsed each individual specifier, attempting first to make it a
        # Specifier and falling back to a LegacySpecifier.
        parsed = set()
        for specifier in specifiers:
            try:
                parsed.add(Specifier(specifier))
            except InvalidSpecifier:
                parsed.add(LegacySpecifier(specifier))

        # Turn our parsed specifiers into a frozen set and save them for later.
        self._specs = frozenset(parsed)

        # Store our prereleases value so we can use it later to determine if
        # we accept prereleases or not.
        self._prereleases = prereleases

    def __repr__(self):
        pre = (
            ", prereleases={0!r}".format(self.prereleases)
            if self._prereleases is not None
            else ""
        )

        return "<SpecifierSet({0!r}{1})>".format(str(self), pre)

    def __str__(self):
        return ",".join(sorted(str(s) for s in self._specs))

    def __hash__(self):
        return hash(self._specs)

    def __and__(self, other):
        if isinstance(other, string_types):
            other = SpecifierSet(other)
        elif not isinstance(other, SpecifierSet):
            return NotImplemented

        specifier = SpecifierSet()
        specifier._specs = frozenset(self._specs | other._specs)

        if self._prereleases is None and other._prereleases is not None:
            specifier._prereleases = other._prereleases
        elif self._prereleases is not None and other._prereleases is None:
            specifier._prereleases = self._prereleases
        elif self._prereleases == other._prereleases:
            specifier._prereleases = self._prereleases
        else:
            raise ValueError(
                "Cannot combine SpecifierSets with True and False prerelease "
                "overrides."
            )

        return specifier

    def __eq__(self, other):
        if isinstance(other, string_types):
            other = SpecifierSet(other)
        elif isinstance(other, _IndividualSpecifier):
            other = SpecifierSet(str(other))
        elif not isinstance(other, SpecifierSet):
            return NotImplemented

        return self._specs == other._specs

    def __ne__(self, other):
        if isinstance(other, string_types):
            other = SpecifierSet(other)
        elif isinstance(other, _IndividualSpecifier):
            other = SpecifierSet(str(other))
        elif not isinstance(other, SpecifierSet):
            return NotImplemented

        return self._specs != other._specs

    def __len__(self):
        return len(self._specs)

    def __iter__(self):
        return iter(self._specs)

    @property
    def prereleases(self):
        # If we have been given an explicit prerelease modifier, then we'll
        # pass that through here.
        if self._prereleases is not None:
            return self._prereleases

        # If we don't have any specifiers, and we don't have a forced value,
        # then we'll just return None since we don't know if this should have
        # pre-releases or not.
        if not self._specs:
            return None

        # Otherwise we'll see if any of the given specifiers accept
        # prereleases, if any of them do we'll return True, otherwise False.
        return any(s.prereleases for s in self._specs)

    @prereleases.setter
    def prereleases(self, value):
        self._prereleases = value

    def __contains__(self, item):
        return self.contains(item)

    def contains(self, item, prereleases=None):
        # Ensure that our item is a Version or LegacyVersion instance.
        if not isinstance(item, (LegacyVersion, Version)):
            item = parse(item)

        # Determine if we're forcing a prerelease or not, if we're not forcing
        # one for this particular filter call, then we'll use whatever the
        # SpecifierSet thinks for whether or not we should support prereleases.
        if prereleases is None:
            prereleases = self.prereleases

        # We can determine if we're going to allow pre-releases by looking to
        # see if any of the underlying items supports them. If none of them do
        # and this item is a pre-release then we do not allow it and we can
        # short circuit that here.
        # Note: This means that 1.0.dev1 would not be contained in something
        #       like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0
        if not prereleases and item.is_prerelease:
            return False

        # We simply dispatch to the underlying specs here to make sure that the
        # given version is contained within all of them.
        # Note: This use of all() here means that an empty set of specifiers
        #       will always return True, this is an explicit design decision.
        return all(
            s.contains(item, prereleases=prereleases)
            for s in self._specs
        )

    def filter(self, iterable, prereleases=None):
        # Determine if we're forcing a prerelease or not, if we're not forcing
        # one for this particular filter call, then we'll use whatever the
        # SpecifierSet thinks for whether or not we should support prereleases.
        if prereleases is None:
            prereleases = self.prereleases

        # If we have any specifiers, then we want to wrap our iterable in the
        # filter method for each one, this will act as a logical AND amongst
        # each specifier.
        if self._specs:
            for spec in self._specs:
                iterable = spec.filter(iterable, prereleases=bool(prereleases))
            return iterable
        # If we do not have any specifiers, then we need to have a rough filter
        # which will filter out any pre-releases, unless there are no final
        # releases, and which will filter out LegacyVersion in general.
        else:
            filtered = []
            found_prereleases = []

            for item in iterable:
                # Ensure that we some kind of Version class for this item.
                if not isinstance(item, (LegacyVersion, Version)):
                    parsed_version = parse(item)
                else:
                    parsed_version = item

                # Filter out any item which is parsed as a LegacyVersion
                if isinstance(parsed_version, LegacyVersion):
                    continue

                # Store any item which is a pre-release for later unless we've
                # already found a final version or we are accepting prereleases
                if parsed_version.is_prerelease and not prereleases:
                    if not filtered:
                        found_prereleases.append(item)
                else:
                    filtered.append(item)

            # If we've found no items except for pre-releases, then we'll go
            # ahead and use the pre-releases
            if not filtered and found_prereleases and prereleases is None:
                return found_prereleases

            return filtered
_vendor/packaging/version.pyc000064400000034152151733474000012337 0ustar00�
�fc@`snddlmZmZmZddlZddlZddlZddlmZddddd	gZ	ej
d
ddd
dddg�Zd�Zde
fd��YZdefd��YZdefd��YZejdej�Zidd6dd6dd6dd6dd
6Zd�Zd�ZdZdefd ��YZd!�Zejd"�Zd#�Zd$�ZdS(%i(tabsolute_importtdivisiontprint_functionNi(tInfinitytparsetVersiont
LegacyVersiontInvalidVersiontVERSION_PATTERNt_VersiontepochtreleasetdevtpretposttlocalcC`s-yt|�SWntk
r(t|�SXdS(s�
    Parse the given version string and return either a :class:`Version` object
    or a :class:`LegacyVersion` object depending on if the given version is
    a valid PEP 440 version or a legacy version.
    N(RRR(tversion((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyRs
cB`seZdZRS(sF
    An invalid version was found, users should refer to PEP 440.
    (t__name__t
__module__t__doc__(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR$st_BaseVersioncB`sPeZd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z	RS(cC`s
t|j�S(N(thasht_key(tself((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__hash__,scC`s|j|d��S(NcS`s
||kS(N((tsto((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt<lambda>0t(t_compare(Rtother((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__lt__/scC`s|j|d��S(NcS`s
||kS(N((RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR3R(R(RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__le__2scC`s|j|d��S(NcS`s
||kS(N((RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR6R(R(RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__eq__5scC`s|j|d��S(NcS`s
||kS(N((RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR9R(R(RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__ge__8scC`s|j|d��S(NcS`s
||kS(N((RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR<R(R(RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__gt__;scC`s|j|d��S(NcS`s
||kS(N((RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR?R(R(RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__ne__>scC`s&t|t�stS||j|j�S(N(t
isinstanceRtNotImplementedR(RRtmethod((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyRAs(
RRRRR R!R"R#R$R(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR*s							cB`sneZd�Zd�Zd�Zed��Zed��Zed��Zed��Z	ed��Z
RS(cC`s%t|�|_t|j�|_dS(N(tstrt_versiont_legacy_cmpkeyR(RR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__init__JscC`s|jS(N(R)(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__str__NscC`sdjtt|���S(Ns<LegacyVersion({0})>(tformattreprR((R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt__repr__QscC`s|jS(N(R)(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pytpublicTscC`s|jS(N(R)(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pytbase_versionXscC`sdS(N(tNone(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR\scC`stS(N(tFalse(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt
is_prerelease`scC`stS(N(R3(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pytis_postreleaseds(RRR+R,R/tpropertyR0R1RR4R5(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyRHs			s(\d+ | [a-z]+ | \.| -)tctpreviewsfinal-t-trct@cc`sxxltj|�D][}tj||�}|s|dkrAqn|d dkrb|jd�Vqd|VqWdVdS(Nt.it
0123456789it*s*final(t_legacy_version_component_retsplitt_legacy_version_replacement_maptgettzfill(Rtpart((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt_parse_version_partsrs
cC`s�d}g}x�t|j��D]�}|jd�r�|dkrjx'|rf|ddkrf|j�qCWnx'|r�|ddkr�|j�qmWn|j|�qWt|�}||fS(Ni����R>s*finals*final-t00000000(REtlowert
startswithtpoptappendttuple(RR
tpartsRD((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR*�ss�
    v?
    (?:
        (?:(?P<epoch>[0-9]+)!)?                           # epoch
        (?P<release>[0-9]+(?:\.[0-9]+)*)                  # release segment
        (?P<pre>                                          # pre-release
            [-_\.]?
            (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview))
            [-_\.]?
            (?P<pre_n>[0-9]+)?
        )?
        (?P<post>                                         # post release
            (?:-(?P<post_n1>[0-9]+))
            |
            (?:
                [-_\.]?
                (?P<post_l>post|rev|r)
                [-_\.]?
                (?P<post_n2>[0-9]+)?
            )
        )?
        (?P<dev>                                          # dev release
            [-_\.]?
            (?P<dev_l>dev)
            [-_\.]?
            (?P<dev_n>[0-9]+)?
        )?
    )
    (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))?       # local version
cB`s�eZejdedejejB�Zd�Zd�Z	d�Z
ed��Zed��Z
ed��Zed��Zed	��ZRS(
s^\s*s\s*$cC`s[|jj|�}|s0tdj|���ntd|jd�rZt|jd��nddtd�|jd�jd�D��dt	|jd�|jd	��d
t	|jd�|jd�p�|jd
��dt	|jd�|jd��dt
|jd���|_t|jj
|jj|jj|jj|jj|jj�|_dS(NsInvalid version: '{0}'R
iRcs`s|]}t|�VqdS(N(tint(t.0ti((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pys	<genexpr>�sR<R
tpre_ltpre_nRtpost_ltpost_n1tpost_n2Rtdev_ltdev_nR(t_regextsearchRR-R	tgroupRMRKR@t_parse_letter_versiont_parse_local_versionR)t_cmpkeyR
RR
RRRR(RRtmatch((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR+�s.*(!					cC`sdjtt|���S(Ns<Version({0})>(R-R.R((R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR/�scC`sSg}|jjdkr7|jdj|jj��n|jdjd�|jjD���|jjdk	r�|jdjd�|jjD���n|jjdk	r�|jdj|jjd��n|jj	dk	r|jd	j|jj	d��n|jj
dk	rF|jd
jdjd�|jj
D����ndj|�S(Nis{0}!R<cs`s|]}t|�VqdS(N(R((RNtx((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pys	<genexpr>�sRcs`s|]}t|�VqdS(N(R((RNR^((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pys	<genexpr>�ss.post{0}is.dev{0}s+{0}cs`s|]}t|�VqdS(N(R((RNR^((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pys	<genexpr>s(R)R
RJR-tjoinRR
R2RRR(RRL((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR,�s&)##,cC`st|�jdd�dS(Nt+ii(R(R@(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR0
scC`sjg}|jjdkr7|jdj|jj��n|jdjd�|jjD���dj|�S(Nis{0}!R<cs`s|]}t|�VqdS(N(R((RNR^((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pys	<genexpr>sR(R)R
RJR-R_R(RRL((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR1s
&cC`s0t|�}d|kr,|jdd�dSdS(NR`i(R(R@(Rtversion_string((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyRscC`st|jjp|jj�S(N(tboolR)RR
(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR4!scC`st|jj�S(N(RbR)R(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR5%s(RRtretcompileRtVERBOSEt
IGNORECASERWR+R/R,R6R0R1RR4R5(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR�s	#		
cC`s�|r�|dkrd}n|j�}|dkr<d}n?|dkrQd}n*|d
krfd	}n|dkr{d}n|t|�fS|r�|r�d}|t|�fSdS(NitalphatatbetatbR7R
R8R:trevtrR(R7R
R8(RkRl(R2RGRM(tlettertnumber((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyRZ*s 					
s[\._-]cC`s-|dk	r)td�tj|�D��SdS(sR
    Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve").
    cs`s3|])}|j�s!|j�n	t|�VqdS(N(tisdigitRGRM(RNRD((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pys	<genexpr>RsN(R2RKt_local_version_seperatorsR@(R((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR[LscC`s�ttttjd�t|�����}|dkr[|dkr[|dk	r[t}n|dkrpt}n|dkr�t}n|dkr�t}n|dkr�t}ntd�|D��}||||||fS(NcS`s
|dkS(Ni((R^((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR`Rcs`s7|]-}t|t�r$|dfn
t|fVqdS(RN(R%RMR(RNRO((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pys	<genexpr>�s(RKtreversedtlistt	itertoolst	dropwhileR2R(R
RR
RRR((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyR\Ws&	$
	
	
	
(t
__future__RRRtcollectionsRsRct_structuresRt__all__t
namedtupleR	Rt
ValueErrorRtobjectRRRdReR?RARER*RRRZRpR[R\(((sH/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/version.pyt<module>s0	!&		9k		_vendor/packaging/__about__.pyc000064400000001425151733474000012555 0ustar00�
�fc@`srddlmZmZmZdddddddd	gZd
ZdZdZd
ZdZ	dZ
dZde	ZdS(i(tabsolute_importtdivisiontprint_functiont	__title__t__summary__t__uri__t__version__t
__author__t	__email__t__license__t
__copyright__t	packagings"Core utilities for Python packagess!https://github.com/pypa/packagings16.8s)Donald Stufft and individual contributorssdonald@stufft.ios"BSD or Apache License, Version 2.0sCopyright 2014-2016 %sN(
t
__future__RRRt__all__RRRRRRR	R
(((sJ/usr/lib/python2.7/site-packages/setuptools/_vendor/packaging/__about__.pyt<module>s_vendor/six.py000064400000072622151733474000007372 0ustar00"""Utilities for writing code that runs on Python 2 and 3"""

# Copyright (c) 2010-2015 Benjamin Peterson
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.

from __future__ import absolute_import

import functools
import itertools
import operator
import sys
import types

__author__ = "Benjamin Peterson <benjamin@python.org>"
__version__ = "1.10.0"


# Useful for very coarse version differentiation.
PY2 = sys.version_info[0] == 2
PY3 = sys.version_info[0] == 3
PY34 = sys.version_info[0:2] >= (3, 4)

if PY3:
    string_types = str,
    integer_types = int,
    class_types = type,
    text_type = str
    binary_type = bytes

    MAXSIZE = sys.maxsize
else:
    string_types = basestring,
    integer_types = (int, long)
    class_types = (type, types.ClassType)
    text_type = unicode
    binary_type = str

    if sys.platform.startswith("java"):
        # Jython always uses 32 bits.
        MAXSIZE = int((1 << 31) - 1)
    else:
        # It's possible to have sizeof(long) != sizeof(Py_ssize_t).
        class X(object):

            def __len__(self):
                return 1 << 31
        try:
            len(X())
        except OverflowError:
            # 32-bit
            MAXSIZE = int((1 << 31) - 1)
        else:
            # 64-bit
            MAXSIZE = int((1 << 63) - 1)
        del X


def _add_doc(func, doc):
    """Add documentation to a function."""
    func.__doc__ = doc


def _import_module(name):
    """Import module, returning the module after the last dot."""
    __import__(name)
    return sys.modules[name]


class _LazyDescr(object):

    def __init__(self, name):
        self.name = name

    def __get__(self, obj, tp):
        result = self._resolve()
        setattr(obj, self.name, result)  # Invokes __set__.
        try:
            # This is a bit ugly, but it avoids running this again by
            # removing this descriptor.
            delattr(obj.__class__, self.name)
        except AttributeError:
            pass
        return result


class MovedModule(_LazyDescr):

    def __init__(self, name, old, new=None):
        super(MovedModule, self).__init__(name)
        if PY3:
            if new is None:
                new = name
            self.mod = new
        else:
            self.mod = old

    def _resolve(self):
        return _import_module(self.mod)

    def __getattr__(self, attr):
        _module = self._resolve()
        value = getattr(_module, attr)
        setattr(self, attr, value)
        return value


class _LazyModule(types.ModuleType):

    def __init__(self, name):
        super(_LazyModule, self).__init__(name)
        self.__doc__ = self.__class__.__doc__

    def __dir__(self):
        attrs = ["__doc__", "__name__"]
        attrs += [attr.name for attr in self._moved_attributes]
        return attrs

    # Subclasses should override this
    _moved_attributes = []


class MovedAttribute(_LazyDescr):

    def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None):
        super(MovedAttribute, self).__init__(name)
        if PY3:
            if new_mod is None:
                new_mod = name
            self.mod = new_mod
            if new_attr is None:
                if old_attr is None:
                    new_attr = name
                else:
                    new_attr = old_attr
            self.attr = new_attr
        else:
            self.mod = old_mod
            if old_attr is None:
                old_attr = name
            self.attr = old_attr

    def _resolve(self):
        module = _import_module(self.mod)
        return getattr(module, self.attr)


class _SixMetaPathImporter(object):

    """
    A meta path importer to import six.moves and its submodules.

    This class implements a PEP302 finder and loader. It should be compatible
    with Python 2.5 and all existing versions of Python3
    """

    def __init__(self, six_module_name):
        self.name = six_module_name
        self.known_modules = {}

    def _add_module(self, mod, *fullnames):
        for fullname in fullnames:
            self.known_modules[self.name + "." + fullname] = mod

    def _get_module(self, fullname):
        return self.known_modules[self.name + "." + fullname]

    def find_module(self, fullname, path=None):
        if fullname in self.known_modules:
            return self
        return None

    def __get_module(self, fullname):
        try:
            return self.known_modules[fullname]
        except KeyError:
            raise ImportError("This loader does not know module " + fullname)

    def load_module(self, fullname):
        try:
            # in case of a reload
            return sys.modules[fullname]
        except KeyError:
            pass
        mod = self.__get_module(fullname)
        if isinstance(mod, MovedModule):
            mod = mod._resolve()
        else:
            mod.__loader__ = self
        sys.modules[fullname] = mod
        return mod

    def is_package(self, fullname):
        """
        Return true, if the named module is a package.

        We need this method to get correct spec objects with
        Python 3.4 (see PEP451)
        """
        return hasattr(self.__get_module(fullname), "__path__")

    def get_code(self, fullname):
        """Return None

        Required, if is_package is implemented"""
        self.__get_module(fullname)  # eventually raises ImportError
        return None
    get_source = get_code  # same as get_code

_importer = _SixMetaPathImporter(__name__)


class _MovedItems(_LazyModule):

    """Lazy loading of moved objects"""
    __path__ = []  # mark as package


_moved_attributes = [
    MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"),
    MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"),
    MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"),
    MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"),
    MovedAttribute("intern", "__builtin__", "sys"),
    MovedAttribute("map", "itertools", "builtins", "imap", "map"),
    MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"),
    MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"),
    MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"),
    MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"),
    MovedAttribute("reduce", "__builtin__", "functools"),
    MovedAttribute("shlex_quote", "pipes", "shlex", "quote"),
    MovedAttribute("StringIO", "StringIO", "io"),
    MovedAttribute("UserDict", "UserDict", "collections"),
    MovedAttribute("UserList", "UserList", "collections"),
    MovedAttribute("UserString", "UserString", "collections"),
    MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"),
    MovedAttribute("zip", "itertools", "builtins", "izip", "zip"),
    MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"),
    MovedModule("builtins", "__builtin__"),
    MovedModule("configparser", "ConfigParser"),
    MovedModule("copyreg", "copy_reg"),
    MovedModule("dbm_gnu", "gdbm", "dbm.gnu"),
    MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"),
    MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
    MovedModule("http_cookies", "Cookie", "http.cookies"),
    MovedModule("html_entities", "htmlentitydefs", "html.entities"),
    MovedModule("html_parser", "HTMLParser", "html.parser"),
    MovedModule("http_client", "httplib", "http.client"),
    MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"),
    MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"),
    MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"),
    MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"),
    MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"),
    MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"),
    MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"),
    MovedModule("cPickle", "cPickle", "pickle"),
    MovedModule("queue", "Queue"),
    MovedModule("reprlib", "repr"),
    MovedModule("socketserver", "SocketServer"),
    MovedModule("_thread", "thread", "_thread"),
    MovedModule("tkinter", "Tkinter"),
    MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"),
    MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"),
    MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"),
    MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"),
    MovedModule("tkinter_tix", "Tix", "tkinter.tix"),
    MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"),
    MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"),
    MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"),
    MovedModule("tkinter_colorchooser", "tkColorChooser",
                "tkinter.colorchooser"),
    MovedModule("tkinter_commondialog", "tkCommonDialog",
                "tkinter.commondialog"),
    MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"),
    MovedModule("tkinter_font", "tkFont", "tkinter.font"),
    MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"),
    MovedModule("tkinter_tksimpledialog", "tkSimpleDialog",
                "tkinter.simpledialog"),
    MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"),
    MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"),
    MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"),
    MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"),
    MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"),
    MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"),
]
# Add windows specific modules.
if sys.platform == "win32":
    _moved_attributes += [
        MovedModule("winreg", "_winreg"),
    ]

for attr in _moved_attributes:
    setattr(_MovedItems, attr.name, attr)
    if isinstance(attr, MovedModule):
        _importer._add_module(attr, "moves." + attr.name)
del attr

_MovedItems._moved_attributes = _moved_attributes

moves = _MovedItems(__name__ + ".moves")
_importer._add_module(moves, "moves")


class Module_six_moves_urllib_parse(_LazyModule):

    """Lazy loading of moved objects in six.moves.urllib_parse"""


_urllib_parse_moved_attributes = [
    MovedAttribute("ParseResult", "urlparse", "urllib.parse"),
    MovedAttribute("SplitResult", "urlparse", "urllib.parse"),
    MovedAttribute("parse_qs", "urlparse", "urllib.parse"),
    MovedAttribute("parse_qsl", "urlparse", "urllib.parse"),
    MovedAttribute("urldefrag", "urlparse", "urllib.parse"),
    MovedAttribute("urljoin", "urlparse", "urllib.parse"),
    MovedAttribute("urlparse", "urlparse", "urllib.parse"),
    MovedAttribute("urlsplit", "urlparse", "urllib.parse"),
    MovedAttribute("urlunparse", "urlparse", "urllib.parse"),
    MovedAttribute("urlunsplit", "urlparse", "urllib.parse"),
    MovedAttribute("quote", "urllib", "urllib.parse"),
    MovedAttribute("quote_plus", "urllib", "urllib.parse"),
    MovedAttribute("unquote", "urllib", "urllib.parse"),
    MovedAttribute("unquote_plus", "urllib", "urllib.parse"),
    MovedAttribute("urlencode", "urllib", "urllib.parse"),
    MovedAttribute("splitquery", "urllib", "urllib.parse"),
    MovedAttribute("splittag", "urllib", "urllib.parse"),
    MovedAttribute("splituser", "urllib", "urllib.parse"),
    MovedAttribute("uses_fragment", "urlparse", "urllib.parse"),
    MovedAttribute("uses_netloc", "urlparse", "urllib.parse"),
    MovedAttribute("uses_params", "urlparse", "urllib.parse"),
    MovedAttribute("uses_query", "urlparse", "urllib.parse"),
    MovedAttribute("uses_relative", "urlparse", "urllib.parse"),
]
for attr in _urllib_parse_moved_attributes:
    setattr(Module_six_moves_urllib_parse, attr.name, attr)
del attr

Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes

_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"),
                      "moves.urllib_parse", "moves.urllib.parse")


class Module_six_moves_urllib_error(_LazyModule):

    """Lazy loading of moved objects in six.moves.urllib_error"""


_urllib_error_moved_attributes = [
    MovedAttribute("URLError", "urllib2", "urllib.error"),
    MovedAttribute("HTTPError", "urllib2", "urllib.error"),
    MovedAttribute("ContentTooShortError", "urllib", "urllib.error"),
]
for attr in _urllib_error_moved_attributes:
    setattr(Module_six_moves_urllib_error, attr.name, attr)
del attr

Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes

_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"),
                      "moves.urllib_error", "moves.urllib.error")


class Module_six_moves_urllib_request(_LazyModule):

    """Lazy loading of moved objects in six.moves.urllib_request"""


_urllib_request_moved_attributes = [
    MovedAttribute("urlopen", "urllib2", "urllib.request"),
    MovedAttribute("install_opener", "urllib2", "urllib.request"),
    MovedAttribute("build_opener", "urllib2", "urllib.request"),
    MovedAttribute("pathname2url", "urllib", "urllib.request"),
    MovedAttribute("url2pathname", "urllib", "urllib.request"),
    MovedAttribute("getproxies", "urllib", "urllib.request"),
    MovedAttribute("Request", "urllib2", "urllib.request"),
    MovedAttribute("OpenerDirector", "urllib2", "urllib.request"),
    MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"),
    MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"),
    MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"),
    MovedAttribute("ProxyHandler", "urllib2", "urllib.request"),
    MovedAttribute("BaseHandler", "urllib2", "urllib.request"),
    MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"),
    MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"),
    MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"),
    MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"),
    MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"),
    MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"),
    MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"),
    MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"),
    MovedAttribute("HTTPHandler", "urllib2", "urllib.request"),
    MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"),
    MovedAttribute("FileHandler", "urllib2", "urllib.request"),
    MovedAttribute("FTPHandler", "urllib2", "urllib.request"),
    MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"),
    MovedAttribute("UnknownHandler", "urllib2", "urllib.request"),
    MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"),
    MovedAttribute("urlretrieve", "urllib", "urllib.request"),
    MovedAttribute("urlcleanup", "urllib", "urllib.request"),
    MovedAttribute("URLopener", "urllib", "urllib.request"),
    MovedAttribute("FancyURLopener", "urllib", "urllib.request"),
    MovedAttribute("proxy_bypass", "urllib", "urllib.request"),
]
for attr in _urllib_request_moved_attributes:
    setattr(Module_six_moves_urllib_request, attr.name, attr)
del attr

Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes

_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"),
                      "moves.urllib_request", "moves.urllib.request")


class Module_six_moves_urllib_response(_LazyModule):

    """Lazy loading of moved objects in six.moves.urllib_response"""


_urllib_response_moved_attributes = [
    MovedAttribute("addbase", "urllib", "urllib.response"),
    MovedAttribute("addclosehook", "urllib", "urllib.response"),
    MovedAttribute("addinfo", "urllib", "urllib.response"),
    MovedAttribute("addinfourl", "urllib", "urllib.response"),
]
for attr in _urllib_response_moved_attributes:
    setattr(Module_six_moves_urllib_response, attr.name, attr)
del attr

Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes

_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"),
                      "moves.urllib_response", "moves.urllib.response")


class Module_six_moves_urllib_robotparser(_LazyModule):

    """Lazy loading of moved objects in six.moves.urllib_robotparser"""


_urllib_robotparser_moved_attributes = [
    MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"),
]
for attr in _urllib_robotparser_moved_attributes:
    setattr(Module_six_moves_urllib_robotparser, attr.name, attr)
del attr

Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes

_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"),
                      "moves.urllib_robotparser", "moves.urllib.robotparser")


class Module_six_moves_urllib(types.ModuleType):

    """Create a six.moves.urllib namespace that resembles the Python 3 namespace"""
    __path__ = []  # mark as package
    parse = _importer._get_module("moves.urllib_parse")
    error = _importer._get_module("moves.urllib_error")
    request = _importer._get_module("moves.urllib_request")
    response = _importer._get_module("moves.urllib_response")
    robotparser = _importer._get_module("moves.urllib_robotparser")

    def __dir__(self):
        return ['parse', 'error', 'request', 'response', 'robotparser']

_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"),
                      "moves.urllib")


def add_move(move):
    """Add an item to six.moves."""
    setattr(_MovedItems, move.name, move)


def remove_move(name):
    """Remove item from six.moves."""
    try:
        delattr(_MovedItems, name)
    except AttributeError:
        try:
            del moves.__dict__[name]
        except KeyError:
            raise AttributeError("no such move, %r" % (name,))


if PY3:
    _meth_func = "__func__"
    _meth_self = "__self__"

    _func_closure = "__closure__"
    _func_code = "__code__"
    _func_defaults = "__defaults__"
    _func_globals = "__globals__"
else:
    _meth_func = "im_func"
    _meth_self = "im_self"

    _func_closure = "func_closure"
    _func_code = "func_code"
    _func_defaults = "func_defaults"
    _func_globals = "func_globals"


try:
    advance_iterator = next
except NameError:
    def advance_iterator(it):
        return it.next()
next = advance_iterator


try:
    callable = callable
except NameError:
    def callable(obj):
        return any("__call__" in klass.__dict__ for klass in type(obj).__mro__)


if PY3:
    def get_unbound_function(unbound):
        return unbound

    create_bound_method = types.MethodType

    def create_unbound_method(func, cls):
        return func

    Iterator = object
else:
    def get_unbound_function(unbound):
        return unbound.im_func

    def create_bound_method(func, obj):
        return types.MethodType(func, obj, obj.__class__)

    def create_unbound_method(func, cls):
        return types.MethodType(func, None, cls)

    class Iterator(object):

        def next(self):
            return type(self).__next__(self)

    callable = callable
_add_doc(get_unbound_function,
         """Get the function out of a possibly unbound function""")


get_method_function = operator.attrgetter(_meth_func)
get_method_self = operator.attrgetter(_meth_self)
get_function_closure = operator.attrgetter(_func_closure)
get_function_code = operator.attrgetter(_func_code)
get_function_defaults = operator.attrgetter(_func_defaults)
get_function_globals = operator.attrgetter(_func_globals)


if PY3:
    def iterkeys(d, **kw):
        return iter(d.keys(**kw))

    def itervalues(d, **kw):
        return iter(d.values(**kw))

    def iteritems(d, **kw):
        return iter(d.items(**kw))

    def iterlists(d, **kw):
        return iter(d.lists(**kw))

    viewkeys = operator.methodcaller("keys")

    viewvalues = operator.methodcaller("values")

    viewitems = operator.methodcaller("items")
else:
    def iterkeys(d, **kw):
        return d.iterkeys(**kw)

    def itervalues(d, **kw):
        return d.itervalues(**kw)

    def iteritems(d, **kw):
        return d.iteritems(**kw)

    def iterlists(d, **kw):
        return d.iterlists(**kw)

    viewkeys = operator.methodcaller("viewkeys")

    viewvalues = operator.methodcaller("viewvalues")

    viewitems = operator.methodcaller("viewitems")

_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.")
_add_doc(itervalues, "Return an iterator over the values of a dictionary.")
_add_doc(iteritems,
         "Return an iterator over the (key, value) pairs of a dictionary.")
_add_doc(iterlists,
         "Return an iterator over the (key, [values]) pairs of a dictionary.")


if PY3:
    def b(s):
        return s.encode("latin-1")

    def u(s):
        return s
    unichr = chr
    import struct
    int2byte = struct.Struct(">B").pack
    del struct
    byte2int = operator.itemgetter(0)
    indexbytes = operator.getitem
    iterbytes = iter
    import io
    StringIO = io.StringIO
    BytesIO = io.BytesIO
    _assertCountEqual = "assertCountEqual"
    if sys.version_info[1] <= 1:
        _assertRaisesRegex = "assertRaisesRegexp"
        _assertRegex = "assertRegexpMatches"
    else:
        _assertRaisesRegex = "assertRaisesRegex"
        _assertRegex = "assertRegex"
else:
    def b(s):
        return s
    # Workaround for standalone backslash

    def u(s):
        return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape")
    unichr = unichr
    int2byte = chr

    def byte2int(bs):
        return ord(bs[0])

    def indexbytes(buf, i):
        return ord(buf[i])
    iterbytes = functools.partial(itertools.imap, ord)
    import StringIO
    StringIO = BytesIO = StringIO.StringIO
    _assertCountEqual = "assertItemsEqual"
    _assertRaisesRegex = "assertRaisesRegexp"
    _assertRegex = "assertRegexpMatches"
_add_doc(b, """Byte literal""")
_add_doc(u, """Text literal""")


def assertCountEqual(self, *args, **kwargs):
    return getattr(self, _assertCountEqual)(*args, **kwargs)


def assertRaisesRegex(self, *args, **kwargs):
    return getattr(self, _assertRaisesRegex)(*args, **kwargs)


def assertRegex(self, *args, **kwargs):
    return getattr(self, _assertRegex)(*args, **kwargs)


if PY3:
    exec_ = getattr(moves.builtins, "exec")

    def reraise(tp, value, tb=None):
        if value is None:
            value = tp()
        if value.__traceback__ is not tb:
            raise value.with_traceback(tb)
        raise value

else:
    def exec_(_code_, _globs_=None, _locs_=None):
        """Execute code in a namespace."""
        if _globs_ is None:
            frame = sys._getframe(1)
            _globs_ = frame.f_globals
            if _locs_ is None:
                _locs_ = frame.f_locals
            del frame
        elif _locs_ is None:
            _locs_ = _globs_
        exec("""exec _code_ in _globs_, _locs_""")

    exec_("""def reraise(tp, value, tb=None):
    raise tp, value, tb
""")


if sys.version_info[:2] == (3, 2):
    exec_("""def raise_from(value, from_value):
    if from_value is None:
        raise value
    raise value from from_value
""")
elif sys.version_info[:2] > (3, 2):
    exec_("""def raise_from(value, from_value):
    raise value from from_value
""")
else:
    def raise_from(value, from_value):
        raise value


print_ = getattr(moves.builtins, "print", None)
if print_ is None:
    def print_(*args, **kwargs):
        """The new-style print function for Python 2.4 and 2.5."""
        fp = kwargs.pop("file", sys.stdout)
        if fp is None:
            return

        def write(data):
            if not isinstance(data, basestring):
                data = str(data)
            # If the file has an encoding, encode unicode with it.
            if (isinstance(fp, file) and
                    isinstance(data, unicode) and
                    fp.encoding is not None):
                errors = getattr(fp, "errors", None)
                if errors is None:
                    errors = "strict"
                data = data.encode(fp.encoding, errors)
            fp.write(data)
        want_unicode = False
        sep = kwargs.pop("sep", None)
        if sep is not None:
            if isinstance(sep, unicode):
                want_unicode = True
            elif not isinstance(sep, str):
                raise TypeError("sep must be None or a string")
        end = kwargs.pop("end", None)
        if end is not None:
            if isinstance(end, unicode):
                want_unicode = True
            elif not isinstance(end, str):
                raise TypeError("end must be None or a string")
        if kwargs:
            raise TypeError("invalid keyword arguments to print()")
        if not want_unicode:
            for arg in args:
                if isinstance(arg, unicode):
                    want_unicode = True
                    break
        if want_unicode:
            newline = unicode("\n")
            space = unicode(" ")
        else:
            newline = "\n"
            space = " "
        if sep is None:
            sep = space
        if end is None:
            end = newline
        for i, arg in enumerate(args):
            if i:
                write(sep)
            write(arg)
        write(end)
if sys.version_info[:2] < (3, 3):
    _print = print_

    def print_(*args, **kwargs):
        fp = kwargs.get("file", sys.stdout)
        flush = kwargs.pop("flush", False)
        _print(*args, **kwargs)
        if flush and fp is not None:
            fp.flush()

_add_doc(reraise, """Reraise an exception.""")

if sys.version_info[0:2] < (3, 4):
    def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS,
              updated=functools.WRAPPER_UPDATES):
        def wrapper(f):
            f = functools.wraps(wrapped, assigned, updated)(f)
            f.__wrapped__ = wrapped
            return f
        return wrapper
else:
    wraps = functools.wraps


def with_metaclass(meta, *bases):
    """Create a base class with a metaclass."""
    # This requires a bit of explanation: the basic idea is to make a dummy
    # metaclass for one level of class instantiation that replaces itself with
    # the actual metaclass.
    class metaclass(meta):

        def __new__(cls, name, this_bases, d):
            return meta(name, bases, d)
    return type.__new__(metaclass, 'temporary_class', (), {})


def add_metaclass(metaclass):
    """Class decorator for creating a class with a metaclass."""
    def wrapper(cls):
        orig_vars = cls.__dict__.copy()
        slots = orig_vars.get('__slots__')
        if slots is not None:
            if isinstance(slots, str):
                slots = [slots]
            for slots_var in slots:
                orig_vars.pop(slots_var)
        orig_vars.pop('__dict__', None)
        orig_vars.pop('__weakref__', None)
        return metaclass(cls.__name__, cls.__bases__, orig_vars)
    return wrapper


def python_2_unicode_compatible(klass):
    """
    A decorator that defines __unicode__ and __str__ methods under Python 2.
    Under Python 3 it does nothing.

    To support Python 2 and 3 with a single code base, define a __str__ method
    returning text and apply this decorator to the class.
    """
    if PY2:
        if '__str__' not in klass.__dict__:
            raise ValueError("@python_2_unicode_compatible cannot be applied "
                             "to %s because it doesn't define __str__()." %
                             klass.__name__)
        klass.__unicode__ = klass.__str__
        klass.__str__ = lambda self: self.__unicode__().encode('utf-8')
    return klass


# Complete the moves implementation.
# This code is at the end of this module to speed up module loading.
# Turn this module into a package.
__path__ = []  # required for PEP 302 and PEP 451
__package__ = __name__  # see PEP 366 @ReservedAssignment
if globals().get("__spec__") is not None:
    __spec__.submodule_search_locations = []  # PEP 451 @UndefinedVariable
# Remove other six meta path importers, since they cause problems. This can
# happen if six is removed from sys.modules and then reloaded. (Setuptools does
# this for some reason.)
if sys.meta_path:
    for i, importer in enumerate(sys.meta_path):
        # Here's some real nastiness: Another "instance" of the six module might
        # be floating around. Therefore, we can't use isinstance() to check for
        # the six meta path importer, since the other six instance will have
        # inserted an importer with different class.
        if (type(importer).__name__ == "_SixMetaPathImporter" and
                importer.name == __name__):
            del sys.meta_path[i]
            break
    del i, importer
# Finally, add the importer to the meta path import hook.
sys.meta_path.append(_importer)
_vendor/__init__.pyc000064400000000226151733474000010460 0ustar00�
�fc@sdS(N((((s?/usr/lib/python2.7/site-packages/setuptools/_vendor/__init__.pyt<module>t_vendor/six.pyc000064400000075557151733474000007547 0ustar00�
�fcA@@sKdZddlmZddlZddlZddlZddlZddlZdZdZ	ej
ddkZej
ddkZej
dd!dakZ
er�efZefZefZeZeZejZn�efZeefZeejfZeZeZejjd	�r$edc�ZnVdefd
��YZ ye!e ��Wne"k
rjede�Zn
Xedg�Z[ d�Z#d�Z$defd��YZ%de%fd��YZ&dej'fd��YZ(de%fd��YZ)defd��YZ*e*e+�Z,de(fd��YZ-e)dddd�e)d d!d"d#d �e)d$d!d!d%d$�e)d&d'd"d(d&�e)d)d'd*�e)d+d!d"d,d+�e)d-d.d.d/d-�e)d0d.d.d-d0�e)d1d'd"d2d1�e)d3d'e
r�d4nd5d6�e)d7d'd8�e)d9d:d;d<�e)ddd�e)d=d=d>�e)d?d?d>�e)d@d@d>�e)d2d'd"d2d1�e)dAd!d"dBdA�e)dCd!d!dDdC�e&d"d'�e&dEdF�e&dGdH�e&dIdJdK�e&dLdMdL�e&dNdOdP�e&dQdRdS�e&dTdUdV�e&dWdXdY�e&dZd[d\�e&d]d^d_�e&d`dadb�e&dcddde�e&dfdgdh�e&dididj�e&dkdkdj�e&dldldj�e&dmdmdn�e&dodp�e&dqdr�e&dsdt�e&dudvdu�e&dwdx�e&dydzd{�e&d|d}d~�e&dd�d��e&d�d�d��e&d�d�d��e&d�d�d��e&d�d�d��e&d�d�d��e&d�d�d��e&d�d�d��e&d�d�d~�e&d�d�d��e&d�d�d��e&d�d�d��e&d�e+d�d��e&d�e+d�d��e&d�e+d�e+d��e&d�d�d��e&d�d�d��e&d�d�d��g>Z.ejd�kr;e.e&d�d��g7Z.nxJe.D]BZ/e0e-e/j1e/�e2e/e&�rBe,j3e/d�e/j1�qBqBW[/e.e-_.e-e+d��Z4e,j3e4d��d�e(fd���YZ5e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d<d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��gZ6x!e6D]Z/e0e5e/j1e/�q0W[/e6e5_.e,j3e5e+d��d�d��d�e(fd���YZ7e)d�d�d��e)d�d�d��e)d�d�d��gZ8x!e8D]Z/e0e7e/j1e/�q�W[/e8e7_.e,j3e7e+d��d�d��d�e(fd���YZ9e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��e)d�d�d��g!Z:x!e:D]Z/e0e9e/j1e/�qW[/e:e9_.e,j3e9e+d��dd�de(fd��YZ;e)dd�d�e)dd�d�e)dd�d�e)dd�d�gZ<x!e<D]Z/e0e;e/j1e/�q�W[/e<e;_.e,j3e;e+d	�d
d�de(fd
��YZ=e)dd�d��gZ>x!e>D]Z/e0e=e/j1e/�q;W[/e>e=_.e,j3e=e+d�dd�dej'fd��YZ?e,j3e?e+d��d�d�Z@d�ZAer�dZBdZCdZDdZEdZFdZGn$dZBdZCdZDd ZEd!ZFd"ZGy
eHZIWneJk
r=
d#�ZInXeIZHy
eKZKWneJk
rj
d$�ZKnXer�
d%�ZLejMZNd&�ZOeZPn7d'�ZLd(�ZNd)�ZOd*efd+��YZPeKZKe#eLd,�ejQeB�ZRejQeC�ZSejQeD�ZTejQeE�ZUejQeF�ZVejQeG�ZWer�d-�ZXd.�ZYd/�ZZd0�Z[ej\d1�Z]ej\d2�Z^ej\d3�Z_nQd4�ZXd5�ZYd6�ZZd7�Z[ej\d8�Z]ej\d9�Z^ej\d:�Z_e#eXd;�e#eYd<�e#eZd=�e#e[d>�er�d?�Z`d@�ZaebZcddldZdedjedA�jfZg[dejhd�ZiejjZkelZmddlnZnenjoZoenjpZpdBZqej
d
d
kr�dCZrdDZsq4dEZrdFZsnpdG�Z`dH�ZaecZcebZgdI�ZidJ�Zkejtejuev�ZmddloZoeojoZoZpdKZqdCZrdDZse#e`dL�e#eadM�dN�ZwdO�ZxdP�Zyer�eze4j{dQ�Z|ddR�Z~ndddS�Z|e|dT�ej
d dhkr�e|dU�n)ej
d dikr�e|dV�n	dW�Zeze4j{dXd�Z�e�dkrdY�Z�nej
d djkrDe�Z�dZ�Z�ne#e~d[�ej
dd!dkkrej�ej�d\�Z�n	ej�Z�d]�Z�d^�Z�d_�Z�gZ�e+Z�e��j�d`�dk	r�ge�_�nej�r7xOe�ej��D]>\Z�Z�ee��j+dkr�e�j1e+kr�ej�e�=Pq�q�W[�[�nej�j�e,�dS(ls6Utilities for writing code that runs on Python 2 and 3i(tabsolute_importNs'Benjamin Peterson <benjamin@python.org>s1.10.0iiitjavaiitXcB@seZd�ZRS(cC@sdS(NiiI�((tself((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt__len__>s(t__name__t
__module__R(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR<si?cC@s
||_dS(s Add documentation to a function.N(t__doc__(tfunctdoc((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt_add_docKscC@st|�tj|S(s7Import module, returning the module after the last dot.(t
__import__tsystmodules(tname((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt_import_modulePs
t
_LazyDescrcB@seZd�Zd�ZRS(cC@s
||_dS(N(R(RR((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt__init__XscC@sN|j�}t||j|�yt|j|j�Wntk
rInX|S(N(t_resolvetsetattrRtdelattrt	__class__tAttributeError(Rtobjttptresult((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt__get__[s
(RRRR(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRVs	tMovedModulecB@s&eZdd�Zd�Zd�ZRS(cC@sJtt|�j|�tr=|dkr1|}n||_n	||_dS(N(tsuperRRtPY3tNonetmod(RRtoldtnew((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRis	cC@s
t|j�S(N(RR(R((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRrscC@s/|j�}t||�}t|||�|S(N(RtgetattrR(Rtattrt_moduletvalue((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt__getattr__usN(RRRRRR&(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRgs		t_LazyModulecB@s eZd�Zd�ZgZRS(cC@s)tt|�j|�|jj|_dS(N(RR'RRR(RR((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR~scC@s3ddg}|g|jD]}|j^q7}|S(NRR(t_moved_attributesR(RtattrsR#((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt__dir__�s#(RRRR*R((((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR'|s		tMovedAttributecB@s eZddd�Zd�ZRS(cC@s�tt|�j|�trp|dkr1|}n||_|dkrd|dkr[|}qd|}n||_n'||_|dkr�|}n||_dS(N(RR+RRRRR#(RRtold_modtnew_modtold_attrtnew_attr((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR�s						cC@st|j�}t||j�S(N(RRR"R#(Rtmodule((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR�sN(RRRRR(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR+�st_SixMetaPathImportercB@s_eZdZd�Zd�Zd�Zd	d�Zd�Zd�Z	d�Z
d�ZeZRS(
s�
    A meta path importer to import six.moves and its submodules.

    This class implements a PEP302 finder and loader. It should be compatible
    with Python 2.5 and all existing versions of Python3
    cC@s||_i|_dS(N(Rt
known_modules(Rtsix_module_name((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR�s	cG@s-x&|D]}||j|jd|<qWdS(Nt.(R2R(RRt	fullnamestfullname((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt_add_module�s
cC@s|j|jd|S(NR4(R2R(RR6((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt_get_module�scC@s||jkr|SdS(N(R2R(RR6tpath((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytfind_module�scC@s7y|j|SWn!tk
r2td|��nXdS(Ns!This loader does not know module (R2tKeyErrortImportError(RR6((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt__get_module�s
cC@sjytj|SWntk
r"nX|j|�}t|t�rP|j�}n	||_|tj|<|S(N(RR
R;t _SixMetaPathImporter__get_modulet
isinstanceRRt
__loader__(RR6R((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytload_module�s
	
cC@st|j|�d�S(s�
        Return true, if the named module is a package.

        We need this method to get correct spec objects with
        Python 3.4 (see PEP451)
        t__path__(thasattrR>(RR6((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt
is_package�scC@s|j|�dS(s;Return None

        Required, if is_package is implementedN(R>R(RR6((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytget_code�s
N(
RRRRR7R8RR:R>RARDREt
get_source(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR1�s								t_MovedItemscB@seZdZgZRS(sLazy loading of moved objects(RRRRB(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRG�st	cStringIOtiotStringIOtfiltert	itertoolstbuiltinstifiltertfilterfalsetifilterfalsetinputt__builtin__t	raw_inputtinternRtmaptimaptgetcwdtostgetcwdutgetcwdbtrangetxranget
reload_modulet	importlibtimptreloadtreducet	functoolstshlex_quotetpipestshlextquotetUserDicttcollectionstUserListt
UserStringtziptiziptzip_longesttizip_longesttconfigparsertConfigParsertcopyregtcopy_regtdbm_gnutgdbmsdbm.gnut
_dummy_threadtdummy_threadthttp_cookiejart	cookielibshttp.cookiejarthttp_cookiestCookieshttp.cookiest
html_entitiesthtmlentitydefss
html.entitiesthtml_parsert
HTMLParsershtml.parserthttp_clientthttplibshttp.clienttemail_mime_multipartsemail.MIMEMultipartsemail.mime.multiparttemail_mime_nonmultipartsemail.MIMENonMultipartsemail.mime.nonmultiparttemail_mime_textsemail.MIMETextsemail.mime.texttemail_mime_basesemail.MIMEBasesemail.mime.basetBaseHTTPServershttp.servert
CGIHTTPServertSimpleHTTPServertcPickletpickletqueuetQueuetreprlibtreprtsocketservertSocketServert_threadtthreadttkintertTkinterttkinter_dialogtDialogstkinter.dialogttkinter_filedialogt
FileDialogstkinter.filedialogttkinter_scrolledtexttScrolledTextstkinter.scrolledtextttkinter_simpledialogtSimpleDialogstkinter.simpledialogttkinter_tixtTixstkinter.tixttkinter_ttktttkstkinter.ttkttkinter_constantstTkconstantsstkinter.constantsttkinter_dndtTkdndstkinter.dndttkinter_colorchooserttkColorChooserstkinter.colorchooserttkinter_commondialogttkCommonDialogstkinter.commondialogttkinter_tkfiledialogttkFileDialogttkinter_fontttkFontstkinter.fontttkinter_messageboxttkMessageBoxstkinter.messageboxttkinter_tksimpledialogttkSimpleDialogturllib_parses.moves.urllib_parsesurllib.parseturllib_errors.moves.urllib_errorsurllib.errorturllibs
.moves.urllibturllib_robotparsertrobotparsersurllib.robotparsert
xmlrpc_clientt	xmlrpclibs
xmlrpc.clientt
xmlrpc_servertSimpleXMLRPCServers
xmlrpc.servertwin32twinregt_winregsmoves.s.movestmovestModule_six_moves_urllib_parsecB@seZdZRS(s7Lazy loading of moved objects in six.moves.urllib_parse(RRR(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR�@stParseResultturlparsetSplitResulttparse_qst	parse_qslt	urldefragturljointurlsplitt
urlunparset
urlunsplitt
quote_plustunquotetunquote_plust	urlencodet
splitquerytsplittagt	splitusert
uses_fragmenttuses_netloctuses_paramst
uses_queryt
uses_relativesmoves.urllib_parsesmoves.urllib.parsetModule_six_moves_urllib_errorcB@seZdZRS(s7Lazy loading of moved objects in six.moves.urllib_error(RRR(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR�hstURLErrorturllib2t	HTTPErrortContentTooShortErrors.moves.urllib.errorsmoves.urllib_errorsmoves.urllib.errortModule_six_moves_urllib_requestcB@seZdZRS(s9Lazy loading of moved objects in six.moves.urllib_request(RRR(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR�|sturlopensurllib.requesttinstall_openertbuild_openertpathname2urlturl2pathnamet
getproxiestRequesttOpenerDirectortHTTPDefaultErrorHandlertHTTPRedirectHandlertHTTPCookieProcessortProxyHandlertBaseHandlertHTTPPasswordMgrtHTTPPasswordMgrWithDefaultRealmtAbstractBasicAuthHandlertHTTPBasicAuthHandlertProxyBasicAuthHandlertAbstractDigestAuthHandlertHTTPDigestAuthHandlertProxyDigestAuthHandlertHTTPHandlertHTTPSHandlertFileHandlert
FTPHandlertCacheFTPHandlertUnknownHandlertHTTPErrorProcessorturlretrievet
urlcleanupt	URLopenertFancyURLopenertproxy_bypasss.moves.urllib.requestsmoves.urllib_requestsmoves.urllib.requestt Module_six_moves_urllib_responsecB@seZdZRS(s:Lazy loading of moved objects in six.moves.urllib_response(RRR(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR��staddbasesurllib.responsetaddclosehooktaddinfot
addinfourls.moves.urllib.responsesmoves.urllib_responsesmoves.urllib.responset#Module_six_moves_urllib_robotparsercB@seZdZRS(s=Lazy loading of moved objects in six.moves.urllib_robotparser(RRR(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR�stRobotFileParsers.moves.urllib.robotparsersmoves.urllib_robotparsersmoves.urllib.robotparsertModule_six_moves_urllibcB@sheZdZgZejd�Zejd�Zejd�Zejd�Z	ejd�Z
d�ZRS(sICreate a six.moves.urllib namespace that resembles the Python 3 namespacesmoves.urllib_parsesmoves.urllib_errorsmoves.urllib_requestsmoves.urllib_responsesmoves.urllib_robotparsercC@sdddddgS(NtparseterrortrequesttresponseR�((R((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR*�s(RRRRBt	_importerR8RRRRR�R*(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR�ssmoves.urllibcC@stt|j|�dS(sAdd an item to six.moves.N(RRGR(tmove((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytadd_move�scC@s^ytt|�WnFtk
rYytj|=WqZtk
rUtd|f��qZXnXdS(sRemove item from six.moves.sno such move, %rN(RRGRR�t__dict__R;(R((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytremove_move�s

t__func__t__self__t__closure__t__code__t__defaults__t__globals__tim_functim_selftfunc_closuret	func_codet
func_defaultstfunc_globalscC@s
|j�S(N(tnext(tit((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytadvance_iteratorscC@std�t|�jD��S(Ncs@s|]}d|jkVqdS(t__call__N(R
(t.0tklass((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pys	<genexpr>s(tanyttypet__mro__(R((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytcallablescC@s|S(N((tunbound((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytget_unbound_functionscC@s|S(N((Rtcls((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytcreate_unbound_methodscC@s|jS(N(R(R"((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR#"scC@stj|||j�S(N(ttypest
MethodTypeR(RR((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytcreate_bound_method%scC@stj|d|�S(N(R&R'R(RR$((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR%(stIteratorcB@seZd�ZRS(cC@st|�j|�S(N(Rt__next__(R((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR-s(RRR(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR)+ss3Get the function out of a possibly unbound functioncK@st|j|��S(N(titertkeys(tdtkw((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytiterkeys>scK@st|j|��S(N(R+tvalues(R-R.((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt
itervaluesAscK@st|j|��S(N(R+titems(R-R.((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt	iteritemsDscK@st|j|��S(N(R+tlists(R-R.((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt	iterlistsGsR,R0R2cK@s
|j|�S(N(R/(R-R.((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR/PscK@s
|j|�S(N(R1(R-R.((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR1SscK@s
|j|�S(N(R3(R-R.((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR3VscK@s
|j|�S(N(R5(R-R.((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR5Ystviewkeyst
viewvaluest	viewitemss1Return an iterator over the keys of a dictionary.s3Return an iterator over the values of a dictionary.s?Return an iterator over the (key, value) pairs of a dictionary.sBReturn an iterator over the (key, [values]) pairs of a dictionary.cC@s
|jd�S(Nslatin-1(tencode(ts((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytbkscC@s|S(N((R:((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytunss>BtassertCountEqualtassertRaisesRegexptassertRegexpMatchestassertRaisesRegextassertRegexcC@s|S(N((R:((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR;�scC@st|jdd�d�S(Ns\\s\\\\tunicode_escape(tunicodetreplace(R:((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR<�scC@st|d�S(Ni(tord(tbs((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytbyte2int�scC@st||�S(N(RE(tbufti((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt
indexbytes�stassertItemsEqualsByte literalsText literalcO@st|t�||�S(N(R"t_assertCountEqual(Rtargstkwargs((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR=�scO@st|t�||�S(N(R"t_assertRaisesRegex(RRMRN((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR@�scO@st|t�||�S(N(R"t_assertRegex(RRMRN((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRA�stexeccC@sC|dkr|�}n|j|k	r9|j|��n|�dS(N(Rt
__traceback__twith_traceback(RR%ttb((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytreraise�s
cB@sc|dkrBejd�}|j}|dkr<|j}n~n|dkrW|}nddUdS(sExecute code in a namespace.isexec _code_ in _globs_, _locs_N(RRt	_getframet	f_globalstf_locals(t_code_t_globs_t_locs_tframe((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytexec_�s		s9def reraise(tp, value, tb=None):
    raise tp, value, tb
srdef raise_from(value, from_value):
    if from_value is None:
        raise value
    raise value from from_value
sCdef raise_from(value, from_value):
    raise value from from_value
cC@s
|�dS(N((R%t
from_value((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt
raise_from�stprintc
@s�|jdtj���dkr%dS�fd�}t}|jdd�}|dk	r�t|t�rpt}q�t|t�s�t	d��q�n|jdd�}|dk	r�t|t�r�t}q�t|t�s�t	d��q�n|r�t	d��n|s0x*|D]}t|t�r
t}Pq
q
Wn|rQtd	�}td
�}nd	}d
}|dkrr|}n|dkr�|}nx7t
|�D])\}	}|	r�||�n||�q�W||�dS(s4The new-style print function for Python 2.4 and 2.5.tfileNc@s�t|t�st|�}nt�t�r�t|t�r��jdk	r�t�dd�}|dkrrd}n|j�j|�}n�j	|�dS(Nterrorststrict(
R?t
basestringtstrRaRCtencodingRR"R9twrite(tdataRb(tfp(s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRg�s	tsepssep must be None or a stringtendsend must be None or a strings$invalid keyword arguments to print()s
t (tpopRtstdoutRtFalseR?RCtTrueRet	TypeErrort	enumerate(
RMRNRgtwant_unicodeRjRktargtnewlinetspaceRI((Ris:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytprint_�sL		
		
cO@sW|jdtj�}|jdt�}t||�|rS|dk	rS|j�ndS(NRatflush(tgetRRnRmRot_printRRx(RMRNRiRx((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyRws

sReraise an exception.c@s���fd�}|S(Nc@s(tj����|�}�|_|S(N(Rbtwrapst__wrapped__(tf(tassignedtupdatedtwrapped(s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytwrappers	((R�R~RR�((R~RR�s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR{sc@s5d�f��fd��Y}tj|ddi�S(s%Create a base class with a metaclass.t	metaclassc@seZ��fd�ZRS(c@s�|�|�S(N((R$Rt
this_basesR-(tbasestmeta(s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt__new__'s(RRR�((R�R�(s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR�%sttemporary_class((RR�(R�R�R�((R�R�s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytwith_metaclass sc@s�fd�}|S(s6Class decorator for creating a class with a metaclass.c@s�|jj�}|jd�}|dk	rft|t�rE|g}nx|D]}|j|�qLWn|jdd�|jdd��|j|j|�S(Nt	__slots__R
t__weakref__(	R
tcopyRyRR?ReRmRt	__bases__(R$t	orig_varstslotst	slots_var(R�(s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyR�.s
((R�R�((R�s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt
add_metaclass,scC@sJtrFd|jkr+td|j��n|j|_d�|_n|S(s
    A decorator that defines __unicode__ and __str__ methods under Python 2.
    Under Python 3 it does nothing.

    To support Python 2 and 3 with a single code base, define a __str__ method
    returning text and apply this decorator to the class.
    t__str__sY@python_2_unicode_compatible cannot be applied to %s because it doesn't define __str__().cS@s|j�jd�S(Nsutf-8(t__unicode__R9(R((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt<lambda>Jt(tPY2R
t
ValueErrorRR�R�(R((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pytpython_2_unicode_compatible<st__spec__(iiI�i���I�i���ll����(ii(ii(ii(ii(�Rt
__future__RRbRLtoperatorRR&t
__author__t__version__tversion_infoR�RtPY34Retstring_typestintt
integer_typesRtclass_typest	text_typetbytestbinary_typetmaxsizetMAXSIZERdtlongt	ClassTypeRCtplatformt
startswithtobjectRtlent
OverflowErrorR
RRRt
ModuleTypeR'R+R1RRRGR(R#RRR?R7R�R�t_urllib_parse_moved_attributesR�t_urllib_error_moved_attributesR�t _urllib_request_moved_attributesR�t!_urllib_response_moved_attributesRt$_urllib_robotparser_moved_attributesRR	Rt
_meth_funct
_meth_selft
_func_closuret
_func_codet_func_defaultst
_func_globalsRRt	NameErrorR!R#R'R(R%R)t
attrgettertget_method_functiontget_method_selftget_function_closuretget_function_codetget_function_defaultstget_function_globalsR/R1R3R5tmethodcallerR6R7R8R;R<tchrtunichrtstructtStructtpacktint2bytet
itemgetterRGtgetitemRJR+t	iterbytesRIRJtBytesIORLRORPtpartialRVRER=R@RAR"RMR]RRUR_RwRztWRAPPER_ASSIGNMENTStWRAPPER_UPDATESR{R�R�R�RBt__package__tglobalsRyR�tsubmodule_search_locationst	meta_pathRrRItimportertappend(((s:/usr/lib/python2.7/site-packages/setuptools/_vendor/six.pyt<module>s�				
		>			
	
	

	

	

	

	

			





															

											


			

	5
					
	version.pyc000064400000000502151733474000006747 0ustar00�
�fc@s@ddlZyejd�jZWnek
r;dZnXdS(i����Nt
setuptoolstunknown(t
pkg_resourcestget_distributiontversiont__version__t	Exception(((s6/usr/lib/python2.7/site-packages/setuptools/version.pyt<module>s
py27compat.pyc000064400000002025151733474000007271 0ustar00�
�fc@stdZddlZddlmZd�Zejr@d�Znej�dkoXejZergend�Z	dS(s2
Compatibility Support for Python 2.7 and earlier
i����N(tsixcCs
|j|�S(sH
    Given an HTTPMessage, return all headers matching a given key.
    (tget_all(tmessagetkey((s9/usr/lib/python2.7/site-packages/setuptools/py27compat.pytget_all_headers
scCs
|j|�S(N(t
getheaders(RR((s9/usr/lib/python2.7/site-packages/setuptools/py27compat.pyRstLinuxcCs|S(N((tx((s9/usr/lib/python2.7/site-packages/setuptools/py27compat.pyt<lambda>t(
t__doc__tplatformtsetuptools.externRRtPY2tsystemtlinux_py2_asciitstrtrmtree_safe(((s9/usr/lib/python2.7/site-packages/setuptools/py27compat.pyt<module>s			lib2to3_ex.pyo000064400000005674151733474000007267 0ustar00�
�fc@sxdZddlmZddlmZddlmZmZddl	Z	defd��YZ
defd	��YZdS(
sy
Customized Mixin2to3 support:

 - adds support for converting doctests


This module raises an ImportError on Python 2.
i����(t	Mixin2to3(tlog(tRefactoringTooltget_fixers_from_packageNtDistutilsRefactoringToolcBs#eZd�Zd�Zd�ZRS(cOstj||�dS(N(Rterror(tselftmsgtargstkw((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyt	log_errorscGstj||�dS(N(Rtinfo(RRR((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pytlog_messagescGstj||�dS(N(Rtdebug(RRR((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyt	log_debugs(t__name__t
__module__R
RR(((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyRs		RcBs&eZed�Zd�Zd�ZRS(cCs�|jjtk	rdS|s dStjddj|��|j�|j�|r�tj	r�t
|j�}|j|dtdt�q�nt
j||�dS(NsFixing t twritet
doctests_only(tdistributiontuse_2to3tTrueRRtjoint_Mixin2to3__build_fixer_namest_Mixin2to3__exclude_fixerst
setuptoolstrun_2to3_on_doctestsRtfixer_namestrefactort
_Mixin2to3trun_2to3(Rtfilestdocteststr((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyRs

	cCs�|jr
dSg|_x'tjD]}|jjt|��q W|jjdk	r�x-|jjD]}|jjt|��q_WndS(N(RRtlib2to3_fixer_packagestextendRRtuse_2to3_fixerstNone(Rtp((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyt__build_fixer_names.s		cCsqt|dg�}|jjdk	r:|j|jj�nx0|D](}||jkrA|jj|�qAqAWdS(Ntexclude_fixers(tgetattrRtuse_2to3_exclude_fixersR&R$Rtremove(Rtexcluded_fixerst
fixer_name((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyt__exclude_fixers8s
(RRtFalseRRR(((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyRs	
(t__doc__tdistutils.utilRRt	distutilsRtlib2to3.refactorRRRR(((s9/usr/lib/python2.7/site-packages/setuptools/lib2to3_ex.pyt<module>sdist.py000064400000123022151733474000006065 0ustar00# -*- coding: utf-8 -*-
__all__ = ['Distribution']

import re
import os
import warnings
import numbers
import distutils.log
import distutils.core
import distutils.cmd
import distutils.dist
import itertools
from collections import defaultdict
from distutils.errors import (
    DistutilsOptionError, DistutilsPlatformError, DistutilsSetupError,
)
from distutils.util import rfc822_escape
from distutils.version import StrictVersion

from setuptools.extern import six
from setuptools.extern import packaging
from setuptools.extern.six.moves import map, filter, filterfalse

from setuptools.depends import Require
from setuptools import windows_support
from setuptools.monkey import get_unpatched
from setuptools.config import parse_configuration
import pkg_resources
from .py36compat import Distribution_parse_config_files

__import__('setuptools.extern.packaging.specifiers')
__import__('setuptools.extern.packaging.version')


def _get_unpatched(cls):
    warnings.warn("Do not call this function", DeprecationWarning)
    return get_unpatched(cls)


def get_metadata_version(dist_md):
    if dist_md.long_description_content_type or dist_md.provides_extras:
        return StrictVersion('2.1')
    elif (dist_md.maintainer is not None or
          dist_md.maintainer_email is not None or
          getattr(dist_md, 'python_requires', None) is not None):
        return StrictVersion('1.2')
    elif (dist_md.provides or dist_md.requires or dist_md.obsoletes or
            dist_md.classifiers or dist_md.download_url):
        return StrictVersion('1.1')

    return StrictVersion('1.0')


# Based on Python 3.5 version
def write_pkg_file(self, file):
    """Write the PKG-INFO format data to a file object.
    """
    version = get_metadata_version(self)

    file.write('Metadata-Version: %s\n' % version)
    file.write('Name: %s\n' % self.get_name())
    file.write('Version: %s\n' % self.get_version())
    file.write('Summary: %s\n' % self.get_description())
    file.write('Home-page: %s\n' % self.get_url())

    if version < StrictVersion('1.2'):
        file.write('Author: %s\n' % self.get_contact())
        file.write('Author-email: %s\n' % self.get_contact_email())
    else:
        optional_fields = (
            ('Author', 'author'),
            ('Author-email', 'author_email'),
            ('Maintainer', 'maintainer'),
            ('Maintainer-email', 'maintainer_email'),
        )

        for field, attr in optional_fields:
            attr_val = getattr(self, attr)
            if six.PY2:
                attr_val = self._encode_field(attr_val)

            if attr_val is not None:
                file.write('%s: %s\n' % (field, attr_val))

    file.write('License: %s\n' % self.get_license())
    if self.download_url:
        file.write('Download-URL: %s\n' % self.download_url)
    for project_url in self.project_urls.items():
        file.write('Project-URL: %s, %s\n' % project_url)

    long_desc = rfc822_escape(self.get_long_description())
    file.write('Description: %s\n' % long_desc)

    keywords = ','.join(self.get_keywords())
    if keywords:
        file.write('Keywords: %s\n' % keywords)

    if version >= StrictVersion('1.2'):
        for platform in self.get_platforms():
            file.write('Platform: %s\n' % platform)
    else:
        self._write_list(file, 'Platform', self.get_platforms())

    self._write_list(file, 'Classifier', self.get_classifiers())

    # PEP 314
    self._write_list(file, 'Requires', self.get_requires())
    self._write_list(file, 'Provides', self.get_provides())
    self._write_list(file, 'Obsoletes', self.get_obsoletes())

    # Setuptools specific for PEP 345
    if hasattr(self, 'python_requires'):
        file.write('Requires-Python: %s\n' % self.python_requires)

    # PEP 566
    if self.long_description_content_type:
        file.write(
            'Description-Content-Type: %s\n' %
            self.long_description_content_type
        )
    if self.provides_extras:
        for extra in self.provides_extras:
            file.write('Provides-Extra: %s\n' % extra)


# from Python 3.4
def write_pkg_info(self, base_dir):
    """Write the PKG-INFO file into the release tree.
    """
    with open(os.path.join(base_dir, 'PKG-INFO'), 'w',
              encoding='UTF-8') as pkg_info:
        self.write_pkg_file(pkg_info)


sequence = tuple, list


def check_importable(dist, attr, value):
    try:
        ep = pkg_resources.EntryPoint.parse('x=' + value)
        assert not ep.extras
    except (TypeError, ValueError, AttributeError, AssertionError):
        raise DistutilsSetupError(
            "%r must be importable 'module:attrs' string (got %r)"
            % (attr, value)
        )


def assert_string_list(dist, attr, value):
    """Verify that value is a string list or None"""
    try:
        assert ''.join(value) != value
    except (TypeError, ValueError, AttributeError, AssertionError):
        raise DistutilsSetupError(
            "%r must be a list of strings (got %r)" % (attr, value)
        )


def check_nsp(dist, attr, value):
    """Verify that namespace packages are valid"""
    ns_packages = value
    assert_string_list(dist, attr, ns_packages)
    for nsp in ns_packages:
        if not dist.has_contents_for(nsp):
            raise DistutilsSetupError(
                "Distribution contains no modules or packages for " +
                "namespace package %r" % nsp
            )
        parent, sep, child = nsp.rpartition('.')
        if parent and parent not in ns_packages:
            distutils.log.warn(
                "WARNING: %r is declared as a package namespace, but %r"
                " is not: please correct this in setup.py", nsp, parent
            )


def check_extras(dist, attr, value):
    """Verify that extras_require mapping is valid"""
    try:
        list(itertools.starmap(_check_extra, value.items()))
    except (TypeError, ValueError, AttributeError):
        raise DistutilsSetupError(
            "'extras_require' must be a dictionary whose values are "
            "strings or lists of strings containing valid project/version "
            "requirement specifiers."
        )


def _check_extra(extra, reqs):
    name, sep, marker = extra.partition(':')
    if marker and pkg_resources.invalid_marker(marker):
        raise DistutilsSetupError("Invalid environment marker: " + marker)
    list(pkg_resources.parse_requirements(reqs))


def assert_bool(dist, attr, value):
    """Verify that value is True, False, 0, or 1"""
    if bool(value) != value:
        tmpl = "{attr!r} must be a boolean value (got {value!r})"
        raise DistutilsSetupError(tmpl.format(attr=attr, value=value))


def check_requirements(dist, attr, value):
    """Verify that install_requires is a valid requirements list"""
    try:
        list(pkg_resources.parse_requirements(value))
        if isinstance(value, (dict, set)):
            raise TypeError("Unordered types are not allowed")
    except (TypeError, ValueError) as error:
        tmpl = (
            "{attr!r} must be a string or list of strings "
            "containing valid project/version requirement specifiers; {error}"
        )
        raise DistutilsSetupError(tmpl.format(attr=attr, error=error))


def check_specifier(dist, attr, value):
    """Verify that value is a valid version specifier"""
    try:
        packaging.specifiers.SpecifierSet(value)
    except packaging.specifiers.InvalidSpecifier as error:
        tmpl = (
            "{attr!r} must be a string "
            "containing valid version specifiers; {error}"
        )
        raise DistutilsSetupError(tmpl.format(attr=attr, error=error))


def check_entry_points(dist, attr, value):
    """Verify that entry_points map is parseable"""
    try:
        pkg_resources.EntryPoint.parse_map(value)
    except ValueError as e:
        raise DistutilsSetupError(e)


def check_test_suite(dist, attr, value):
    if not isinstance(value, six.string_types):
        raise DistutilsSetupError("test_suite must be a string")


def check_package_data(dist, attr, value):
    """Verify that value is a dictionary of package names to glob lists"""
    if isinstance(value, dict):
        for k, v in value.items():
            if not isinstance(k, str):
                break
            try:
                iter(v)
            except TypeError:
                break
        else:
            return
    raise DistutilsSetupError(
        attr + " must be a dictionary mapping package names to lists of "
        "wildcard patterns"
    )


def check_packages(dist, attr, value):
    for pkgname in value:
        if not re.match(r'\w+(\.\w+)*', pkgname):
            distutils.log.warn(
                "WARNING: %r not a valid package name; please use only "
                ".-separated package names in setup.py", pkgname
            )


_Distribution = get_unpatched(distutils.core.Distribution)


class Distribution(Distribution_parse_config_files, _Distribution):
    """Distribution with support for features, tests, and package data

    This is an enhanced version of 'distutils.dist.Distribution' that
    effectively adds the following new optional keyword arguments to 'setup()':

     'install_requires' -- a string or sequence of strings specifying project
        versions that the distribution requires when installed, in the format
        used by 'pkg_resources.require()'.  They will be installed
        automatically when the package is installed.  If you wish to use
        packages that are not available in PyPI, or want to give your users an
        alternate download location, you can add a 'find_links' option to the
        '[easy_install]' section of your project's 'setup.cfg' file, and then
        setuptools will scan the listed web pages for links that satisfy the
        requirements.

     'extras_require' -- a dictionary mapping names of optional "extras" to the
        additional requirement(s) that using those extras incurs. For example,
        this::

            extras_require = dict(reST = ["docutils>=0.3", "reSTedit"])

        indicates that the distribution can optionally provide an extra
        capability called "reST", but it can only be used if docutils and
        reSTedit are installed.  If the user installs your package using
        EasyInstall and requests one of your extras, the corresponding
        additional requirements will be installed if needed.

     'features' **deprecated** -- a dictionary mapping option names to
        'setuptools.Feature'
        objects.  Features are a portion of the distribution that can be
        included or excluded based on user options, inter-feature dependencies,
        and availability on the current system.  Excluded features are omitted
        from all setup commands, including source and binary distributions, so
        you can create multiple distributions from the same source tree.
        Feature names should be valid Python identifiers, except that they may
        contain the '-' (minus) sign.  Features can be included or excluded
        via the command line options '--with-X' and '--without-X', where 'X' is
        the name of the feature.  Whether a feature is included by default, and
        whether you are allowed to control this from the command line, is
        determined by the Feature object.  See the 'Feature' class for more
        information.

     'test_suite' -- the name of a test suite to run for the 'test' command.
        If the user runs 'python setup.py test', the package will be installed,
        and the named test suite will be run.  The format is the same as
        would be used on a 'unittest.py' command line.  That is, it is the
        dotted name of an object to import and call to generate a test suite.

     'package_data' -- a dictionary mapping package names to lists of filenames
        or globs to use to find data files contained in the named packages.
        If the dictionary has filenames or globs listed under '""' (the empty
        string), those names will be searched for in every package, in addition
        to any names for the specific package.  Data files found using these
        names/globs will be installed along with the package, in the same
        location as the package.  Note that globs are allowed to reference
        the contents of non-package subdirectories, as long as you use '/' as
        a path separator.  (Globs are automatically converted to
        platform-specific paths at runtime.)

    In addition to these new keywords, this class also has several new methods
    for manipulating the distribution's contents.  For example, the 'include()'
    and 'exclude()' methods can be thought of as in-place add and subtract
    commands that add or remove packages, modules, extensions, and so on from
    the distribution.  They are used by the feature subsystem to configure the
    distribution for the included and excluded features.
    """

    _patched_dist = None

    def patch_missing_pkg_info(self, attrs):
        # Fake up a replacement for the data that would normally come from
        # PKG-INFO, but which might not yet be built if this is a fresh
        # checkout.
        #
        if not attrs or 'name' not in attrs or 'version' not in attrs:
            return
        key = pkg_resources.safe_name(str(attrs['name'])).lower()
        dist = pkg_resources.working_set.by_key.get(key)
        if dist is not None and not dist.has_metadata('PKG-INFO'):
            dist._version = pkg_resources.safe_version(str(attrs['version']))
            self._patched_dist = dist

    def __init__(self, attrs=None):
        have_package_data = hasattr(self, "package_data")
        if not have_package_data:
            self.package_data = {}
        attrs = attrs or {}
        if 'features' in attrs or 'require_features' in attrs:
            Feature.warn_deprecated()
        self.require_features = []
        self.features = {}
        self.dist_files = []
        self.src_root = attrs.pop("src_root", None)
        self.patch_missing_pkg_info(attrs)
        self.project_urls = attrs.get('project_urls', {})
        self.dependency_links = attrs.pop('dependency_links', [])
        self.setup_requires = attrs.pop('setup_requires', [])
        for ep in pkg_resources.iter_entry_points('distutils.setup_keywords'):
            vars(self).setdefault(ep.name, None)
        _Distribution.__init__(self, attrs)

        # The project_urls attribute may not be supported in distutils, so
        # prime it here from our value if not automatically set
        self.metadata.project_urls = getattr(
            self.metadata, 'project_urls', self.project_urls)
        self.metadata.long_description_content_type = attrs.get(
            'long_description_content_type'
        )
        self.metadata.provides_extras = getattr(
            self.metadata, 'provides_extras', set()
        )

        if isinstance(self.metadata.version, numbers.Number):
            # Some people apparently take "version number" too literally :)
            self.metadata.version = str(self.metadata.version)

        if self.metadata.version is not None:
            try:
                ver = packaging.version.Version(self.metadata.version)
                normalized_version = str(ver)
                if self.metadata.version != normalized_version:
                    warnings.warn(
                        "Normalizing '%s' to '%s'" % (
                            self.metadata.version,
                            normalized_version,
                        )
                    )
                    self.metadata.version = normalized_version
            except (packaging.version.InvalidVersion, TypeError):
                warnings.warn(
                    "The version specified (%r) is an invalid version, this "
                    "may not work as expected with newer versions of "
                    "setuptools, pip, and PyPI. Please see PEP 440 for more "
                    "details." % self.metadata.version
                )
        self._finalize_requires()

    def _finalize_requires(self):
        """
        Set `metadata.python_requires` and fix environment markers
        in `install_requires` and `extras_require`.
        """
        if getattr(self, 'python_requires', None):
            self.metadata.python_requires = self.python_requires

        if getattr(self, 'extras_require', None):
            for extra in self.extras_require.keys():
                # Since this gets called multiple times at points where the
                # keys have become 'converted' extras, ensure that we are only
                # truly adding extras we haven't seen before here.
                extra = extra.split(':')[0]
                if extra:
                    self.metadata.provides_extras.add(extra)

        self._convert_extras_requirements()
        self._move_install_requirements_markers()

    def _convert_extras_requirements(self):
        """
        Convert requirements in `extras_require` of the form
        `"extra": ["barbazquux; {marker}"]` to
        `"extra:{marker}": ["barbazquux"]`.
        """
        spec_ext_reqs = getattr(self, 'extras_require', None) or {}
        self._tmp_extras_require = defaultdict(list)
        for section, v in spec_ext_reqs.items():
            # Do not strip empty sections.
            self._tmp_extras_require[section]
            for r in pkg_resources.parse_requirements(v):
                suffix = self._suffix_for(r)
                self._tmp_extras_require[section + suffix].append(r)

    @staticmethod
    def _suffix_for(req):
        """
        For a requirement, return the 'extras_require' suffix for
        that requirement.
        """
        return ':' + str(req.marker) if req.marker else ''

    def _move_install_requirements_markers(self):
        """
        Move requirements in `install_requires` that are using environment
        markers `extras_require`.
        """

        # divide the install_requires into two sets, simple ones still
        # handled by install_requires and more complex ones handled
        # by extras_require.

        def is_simple_req(req):
            return not req.marker

        spec_inst_reqs = getattr(self, 'install_requires', None) or ()
        inst_reqs = list(pkg_resources.parse_requirements(spec_inst_reqs))
        simple_reqs = filter(is_simple_req, inst_reqs)
        complex_reqs = filterfalse(is_simple_req, inst_reqs)
        self.install_requires = list(map(str, simple_reqs))

        for r in complex_reqs:
            self._tmp_extras_require[':' + str(r.marker)].append(r)
        self.extras_require = dict(
            (k, [str(r) for r in map(self._clean_req, v)])
            for k, v in self._tmp_extras_require.items()
        )

    def _clean_req(self, req):
        """
        Given a Requirement, remove environment markers and return it.
        """
        req.marker = None
        return req

    def parse_config_files(self, filenames=None, ignore_option_errors=False):
        """Parses configuration files from various levels
        and loads configuration.

        """
        _Distribution.parse_config_files(self, filenames=filenames)

        parse_configuration(self, self.command_options,
                            ignore_option_errors=ignore_option_errors)
        self._finalize_requires()

    def parse_command_line(self):
        """Process features after parsing command line options"""
        result = _Distribution.parse_command_line(self)
        if self.features:
            self._finalize_features()
        return result

    def _feature_attrname(self, name):
        """Convert feature name to corresponding option attribute name"""
        return 'with_' + name.replace('-', '_')

    def fetch_build_eggs(self, requires):
        """Resolve pre-setup requirements"""
        resolved_dists = pkg_resources.working_set.resolve(
            pkg_resources.parse_requirements(requires),
            installer=self.fetch_build_egg,
            replace_conflicting=True,
        )
        for dist in resolved_dists:
            pkg_resources.working_set.add(dist, replace=True)
        return resolved_dists

    def finalize_options(self):
        _Distribution.finalize_options(self)
        if self.features:
            self._set_global_opts_from_features()

        for ep in pkg_resources.iter_entry_points('distutils.setup_keywords'):
            value = getattr(self, ep.name, None)
            if value is not None:
                ep.require(installer=self.fetch_build_egg)
                ep.load()(self, ep.name, value)
        if getattr(self, 'convert_2to3_doctests', None):
            # XXX may convert to set here when we can rely on set being builtin
            self.convert_2to3_doctests = [
                os.path.abspath(p)
                for p in self.convert_2to3_doctests
            ]
        else:
            self.convert_2to3_doctests = []

    def get_egg_cache_dir(self):
        egg_cache_dir = os.path.join(os.curdir, '.eggs')
        if not os.path.exists(egg_cache_dir):
            os.mkdir(egg_cache_dir)
            windows_support.hide_file(egg_cache_dir)
            readme_txt_filename = os.path.join(egg_cache_dir, 'README.txt')
            with open(readme_txt_filename, 'w') as f:
                f.write('This directory contains eggs that were downloaded '
                        'by setuptools to build, test, and run plug-ins.\n\n')
                f.write('This directory caches those eggs to prevent '
                        'repeated downloads.\n\n')
                f.write('However, it is safe to delete this directory.\n\n')

        return egg_cache_dir

    def fetch_build_egg(self, req):
        """Fetch an egg needed for building"""
        from setuptools.command.easy_install import easy_install
        dist = self.__class__({'script_args': ['easy_install']})
        opts = dist.get_option_dict('easy_install')
        opts.clear()
        opts.update(
            (k, v)
            for k, v in self.get_option_dict('easy_install').items()
            if k in (
                # don't use any other settings
                'find_links', 'site_dirs', 'index_url',
                'optimize', 'site_dirs', 'allow_hosts',
            ))
        if self.dependency_links:
            links = self.dependency_links[:]
            if 'find_links' in opts:
                links = opts['find_links'][1] + links
            opts['find_links'] = ('setup', links)
        install_dir = self.get_egg_cache_dir()
        cmd = easy_install(
            dist, args=["x"], install_dir=install_dir,
            exclude_scripts=True,
            always_copy=False, build_directory=None, editable=False,
            upgrade=False, multi_version=True, no_report=True, user=False
        )
        cmd.ensure_finalized()
        return cmd.easy_install(req)

    def _set_global_opts_from_features(self):
        """Add --with-X/--without-X options based on optional features"""

        go = []
        no = self.negative_opt.copy()

        for name, feature in self.features.items():
            self._set_feature(name, None)
            feature.validate(self)

            if feature.optional:
                descr = feature.description
                incdef = ' (default)'
                excdef = ''
                if not feature.include_by_default():
                    excdef, incdef = incdef, excdef

                new = (
                    ('with-' + name, None, 'include ' + descr + incdef),
                    ('without-' + name, None, 'exclude ' + descr + excdef),
                )
                go.extend(new)
                no['without-' + name] = 'with-' + name

        self.global_options = self.feature_options = go + self.global_options
        self.negative_opt = self.feature_negopt = no

    def _finalize_features(self):
        """Add/remove features and resolve dependencies between them"""

        # First, flag all the enabled items (and thus their dependencies)
        for name, feature in self.features.items():
            enabled = self.feature_is_included(name)
            if enabled or (enabled is None and feature.include_by_default()):
                feature.include_in(self)
                self._set_feature(name, 1)

        # Then disable the rest, so that off-by-default features don't
        # get flagged as errors when they're required by an enabled feature
        for name, feature in self.features.items():
            if not self.feature_is_included(name):
                feature.exclude_from(self)
                self._set_feature(name, 0)

    def get_command_class(self, command):
        """Pluggable version of get_command_class()"""
        if command in self.cmdclass:
            return self.cmdclass[command]

        eps = pkg_resources.iter_entry_points('distutils.commands', command)
        for ep in eps:
            ep.require(installer=self.fetch_build_egg)
            self.cmdclass[command] = cmdclass = ep.load()
            return cmdclass
        else:
            return _Distribution.get_command_class(self, command)

    def print_commands(self):
        for ep in pkg_resources.iter_entry_points('distutils.commands'):
            if ep.name not in self.cmdclass:
                # don't require extras as the commands won't be invoked
                cmdclass = ep.resolve()
                self.cmdclass[ep.name] = cmdclass
        return _Distribution.print_commands(self)

    def get_command_list(self):
        for ep in pkg_resources.iter_entry_points('distutils.commands'):
            if ep.name not in self.cmdclass:
                # don't require extras as the commands won't be invoked
                cmdclass = ep.resolve()
                self.cmdclass[ep.name] = cmdclass
        return _Distribution.get_command_list(self)

    def _set_feature(self, name, status):
        """Set feature's inclusion status"""
        setattr(self, self._feature_attrname(name), status)

    def feature_is_included(self, name):
        """Return 1 if feature is included, 0 if excluded, 'None' if unknown"""
        return getattr(self, self._feature_attrname(name))

    def include_feature(self, name):
        """Request inclusion of feature named 'name'"""

        if self.feature_is_included(name) == 0:
            descr = self.features[name].description
            raise DistutilsOptionError(
                descr + " is required, but was excluded or is not available"
            )
        self.features[name].include_in(self)
        self._set_feature(name, 1)

    def include(self, **attrs):
        """Add items to distribution that are named in keyword arguments

        For example, 'dist.exclude(py_modules=["x"])' would add 'x' to
        the distribution's 'py_modules' attribute, if it was not already
        there.

        Currently, this method only supports inclusion for attributes that are
        lists or tuples.  If you need to add support for adding to other
        attributes in this or a subclass, you can add an '_include_X' method,
        where 'X' is the name of the attribute.  The method will be called with
        the value passed to 'include()'.  So, 'dist.include(foo={"bar":"baz"})'
        will try to call 'dist._include_foo({"bar":"baz"})', which can then
        handle whatever special inclusion logic is needed.
        """
        for k, v in attrs.items():
            include = getattr(self, '_include_' + k, None)
            if include:
                include(v)
            else:
                self._include_misc(k, v)

    def exclude_package(self, package):
        """Remove packages, modules, and extensions in named package"""

        pfx = package + '.'
        if self.packages:
            self.packages = [
                p for p in self.packages
                if p != package and not p.startswith(pfx)
            ]

        if self.py_modules:
            self.py_modules = [
                p for p in self.py_modules
                if p != package and not p.startswith(pfx)
            ]

        if self.ext_modules:
            self.ext_modules = [
                p for p in self.ext_modules
                if p.name != package and not p.name.startswith(pfx)
            ]

    def has_contents_for(self, package):
        """Return true if 'exclude_package(package)' would do something"""

        pfx = package + '.'

        for p in self.iter_distribution_names():
            if p == package or p.startswith(pfx):
                return True

    def _exclude_misc(self, name, value):
        """Handle 'exclude()' for list/tuple attrs without a special handler"""
        if not isinstance(value, sequence):
            raise DistutilsSetupError(
                "%s: setting must be a list or tuple (%r)" % (name, value)
            )
        try:
            old = getattr(self, name)
        except AttributeError:
            raise DistutilsSetupError(
                "%s: No such distribution setting" % name
            )
        if old is not None and not isinstance(old, sequence):
            raise DistutilsSetupError(
                name + ": this setting cannot be changed via include/exclude"
            )
        elif old:
            setattr(self, name, [item for item in old if item not in value])

    def _include_misc(self, name, value):
        """Handle 'include()' for list/tuple attrs without a special handler"""

        if not isinstance(value, sequence):
            raise DistutilsSetupError(
                "%s: setting must be a list (%r)" % (name, value)
            )
        try:
            old = getattr(self, name)
        except AttributeError:
            raise DistutilsSetupError(
                "%s: No such distribution setting" % name
            )
        if old is None:
            setattr(self, name, value)
        elif not isinstance(old, sequence):
            raise DistutilsSetupError(
                name + ": this setting cannot be changed via include/exclude"
            )
        else:
            new = [item for item in value if item not in old]
            setattr(self, name, old + new)

    def exclude(self, **attrs):
        """Remove items from distribution that are named in keyword arguments

        For example, 'dist.exclude(py_modules=["x"])' would remove 'x' from
        the distribution's 'py_modules' attribute.  Excluding packages uses
        the 'exclude_package()' method, so all of the package's contained
        packages, modules, and extensions are also excluded.

        Currently, this method only supports exclusion from attributes that are
        lists or tuples.  If you need to add support for excluding from other
        attributes in this or a subclass, you can add an '_exclude_X' method,
        where 'X' is the name of the attribute.  The method will be called with
        the value passed to 'exclude()'.  So, 'dist.exclude(foo={"bar":"baz"})'
        will try to call 'dist._exclude_foo({"bar":"baz"})', which can then
        handle whatever special exclusion logic is needed.
        """
        for k, v in attrs.items():
            exclude = getattr(self, '_exclude_' + k, None)
            if exclude:
                exclude(v)
            else:
                self._exclude_misc(k, v)

    def _exclude_packages(self, packages):
        if not isinstance(packages, sequence):
            raise DistutilsSetupError(
                "packages: setting must be a list or tuple (%r)" % (packages,)
            )
        list(map(self.exclude_package, packages))

    def _parse_command_opts(self, parser, args):
        # Remove --with-X/--without-X options when processing command args
        self.global_options = self.__class__.global_options
        self.negative_opt = self.__class__.negative_opt

        # First, expand any aliases
        command = args[0]
        aliases = self.get_option_dict('aliases')
        while command in aliases:
            src, alias = aliases[command]
            del aliases[command]  # ensure each alias can expand only once!
            import shlex
            args[:1] = shlex.split(alias, True)
            command = args[0]

        nargs = _Distribution._parse_command_opts(self, parser, args)

        # Handle commands that want to consume all remaining arguments
        cmd_class = self.get_command_class(command)
        if getattr(cmd_class, 'command_consumes_arguments', None):
            self.get_option_dict(command)['args'] = ("command line", nargs)
            if nargs is not None:
                return []

        return nargs

    def get_cmdline_options(self):
        """Return a '{cmd: {opt:val}}' map of all command-line options

        Option names are all long, but do not include the leading '--', and
        contain dashes rather than underscores.  If the option doesn't take
        an argument (e.g. '--quiet'), the 'val' is 'None'.

        Note that options provided by config files are intentionally excluded.
        """

        d = {}

        for cmd, opts in self.command_options.items():

            for opt, (src, val) in opts.items():

                if src != "command line":
                    continue

                opt = opt.replace('_', '-')

                if val == 0:
                    cmdobj = self.get_command_obj(cmd)
                    neg_opt = self.negative_opt.copy()
                    neg_opt.update(getattr(cmdobj, 'negative_opt', {}))
                    for neg, pos in neg_opt.items():
                        if pos == opt:
                            opt = neg
                            val = None
                            break
                    else:
                        raise AssertionError("Shouldn't be able to get here")

                elif val == 1:
                    val = None

                d.setdefault(cmd, {})[opt] = val

        return d

    def iter_distribution_names(self):
        """Yield all packages, modules, and extension names in distribution"""

        for pkg in self.packages or ():
            yield pkg

        for module in self.py_modules or ():
            yield module

        for ext in self.ext_modules or ():
            if isinstance(ext, tuple):
                name, buildinfo = ext
            else:
                name = ext.name
            if name.endswith('module'):
                name = name[:-6]
            yield name

    def handle_display_options(self, option_order):
        """If there were any non-global "display-only" options
        (--help-commands or the metadata display options) on the command
        line, display the requested info and return true; else return
        false.
        """
        import sys

        if six.PY2 or self.help_commands:
            return _Distribution.handle_display_options(self, option_order)

        # Stdout may be StringIO (e.g. in tests)
        import io
        if not isinstance(sys.stdout, io.TextIOWrapper):
            return _Distribution.handle_display_options(self, option_order)

        # Don't wrap stdout if utf-8 is already the encoding. Provides
        #  workaround for #334.
        if sys.stdout.encoding.lower() in ('utf-8', 'utf8'):
            return _Distribution.handle_display_options(self, option_order)

        # Print metadata in UTF-8 no matter the platform
        encoding = sys.stdout.encoding
        errors = sys.stdout.errors
        newline = sys.platform != 'win32' and '\n' or None
        line_buffering = sys.stdout.line_buffering

        sys.stdout = io.TextIOWrapper(
            sys.stdout.detach(), 'utf-8', errors, newline, line_buffering)
        try:
            return _Distribution.handle_display_options(self, option_order)
        finally:
            sys.stdout = io.TextIOWrapper(
                sys.stdout.detach(), encoding, errors, newline, line_buffering)


class Feature:
    """
    **deprecated** -- The `Feature` facility was never completely implemented
    or supported, `has reported issues
    <https://github.com/pypa/setuptools/issues/58>`_ and will be removed in
    a future version.

    A subset of the distribution that can be excluded if unneeded/wanted

    Features are created using these keyword arguments:

      'description' -- a short, human readable description of the feature, to
         be used in error messages, and option help messages.

      'standard' -- if true, the feature is included by default if it is
         available on the current system.  Otherwise, the feature is only
         included if requested via a command line '--with-X' option, or if
         another included feature requires it.  The default setting is 'False'.

      'available' -- if true, the feature is available for installation on the
         current system.  The default setting is 'True'.

      'optional' -- if true, the feature's inclusion can be controlled from the
         command line, using the '--with-X' or '--without-X' options.  If
         false, the feature's inclusion status is determined automatically,
         based on 'availabile', 'standard', and whether any other feature
         requires it.  The default setting is 'True'.

      'require_features' -- a string or sequence of strings naming features
         that should also be included if this feature is included.  Defaults to
         empty list.  May also contain 'Require' objects that should be
         added/removed from the distribution.

      'remove' -- a string or list of strings naming packages to be removed
         from the distribution if this feature is *not* included.  If the
         feature *is* included, this argument is ignored.  This argument exists
         to support removing features that "crosscut" a distribution, such as
         defining a 'tests' feature that removes all the 'tests' subpackages
         provided by other features.  The default for this argument is an empty
         list.  (Note: the named package(s) or modules must exist in the base
         distribution when the 'setup()' function is initially called.)

      other keywords -- any other keyword arguments are saved, and passed to
         the distribution's 'include()' and 'exclude()' methods when the
         feature is included or excluded, respectively.  So, for example, you
         could pass 'packages=["a","b"]' to cause packages 'a' and 'b' to be
         added or removed from the distribution as appropriate.

    A feature must include at least one 'requires', 'remove', or other
    keyword argument.  Otherwise, it can't affect the distribution in any way.
    Note also that you can subclass 'Feature' to create your own specialized
    feature types that modify the distribution in other ways when included or
    excluded.  See the docstrings for the various methods here for more detail.
    Aside from the methods, the only feature attributes that distributions look
    at are 'description' and 'optional'.
    """

    @staticmethod
    def warn_deprecated():
        msg = (
            "Features are deprecated and will be removed in a future "
            "version. See https://github.com/pypa/setuptools/issues/65."
        )
        warnings.warn(msg, DeprecationWarning, stacklevel=3)

    def __init__(
            self, description, standard=False, available=True,
            optional=True, require_features=(), remove=(), **extras):
        self.warn_deprecated()

        self.description = description
        self.standard = standard
        self.available = available
        self.optional = optional
        if isinstance(require_features, (str, Require)):
            require_features = require_features,

        self.require_features = [
            r for r in require_features if isinstance(r, str)
        ]
        er = [r for r in require_features if not isinstance(r, str)]
        if er:
            extras['require_features'] = er

        if isinstance(remove, str):
            remove = remove,
        self.remove = remove
        self.extras = extras

        if not remove and not require_features and not extras:
            raise DistutilsSetupError(
                "Feature %s: must define 'require_features', 'remove', or "
                "at least one of 'packages', 'py_modules', etc."
            )

    def include_by_default(self):
        """Should this feature be included by default?"""
        return self.available and self.standard

    def include_in(self, dist):
        """Ensure feature and its requirements are included in distribution

        You may override this in a subclass to perform additional operations on
        the distribution.  Note that this method may be called more than once
        per feature, and so should be idempotent.

        """

        if not self.available:
            raise DistutilsPlatformError(
                self.description + " is required, "
                "but is not available on this platform"
            )

        dist.include(**self.extras)

        for f in self.require_features:
            dist.include_feature(f)

    def exclude_from(self, dist):
        """Ensure feature is excluded from distribution

        You may override this in a subclass to perform additional operations on
        the distribution.  This method will be called at most once per
        feature, and only after all included features have been asked to
        include themselves.
        """

        dist.exclude(**self.extras)

        if self.remove:
            for item in self.remove:
                dist.exclude_package(item)

    def validate(self, dist):
        """Verify that feature makes sense in context of distribution

        This method is called by the distribution just before it parses its
        command line.  It checks to ensure that the 'remove' attribute, if any,
        contains only valid package/module names that are present in the base
        distribution when 'setup()' is called.  You may override it in a
        subclass to perform any other required validation of the feature
        against a target distribution.
        """

        for item in self.remove:
            if not dist.has_contents_for(item):
                raise DistutilsSetupError(
                    "%s wants to be able to remove %s, but the distribution"
                    " doesn't contain any packages or modules under %s"
                    % (self.description, item, item)
                )
py33compat.py000064400000002236151733474000007127 0ustar00import dis
import array
import collections

try:
    import html
except ImportError:
    html = None

from setuptools.extern import six
from setuptools.extern.six.moves import html_parser


OpArg = collections.namedtuple('OpArg', 'opcode arg')


class Bytecode_compat(object):
    def __init__(self, code):
        self.code = code

    def __iter__(self):
        """Yield '(op,arg)' pair for each operation in code object 'code'"""

        bytes = array.array('b', self.code.co_code)
        eof = len(self.code.co_code)

        ptr = 0
        extended_arg = 0

        while ptr < eof:

            op = bytes[ptr]

            if op >= dis.HAVE_ARGUMENT:

                arg = bytes[ptr + 1] + bytes[ptr + 2] * 256 + extended_arg
                ptr += 3

                if op == dis.EXTENDED_ARG:
                    long_type = six.integer_types[-1]
                    extended_arg = arg * long_type(65536)
                    continue

            else:
                arg = None
                ptr += 1

            yield OpArg(op, arg)


Bytecode = getattr(dis, 'Bytecode', Bytecode_compat)


unescape = getattr(html, 'unescape', html_parser.HTMLParser().unescape)