virtualenv/web/virtualenv.py
changeset 244 4f07ad576fee
parent 102 e2968797bdae
child 260 468298db0d90
equal deleted inserted replaced
243:b5daed0ce08b 244:4f07ad576fee
     1 #!/usr/bin/env python
     1 #!/usr/bin/env python
     2 """Create a "virtual" Python installation
     2 """Create a "virtual" Python installation
     3 """
     3 """
     4 
     4 
     5 # If you change the version here, change it in setup.py
     5 __version__ = "12.1.1"
     6 # and docs/conf.py as well.
     6 virtualenv_version = __version__  # legacy
     7 __version__ = "1.9.1"  # following best practices
       
     8 virtualenv_version = __version__  # legacy, again
       
     9 
     7 
    10 import base64
     8 import base64
    11 import sys
     9 import sys
    12 import os
    10 import os
    13 import codecs
    11 import codecs
    21 import glob
    19 import glob
    22 import distutils.sysconfig
    20 import distutils.sysconfig
    23 from distutils.util import strtobool
    21 from distutils.util import strtobool
    24 import struct
    22 import struct
    25 import subprocess
    23 import subprocess
    26 
    24 import tarfile
    27 if sys.version_info < (2, 5):
    25 
       
    26 if sys.version_info < (2, 6):
    28     print('ERROR: %s' % sys.exc_info()[1])
    27     print('ERROR: %s' % sys.exc_info()[1])
    29     print('ERROR: this script requires Python 2.5 or greater.')
    28     print('ERROR: this script requires Python 2.6 or greater.')
    30     sys.exit(101)
    29     sys.exit(101)
    31 
    30 
    32 try:
       
    33     set
       
    34 except NameError:
       
    35     from sets import Set as set
       
    36 try:
    31 try:
    37     basestring
    32     basestring
    38 except NameError:
    33 except NameError:
    39     basestring = str
    34     basestring = str
    40 
    35 
    65 elif is_jython:
    60 elif is_jython:
    66     expected_exe = 'jython'
    61     expected_exe = 'jython'
    67 else:
    62 else:
    68     expected_exe = 'python'
    63     expected_exe = 'python'
    69 
    64 
       
    65 # Return a mapping of version -> Python executable
       
    66 # Only provided for Windows, where the information in the registry is used
       
    67 if not is_win:
       
    68     def get_installed_pythons():
       
    69         return {}
       
    70 else:
       
    71     try:
       
    72         import winreg
       
    73     except ImportError:
       
    74         import _winreg as winreg
       
    75 
       
    76     def get_installed_pythons():
       
    77         try:
       
    78             python_core = winreg.CreateKey(winreg.HKEY_LOCAL_MACHINE,
       
    79                     "Software\\Python\\PythonCore")
       
    80         except WindowsError:
       
    81             # No registered Python installations
       
    82             return {}
       
    83         i = 0
       
    84         versions = []
       
    85         while True:
       
    86             try:
       
    87                 versions.append(winreg.EnumKey(python_core, i))
       
    88                 i = i + 1
       
    89             except WindowsError:
       
    90                 break
       
    91         exes = dict()
       
    92         for ver in versions:
       
    93             try:
       
    94                 path = winreg.QueryValue(python_core, "%s\\InstallPath" % ver)
       
    95             except WindowsError:
       
    96                 continue
       
    97             exes[ver] = join(path, "python.exe")
       
    98 
       
    99         winreg.CloseKey(python_core)
       
   100 
       
   101         # Add the major versions
       
   102         # Sort the keys, then repeatedly update the major version entry
       
   103         # Last executable (i.e., highest version) wins with this approach
       
   104         for ver in sorted(exes):
       
   105             exes[ver[0]] = exes[ver]
       
   106 
       
   107         return exes
    70 
   108 
    71 REQUIRED_MODULES = ['os', 'posix', 'posixpath', 'nt', 'ntpath', 'genericpath',
   109 REQUIRED_MODULES = ['os', 'posix', 'posixpath', 'nt', 'ntpath', 'genericpath',
    72                     'fnmatch', 'locale', 'encodings', 'codecs',
   110                     'fnmatch', 'locale', 'encodings', 'codecs',
    73                     'stat', 'UserDict', 'readline', 'copy_reg', 'types',
   111                     'stat', 'UserDict', 'readline', 'copy_reg', 'types',
    74                     're', 'sre', 'sre_parse', 'sre_constants', 'sre_compile',
   112                     're', 'sre', 'sre_parse', 'sre_constants', 'sre_compile',
    80 if majver == 2:
   118 if majver == 2:
    81     if minver >= 6:
   119     if minver >= 6:
    82         REQUIRED_MODULES.extend(['warnings', 'linecache', '_abcoll', 'abc'])
   120         REQUIRED_MODULES.extend(['warnings', 'linecache', '_abcoll', 'abc'])
    83     if minver >= 7:
   121     if minver >= 7:
    84         REQUIRED_MODULES.extend(['_weakrefset'])
   122         REQUIRED_MODULES.extend(['_weakrefset'])
    85     if minver <= 3:
       
    86         REQUIRED_MODULES.extend(['sets', '__future__'])
       
    87 elif majver == 3:
   123 elif majver == 3:
    88     # Some extra modules are needed for Python 3, but different ones
   124     # Some extra modules are needed for Python 3, but different ones
    89     # for different versions.
   125     # for different versions.
    90     REQUIRED_MODULES.extend(['_abcoll', 'warnings', 'linecache', 'abc', 'io',
   126     REQUIRED_MODULES.extend(['_abcoll', 'warnings', 'linecache', 'abc', 'io',
    91                              '_weakrefset', 'copyreg', 'tempfile', 'random',
   127                              '_weakrefset', 'copyreg', 'tempfile', 'random',
    93                              'shutil', 'struct', 'copy', 'tokenize', 'token',
   129                              'shutil', 'struct', 'copy', 'tokenize', 'token',
    94                              'functools', 'heapq', 'bisect', 'weakref',
   130                              'functools', 'heapq', 'bisect', 'weakref',
    95                              'reprlib'])
   131                              'reprlib'])
    96     if minver >= 2:
   132     if minver >= 2:
    97         REQUIRED_FILES[-1] = 'config-%s' % majver
   133         REQUIRED_FILES[-1] = 'config-%s' % majver
    98     if minver == 3:
   134     if minver >= 3:
    99         import sysconfig
   135         import sysconfig
   100         platdir = sysconfig.get_config_var('PLATDIR')
   136         platdir = sysconfig.get_config_var('PLATDIR')
   101         REQUIRED_FILES.append(platdir)
   137         REQUIRED_FILES.append(platdir)
   102         # The whole list of 3.3 modules is reproduced below - the current
   138         # The whole list of 3.3 modules is reproduced below - the current
   103         # uncommented ones are required for 3.3 as of now, but more may be
   139         # uncommented ones are required for 3.3 as of now, but more may be
   248             #"xdrlib",
   284             #"xdrlib",
   249             #"xml",
   285             #"xml",
   250             #"xmlrpc",
   286             #"xmlrpc",
   251             #"zipfile",
   287             #"zipfile",
   252         ])
   288         ])
       
   289     if minver >= 4:
       
   290         REQUIRED_MODULES.extend([
       
   291             'operator',
       
   292             '_collections_abc',
       
   293             '_bootlocale',
       
   294         ])
   253 
   295 
   254 if is_pypy:
   296 if is_pypy:
   255     # these are needed to correctly display the exceptions that may happen
   297     # these are needed to correctly display the exceptions that may happen
   256     # during the bootstrap
   298     # during the bootstrap
   257     REQUIRED_MODULES.extend(['traceback', 'linecache'])
   299     REQUIRED_MODULES.extend(['traceback', 'linecache'])
   405         logger.info('Creating %s', path)
   447         logger.info('Creating %s', path)
   406         os.makedirs(path)
   448         os.makedirs(path)
   407     else:
   449     else:
   408         logger.info('Directory %s already exists', path)
   450         logger.info('Directory %s already exists', path)
   409 
   451 
   410 def copyfileordir(src, dest):
   452 def copyfileordir(src, dest, symlink=True):
   411     if os.path.isdir(src):
   453     if os.path.isdir(src):
   412         shutil.copytree(src, dest, True)
   454         shutil.copytree(src, dest, symlink)
   413     else:
   455     else:
   414         shutil.copy2(src, dest)
   456         shutil.copy2(src, dest)
   415 
   457 
   416 def copyfile(src, dest, symlink=True):
   458 def copyfile(src, dest, symlink=True):
   417     if not os.path.exists(src):
   459     if not os.path.exists(src):
   420         return
   462         return
   421     if os.path.exists(dest):
   463     if os.path.exists(dest):
   422         logger.debug('File %s already exists', dest)
   464         logger.debug('File %s already exists', dest)
   423         return
   465         return
   424     if not os.path.exists(os.path.dirname(dest)):
   466     if not os.path.exists(os.path.dirname(dest)):
   425         logger.info('Creating parent directories for %s' % os.path.dirname(dest))
   467         logger.info('Creating parent directories for %s', os.path.dirname(dest))
   426         os.makedirs(os.path.dirname(dest))
   468         os.makedirs(os.path.dirname(dest))
   427     if not os.path.islink(src):
   469     if not os.path.islink(src):
   428         srcpath = os.path.abspath(src)
   470         srcpath = os.path.abspath(src)
   429     else:
   471     else:
   430         srcpath = os.readlink(src)
   472         srcpath = os.readlink(src)
   432         logger.info('Symlinking %s', dest)
   474         logger.info('Symlinking %s', dest)
   433         try:
   475         try:
   434             os.symlink(srcpath, dest)
   476             os.symlink(srcpath, dest)
   435         except (OSError, NotImplementedError):
   477         except (OSError, NotImplementedError):
   436             logger.info('Symlinking failed, copying to %s', dest)
   478             logger.info('Symlinking failed, copying to %s', dest)
   437             copyfileordir(src, dest)
   479             copyfileordir(src, dest, symlink)
   438     else:
   480     else:
   439         logger.info('Copying to %s', dest)
   481         logger.info('Copying to %s', dest)
   440         copyfileordir(src, dest)
   482         copyfileordir(src, dest, symlink)
   441 
   483 
   442 def writefile(dest, content, overwrite=True):
   484 def writefile(dest, content, overwrite=True):
   443     if not os.path.exists(dest):
   485     if not os.path.exists(dest):
   444         logger.info('Writing %s', dest)
   486         logger.info('Writing %s', dest)
   445         f = open(dest, 'wb')
   487         f = open(dest, 'wb')
   480         files = glob.glob(os.path.join(dir, filename))
   522         files = glob.glob(os.path.join(dir, filename))
   481         if files and os.path.isfile(files[0]):
   523         if files and os.path.isfile(files[0]):
   482             return True, files[0]
   524             return True, files[0]
   483     return False, filename
   525     return False, filename
   484 
   526 
   485 def _install_req(py_executable, unzip=False, distribute=False,
       
   486                  search_dirs=None, never_download=False):
       
   487 
       
   488     if search_dirs is None:
       
   489         search_dirs = file_search_dirs()
       
   490 
       
   491     if not distribute:
       
   492         egg_path = 'setuptools-*-py%s.egg' % sys.version[:3]
       
   493         found, egg_path = _find_file(egg_path, search_dirs)
       
   494         project_name = 'setuptools'
       
   495         bootstrap_script = EZ_SETUP_PY
       
   496         tgz_path = None
       
   497     else:
       
   498         # Look for a distribute egg (these are not distributed by default,
       
   499         # but can be made available by the user)
       
   500         egg_path = 'distribute-*-py%s.egg' % sys.version[:3]
       
   501         found, egg_path = _find_file(egg_path, search_dirs)
       
   502         project_name = 'distribute'
       
   503         if found:
       
   504             tgz_path = None
       
   505             bootstrap_script = DISTRIBUTE_FROM_EGG_PY
       
   506         else:
       
   507             # Fall back to sdist
       
   508             # NB: egg_path is not None iff tgz_path is None
       
   509             # iff bootstrap_script is a generic setup script accepting
       
   510             # the standard arguments.
       
   511             egg_path = None
       
   512             tgz_path = 'distribute-*.tar.gz'
       
   513             found, tgz_path = _find_file(tgz_path, search_dirs)
       
   514             bootstrap_script = DISTRIBUTE_SETUP_PY
       
   515 
       
   516     if is_jython and os._name == 'nt':
       
   517         # Jython's .bat sys.executable can't handle a command line
       
   518         # argument with newlines
       
   519         fd, ez_setup = tempfile.mkstemp('.py')
       
   520         os.write(fd, bootstrap_script)
       
   521         os.close(fd)
       
   522         cmd = [py_executable, ez_setup]
       
   523     else:
       
   524         cmd = [py_executable, '-c', bootstrap_script]
       
   525     if unzip and egg_path:
       
   526         cmd.append('--always-unzip')
       
   527     env = {}
       
   528     remove_from_env = ['__PYVENV_LAUNCHER__']
       
   529     if logger.stdout_level_matches(logger.DEBUG) and egg_path:
       
   530         cmd.append('-v')
       
   531 
       
   532     old_chdir = os.getcwd()
       
   533     if egg_path is not None and os.path.exists(egg_path):
       
   534         logger.info('Using existing %s egg: %s' % (project_name, egg_path))
       
   535         cmd.append(egg_path)
       
   536         if os.environ.get('PYTHONPATH'):
       
   537             env['PYTHONPATH'] = egg_path + os.path.pathsep + os.environ['PYTHONPATH']
       
   538         else:
       
   539             env['PYTHONPATH'] = egg_path
       
   540     elif tgz_path is not None and os.path.exists(tgz_path):
       
   541         # Found a tgz source dist, let's chdir
       
   542         logger.info('Using existing %s egg: %s' % (project_name, tgz_path))
       
   543         os.chdir(os.path.dirname(tgz_path))
       
   544         # in this case, we want to be sure that PYTHONPATH is unset (not
       
   545         # just empty, really unset), else CPython tries to import the
       
   546         # site.py that it's in virtualenv_support
       
   547         remove_from_env.append('PYTHONPATH')
       
   548     elif never_download:
       
   549         logger.fatal("Can't find any local distributions of %s to install "
       
   550                      "and --never-download is set.  Either re-run virtualenv "
       
   551                      "without the --never-download option, or place a %s "
       
   552                      "distribution (%s) in one of these "
       
   553                      "locations: %r" % (project_name, project_name,
       
   554                                         egg_path or tgz_path,
       
   555                                         search_dirs))
       
   556         sys.exit(1)
       
   557     elif egg_path:
       
   558         logger.info('No %s egg found; downloading' % project_name)
       
   559         cmd.extend(['--always-copy', '-U', project_name])
       
   560     else:
       
   561         logger.info('No %s tgz found; downloading' % project_name)
       
   562     logger.start_progress('Installing %s...' % project_name)
       
   563     logger.indent += 2
       
   564     cwd = None
       
   565     if project_name == 'distribute':
       
   566         env['DONT_PATCH_SETUPTOOLS'] = 'true'
       
   567 
       
   568     def _filter_ez_setup(line):
       
   569         return filter_ez_setup(line, project_name)
       
   570 
       
   571     if not os.access(os.getcwd(), os.W_OK):
       
   572         cwd = tempfile.mkdtemp()
       
   573         if tgz_path is not None and os.path.exists(tgz_path):
       
   574             # the current working dir is hostile, let's copy the
       
   575             # tarball to a temp dir
       
   576             target = os.path.join(cwd, os.path.split(tgz_path)[-1])
       
   577             shutil.copy(tgz_path, target)
       
   578     try:
       
   579         call_subprocess(cmd, show_stdout=False,
       
   580                         filter_stdout=_filter_ez_setup,
       
   581                         extra_env=env,
       
   582                         remove_from_env=remove_from_env,
       
   583                         cwd=cwd)
       
   584     finally:
       
   585         logger.indent -= 2
       
   586         logger.end_progress()
       
   587         if cwd is not None:
       
   588             shutil.rmtree(cwd)
       
   589         if os.getcwd() != old_chdir:
       
   590             os.chdir(old_chdir)
       
   591         if is_jython and os._name == 'nt':
       
   592             os.remove(ez_setup)
       
   593 
       
   594 def file_search_dirs():
   527 def file_search_dirs():
   595     here = os.path.dirname(os.path.abspath(__file__))
   528     here = os.path.dirname(os.path.abspath(__file__))
   596     dirs = ['.', here,
   529     dirs = ['.', here,
   597             join(here, 'virtualenv_support')]
   530             join(here, 'virtualenv_support')]
   598     if os.path.splitext(os.path.dirname(__file__))[0] != 'virtualenv':
   531     if os.path.splitext(os.path.dirname(__file__))[0] != 'virtualenv':
   603             pass
   536             pass
   604         else:
   537         else:
   605             dirs.append(os.path.join(os.path.dirname(virtualenv.__file__), 'virtualenv_support'))
   538             dirs.append(os.path.join(os.path.dirname(virtualenv.__file__), 'virtualenv_support'))
   606     return [d for d in dirs if os.path.isdir(d)]
   539     return [d for d in dirs if os.path.isdir(d)]
   607 
   540 
   608 def install_setuptools(py_executable, unzip=False,
       
   609                        search_dirs=None, never_download=False):
       
   610     _install_req(py_executable, unzip,
       
   611                  search_dirs=search_dirs, never_download=never_download)
       
   612 
       
   613 def install_distribute(py_executable, unzip=False,
       
   614                        search_dirs=None, never_download=False):
       
   615     _install_req(py_executable, unzip, distribute=True,
       
   616                  search_dirs=search_dirs, never_download=never_download)
       
   617 
       
   618 _pip_re = re.compile(r'^pip-.*(zip|tar.gz|tar.bz2|tgz|tbz)$', re.I)
       
   619 def install_pip(py_executable, search_dirs=None, never_download=False):
       
   620     if search_dirs is None:
       
   621         search_dirs = file_search_dirs()
       
   622 
       
   623     filenames = []
       
   624     for dir in search_dirs:
       
   625         filenames.extend([join(dir, fn) for fn in os.listdir(dir)
       
   626                           if _pip_re.search(fn)])
       
   627     filenames = [(os.path.basename(filename).lower(), i, filename) for i, filename in enumerate(filenames)]
       
   628     filenames.sort()
       
   629     filenames = [filename for basename, i, filename in filenames]
       
   630     if not filenames:
       
   631         filename = 'pip'
       
   632     else:
       
   633         filename = filenames[-1]
       
   634     easy_install_script = 'easy_install'
       
   635     if is_win:
       
   636         easy_install_script = 'easy_install-script.py'
       
   637     # There's two subtle issues here when invoking easy_install.
       
   638     # 1. On unix-like systems the easy_install script can *only* be executed
       
   639     #    directly if its full filesystem path is no longer than 78 characters.
       
   640     # 2. A work around to [1] is to use the `python path/to/easy_install foo`
       
   641     #    pattern, but that breaks if the path contains non-ASCII characters, as
       
   642     #    you can't put the file encoding declaration before the shebang line.
       
   643     # The solution is to use Python's -x flag to skip the first line of the
       
   644     # script (and any ASCII decoding errors that may have occurred in that line)
       
   645     cmd = [py_executable, '-x', join(os.path.dirname(py_executable), easy_install_script), filename]
       
   646     # jython and pypy don't yet support -x
       
   647     if is_jython or is_pypy:
       
   648         cmd.remove('-x')
       
   649     if filename == 'pip':
       
   650         if never_download:
       
   651             logger.fatal("Can't find any local distributions of pip to install "
       
   652                          "and --never-download is set.  Either re-run virtualenv "
       
   653                          "without the --never-download option, or place a pip "
       
   654                          "source distribution (zip/tar.gz/tar.bz2) in one of these "
       
   655                          "locations: %r" % search_dirs)
       
   656             sys.exit(1)
       
   657         logger.info('Installing pip from network...')
       
   658     else:
       
   659         logger.info('Installing existing %s distribution: %s' % (
       
   660                 os.path.basename(filename), filename))
       
   661     logger.start_progress('Installing pip...')
       
   662     logger.indent += 2
       
   663     def _filter_setup(line):
       
   664         return filter_ez_setup(line, 'pip')
       
   665     try:
       
   666         call_subprocess(cmd, show_stdout=False,
       
   667                         filter_stdout=_filter_setup)
       
   668     finally:
       
   669         logger.indent -= 2
       
   670         logger.end_progress()
       
   671 
       
   672 def filter_ez_setup(line, project_name='setuptools'):
       
   673     if not line.strip():
       
   674         return Logger.DEBUG
       
   675     if project_name == 'distribute':
       
   676         for prefix in ('Extracting', 'Now working', 'Installing', 'Before',
       
   677                        'Scanning', 'Setuptools', 'Egg', 'Already',
       
   678                        'running', 'writing', 'reading', 'installing',
       
   679                        'creating', 'copying', 'byte-compiling', 'removing',
       
   680                        'Processing'):
       
   681             if line.startswith(prefix):
       
   682                 return Logger.DEBUG
       
   683         return Logger.DEBUG
       
   684     for prefix in ['Reading ', 'Best match', 'Processing setuptools',
       
   685                    'Copying setuptools', 'Adding setuptools',
       
   686                    'Installing ', 'Installed ']:
       
   687         if line.startswith(prefix):
       
   688             return Logger.DEBUG
       
   689     return Logger.INFO
       
   690 
       
   691 
   541 
   692 class UpdatingDefaultsHelpFormatter(optparse.IndentedHelpFormatter):
   542 class UpdatingDefaultsHelpFormatter(optparse.IndentedHelpFormatter):
   693     """
   543     """
   694     Custom help formatter for use in ConfigOptionParser that updates
   544     Custom help formatter for use in ConfigOptionParser that updates
   695     the defaults before expanding them, allowing them to show up correctly
   545     the defaults before expanding them, allowing them to show up correctly
   701         return optparse.IndentedHelpFormatter.expand_default(self, option)
   551         return optparse.IndentedHelpFormatter.expand_default(self, option)
   702 
   552 
   703 
   553 
   704 class ConfigOptionParser(optparse.OptionParser):
   554 class ConfigOptionParser(optparse.OptionParser):
   705     """
   555     """
   706     Custom option parser which updates its defaults by by checking the
   556     Custom option parser which updates its defaults by checking the
   707     configuration files and environmental variables
   557     configuration files and environmental variables
   708     """
   558     """
   709     def __init__(self, *args, **kwargs):
   559     def __init__(self, *args, **kwargs):
   710         self.config = ConfigParser.RawConfigParser()
   560         self.config = ConfigParser.RawConfigParser()
   711         self.files = self.get_config_files()
   561         self.files = self.get_config_files()
   751                     val = strtobool(val)
   601                     val = strtobool(val)
   752                 try:
   602                 try:
   753                     val = option.convert_value(key, val)
   603                     val = option.convert_value(key, val)
   754                 except optparse.OptionValueError:
   604                 except optparse.OptionValueError:
   755                     e = sys.exc_info()[1]
   605                     e = sys.exc_info()[1]
   756                     print("An error occured during configuration: %s" % e)
   606                     print("An error occurred during configuration: %s" % e)
   757                     sys.exit(3)
   607                     sys.exit(3)
   758                 defaults[option.dest] = val
   608                 defaults[option.dest] = val
   759         return defaults
   609         return defaults
   760 
   610 
   761     def get_config_section(self, name):
   611     def get_config_section(self, name):
   801     parser.add_option(
   651     parser.add_option(
   802         '-v', '--verbose',
   652         '-v', '--verbose',
   803         action='count',
   653         action='count',
   804         dest='verbose',
   654         dest='verbose',
   805         default=0,
   655         default=0,
   806         help="Increase verbosity")
   656         help="Increase verbosity.")
   807 
   657 
   808     parser.add_option(
   658     parser.add_option(
   809         '-q', '--quiet',
   659         '-q', '--quiet',
   810         action='count',
   660         action='count',
   811         dest='quiet',
   661         dest='quiet',
   812         default=0,
   662         default=0,
   813         help='Decrease verbosity')
   663         help='Decrease verbosity.')
   814 
   664 
   815     parser.add_option(
   665     parser.add_option(
   816         '-p', '--python',
   666         '-p', '--python',
   817         dest='python',
   667         dest='python',
   818         metavar='PYTHON_EXE',
   668         metavar='PYTHON_EXE',
   822 
   672 
   823     parser.add_option(
   673     parser.add_option(
   824         '--clear',
   674         '--clear',
   825         dest='clear',
   675         dest='clear',
   826         action='store_true',
   676         action='store_true',
   827         help="Clear out the non-root install and start from scratch")
   677         help="Clear out the non-root install and start from scratch.")
   828 
   678 
   829     parser.set_defaults(system_site_packages=False)
   679     parser.set_defaults(system_site_packages=False)
   830     parser.add_option(
   680     parser.add_option(
   831         '--no-site-packages',
   681         '--no-site-packages',
   832         dest='system_site_packages',
   682         dest='system_site_packages',
   833         action='store_false',
   683         action='store_false',
   834         help="Don't give access to the global site-packages dir to the "
   684         help="DEPRECATED. Retained only for backward compatibility. "
   835              "virtual environment (default)")
   685              "Not having access to global site-packages is now the default behavior.")
   836 
   686 
   837     parser.add_option(
   687     parser.add_option(
   838         '--system-site-packages',
   688         '--system-site-packages',
   839         dest='system_site_packages',
   689         dest='system_site_packages',
   840         action='store_true',
   690         action='store_true',
   841         help="Give access to the global site-packages dir to the "
   691         help="Give the virtual environment access to the global site-packages.")
   842              "virtual environment")
   692 
       
   693     parser.add_option(
       
   694         '--always-copy',
       
   695         dest='symlink',
       
   696         action='store_false',
       
   697         default=True,
       
   698         help="Always copy files rather than symlinking.")
   843 
   699 
   844     parser.add_option(
   700     parser.add_option(
   845         '--unzip-setuptools',
   701         '--unzip-setuptools',
   846         dest='unzip_setuptools',
   702         dest='unzip_setuptools',
   847         action='store_true',
   703         action='store_true',
   848         help="Unzip Setuptools or Distribute when installing it")
   704         help="Unzip Setuptools when installing it.")
   849 
   705 
   850     parser.add_option(
   706     parser.add_option(
   851         '--relocatable',
   707         '--relocatable',
   852         dest='relocatable',
   708         dest='relocatable',
   853         action='store_true',
   709         action='store_true',
   854         help='Make an EXISTING virtualenv environment relocatable.  '
   710         help='Make an EXISTING virtualenv environment relocatable. '
   855         'This fixes up scripts and makes all .pth files relative')
   711              'This fixes up scripts and makes all .pth files relative.')
   856 
       
   857     parser.add_option(
       
   858         '--distribute', '--use-distribute',  # the second option is for legacy reasons here. Hi Kenneth!
       
   859         dest='use_distribute',
       
   860         action='store_true',
       
   861         help='Use Distribute instead of Setuptools. Set environ variable '
       
   862         'VIRTUALENV_DISTRIBUTE to make it the default ')
       
   863 
   712 
   864     parser.add_option(
   713     parser.add_option(
   865         '--no-setuptools',
   714         '--no-setuptools',
   866         dest='no_setuptools',
   715         dest='no_setuptools',
   867         action='store_true',
   716         action='store_true',
   868         help='Do not install distribute/setuptools (or pip) '
   717         help='Do not install setuptools (or pip) in the new virtualenv.')
   869         'in the new virtualenv.')
       
   870 
   718 
   871     parser.add_option(
   719     parser.add_option(
   872         '--no-pip',
   720         '--no-pip',
   873         dest='no_pip',
   721         dest='no_pip',
   874         action='store_true',
   722         action='store_true',
   875         help='Do not install pip in the new virtualenv.')
   723         help='Do not install pip in the new virtualenv.')
   876 
   724 
   877     parser.add_option(
       
   878         '--setuptools',
       
   879         dest='use_distribute',
       
   880         action='store_false',
       
   881         help='Use Setuptools instead of Distribute.  Set environ variable '
       
   882         'VIRTUALENV_SETUPTOOLS to make it the default ')
       
   883 
       
   884     # Set this to True to use distribute by default, even in Python 2.
       
   885     parser.set_defaults(use_distribute=False)
       
   886 
       
   887     default_search_dirs = file_search_dirs()
   725     default_search_dirs = file_search_dirs()
   888     parser.add_option(
   726     parser.add_option(
   889         '--extra-search-dir',
   727         '--extra-search-dir',
   890         dest="search_dirs",
   728         dest="search_dirs",
   891         action="append",
   729         action="append",
       
   730         metavar='DIR',
   892         default=default_search_dirs,
   731         default=default_search_dirs,
   893         help="Directory to look for setuptools/distribute/pip distributions in. "
   732         help="Directory to look for setuptools/pip distributions in. "
   894         "You can add any number of additional --extra-search-dir paths.")
   733               "This option can be used multiple times.")
   895 
   734 
   896     parser.add_option(
   735     parser.add_option(
   897         '--never-download',
   736         '--never-download',
   898         dest="never_download",
   737         dest="never_download",
   899         action="store_true",
   738         action="store_true",
   900         help="Never download anything from the network.  Instead, virtualenv will fail "
   739         default=True,
   901         "if local distributions of setuptools/distribute/pip are not present.")
   740         help="DEPRECATED. Retained only for backward compatibility. This option has no effect. "
       
   741               "Virtualenv never downloads pip or setuptools.")
   902 
   742 
   903     parser.add_option(
   743     parser.add_option(
   904         '--prompt',
   744         '--prompt',
   905         dest='prompt',
   745         dest='prompt',
   906         help='Provides an alternative prompt prefix for this environment')
   746         help='Provides an alternative prompt prefix for this environment.')
       
   747 
       
   748     parser.add_option(
       
   749         '--setuptools',
       
   750         dest='setuptools',
       
   751         action='store_true',
       
   752         help="DEPRECATED. Retained only for backward compatibility. This option has no effect.")
       
   753 
       
   754     parser.add_option(
       
   755         '--distribute',
       
   756         dest='distribute',
       
   757         action='store_true',
       
   758         help="DEPRECATED. Retained only for backward compatibility. This option has no effect.")
   907 
   759 
   908     if 'extend_parser' in globals():
   760     if 'extend_parser' in globals():
   909         extend_parser(parser)
   761         extend_parser(parser)
   910 
   762 
   911     options, args = parser.parse_args()
   763     options, args = parser.parse_args()
   930             if file.endswith('.pyc'):
   782             if file.endswith('.pyc'):
   931                 file = file[:-1]
   783                 file = file[:-1]
   932             popen = subprocess.Popen([interpreter, file] + sys.argv[1:], env=env)
   784             popen = subprocess.Popen([interpreter, file] + sys.argv[1:], env=env)
   933             raise SystemExit(popen.wait())
   785             raise SystemExit(popen.wait())
   934 
   786 
   935     # Force --distribute on Python 3, since setuptools is not available.
       
   936     if majver > 2:
       
   937         options.use_distribute = True
       
   938 
       
   939     if os.environ.get('PYTHONDONTWRITEBYTECODE') and not options.use_distribute:
       
   940         print(
       
   941             "The PYTHONDONTWRITEBYTECODE environment variable is "
       
   942             "not compatible with setuptools. Either use --distribute "
       
   943             "or unset PYTHONDONTWRITEBYTECODE.")
       
   944         sys.exit(2)
       
   945     if not args:
   787     if not args:
   946         print('You must provide a DEST_DIR')
   788         print('You must provide a DEST_DIR')
   947         parser.print_help()
   789         parser.print_help()
   948         sys.exit(2)
   790         sys.exit(2)
   949     if len(args) > 1:
   791     if len(args) > 1:
   965 
   807 
   966     if options.relocatable:
   808     if options.relocatable:
   967         make_environment_relocatable(home_dir)
   809         make_environment_relocatable(home_dir)
   968         return
   810         return
   969 
   811 
       
   812     if not options.never_download:
       
   813         logger.warn('The --never-download option is for backward compatibility only.')
       
   814         logger.warn('Setting it to false is no longer supported, and will be ignored.')
       
   815 
   970     create_environment(home_dir,
   816     create_environment(home_dir,
   971                        site_packages=options.system_site_packages,
   817                        site_packages=options.system_site_packages,
   972                        clear=options.clear,
   818                        clear=options.clear,
   973                        unzip_setuptools=options.unzip_setuptools,
   819                        unzip_setuptools=options.unzip_setuptools,
   974                        use_distribute=options.use_distribute,
       
   975                        prompt=options.prompt,
   820                        prompt=options.prompt,
   976                        search_dirs=options.search_dirs,
   821                        search_dirs=options.search_dirs,
   977                        never_download=options.never_download,
   822                        never_download=True,
   978                        no_setuptools=options.no_setuptools,
   823                        no_setuptools=options.no_setuptools,
   979                        no_pip=options.no_pip)
   824                        no_pip=options.no_pip,
       
   825                        symlink=options.symlink)
   980     if 'after_install' in globals():
   826     if 'after_install' in globals():
   981         after_install(options, home_dir)
   827         after_install(options, home_dir)
   982 
   828 
   983 def call_subprocess(cmd, show_stdout=True,
   829 def call_subprocess(cmd, show_stdout=True,
   984                     filter_stdout=None, cwd=None,
   830                     filter_stdout=None, cwd=None,
  1058         else:
   904         else:
  1059             logger.warn(
   905             logger.warn(
  1060                 "Command %s had error code %s"
   906                 "Command %s had error code %s"
  1061                 % (cmd_desc, proc.returncode))
   907                 % (cmd_desc, proc.returncode))
  1062 
   908 
       
   909 def filter_install_output(line):
       
   910     if line.strip().startswith('running'):
       
   911         return Logger.INFO
       
   912     return Logger.DEBUG
       
   913 
       
   914 def find_wheels(projects, search_dirs):
       
   915     """Find wheels from which we can import PROJECTS.
       
   916 
       
   917     Scan through SEARCH_DIRS for a wheel for each PROJECT in turn. Return
       
   918     a list of the first wheel found for each PROJECT
       
   919     """
       
   920 
       
   921     wheels = []
       
   922 
       
   923     # Look through SEARCH_DIRS for the first suitable wheel. Don't bother
       
   924     # about version checking here, as this is simply to get something we can
       
   925     # then use to install the correct version.
       
   926     for project in projects:
       
   927         for dirname in search_dirs:
       
   928             # This relies on only having "universal" wheels available.
       
   929             # The pattern could be tightened to require -py2.py3-none-any.whl.
       
   930             files = glob.glob(os.path.join(dirname, project + '-*.whl'))
       
   931             if files:
       
   932                 wheels.append(os.path.abspath(files[0]))
       
   933                 break
       
   934         else:
       
   935             # We're out of luck, so quit with a suitable error
       
   936             logger.fatal('Cannot find a wheel for %s' % (project,))
       
   937 
       
   938     return wheels
       
   939 
       
   940 def install_wheel(project_names, py_executable, search_dirs=None):
       
   941     if search_dirs is None:
       
   942         search_dirs = file_search_dirs()
       
   943 
       
   944     wheels = find_wheels(['setuptools', 'pip'], search_dirs)
       
   945     pythonpath = os.pathsep.join(wheels)
       
   946     findlinks = ' '.join(search_dirs)
       
   947 
       
   948     cmd = [
       
   949         py_executable, '-c',
       
   950         'import sys, pip; sys.exit(pip.main(["install", "--ignore-installed"] + sys.argv[1:]))',
       
   951     ] + project_names
       
   952     logger.start_progress('Installing %s...' % (', '.join(project_names)))
       
   953     logger.indent += 2
       
   954     try:
       
   955         call_subprocess(cmd, show_stdout=False,
       
   956             extra_env = {
       
   957                 'PYTHONPATH': pythonpath,
       
   958                 'PIP_FIND_LINKS': findlinks,
       
   959                 'PIP_USE_WHEEL': '1',
       
   960                 'PIP_PRE': '1',
       
   961                 'PIP_NO_INDEX': '1'
       
   962             }
       
   963         )
       
   964     finally:
       
   965         logger.indent -= 2
       
   966         logger.end_progress()
  1063 
   967 
  1064 def create_environment(home_dir, site_packages=False, clear=False,
   968 def create_environment(home_dir, site_packages=False, clear=False,
  1065                        unzip_setuptools=False, use_distribute=False,
   969                        unzip_setuptools=False,
  1066                        prompt=None, search_dirs=None, never_download=False,
   970                        prompt=None, search_dirs=None, never_download=False,
  1067                        no_setuptools=False, no_pip=False):
   971                        no_setuptools=False, no_pip=False, symlink=True):
  1068     """
   972     """
  1069     Creates a new environment in ``home_dir``.
   973     Creates a new environment in ``home_dir``.
  1070 
   974 
  1071     If ``site_packages`` is true, then the global ``site-packages/``
   975     If ``site_packages`` is true, then the global ``site-packages/``
  1072     directory will be on the path.
   976     directory will be on the path.
  1076     """
   980     """
  1077     home_dir, lib_dir, inc_dir, bin_dir = path_locations(home_dir)
   981     home_dir, lib_dir, inc_dir, bin_dir = path_locations(home_dir)
  1078 
   982 
  1079     py_executable = os.path.abspath(install_python(
   983     py_executable = os.path.abspath(install_python(
  1080         home_dir, lib_dir, inc_dir, bin_dir,
   984         home_dir, lib_dir, inc_dir, bin_dir,
  1081         site_packages=site_packages, clear=clear))
   985         site_packages=site_packages, clear=clear, symlink=symlink))
  1082 
   986 
  1083     install_distutils(home_dir)
   987     install_distutils(home_dir)
  1084 
   988 
  1085     if not no_setuptools:
   989     if not no_setuptools:
  1086         if use_distribute:
   990         to_install = ['setuptools']
  1087             install_distribute(py_executable, unzip=unzip_setuptools,
       
  1088                                search_dirs=search_dirs, never_download=never_download)
       
  1089         else:
       
  1090             install_setuptools(py_executable, unzip=unzip_setuptools,
       
  1091                                search_dirs=search_dirs, never_download=never_download)
       
  1092 
       
  1093         if not no_pip:
   991         if not no_pip:
  1094             install_pip(py_executable, search_dirs=search_dirs, never_download=never_download)
   992             to_install.append('pip')
       
   993         install_wheel(to_install, py_executable, search_dirs)
  1095 
   994 
  1096     install_activate(home_dir, bin_dir, prompt)
   995     install_activate(home_dir, bin_dir, prompt)
  1097 
   996 
  1098 def is_executable_file(fpath):
   997 def is_executable_file(fpath):
  1099     return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
   998     return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
  1182                 relpath = relpath[1:]
  1081                 relpath = relpath[1:]
  1183             return join(dst_prefix, relpath)
  1082             return join(dst_prefix, relpath)
  1184     assert False, "Filename %s does not start with any of these prefixes: %s" % \
  1083     assert False, "Filename %s does not start with any of these prefixes: %s" % \
  1185         (filename, prefixes)
  1084         (filename, prefixes)
  1186 
  1085 
  1187 def copy_required_modules(dst_prefix):
  1086 def copy_required_modules(dst_prefix, symlink):
  1188     import imp
  1087     import imp
  1189     # If we are running under -p, we need to remove the current
  1088     # If we are running under -p, we need to remove the current
  1190     # directory from sys.path temporarily here, so that we
  1089     # directory from sys.path temporarily here, so that we
  1191     # definitely get the modules from the site directory of
  1090     # definitely get the modules from the site directory of
  1192     # the interpreter we are running under, not the one
  1091     # the interpreter we are running under, not the one
  1209                     f.close()
  1108                     f.close()
  1210                 # special-case custom readline.so on OS X, but not for pypy:
  1109                 # special-case custom readline.so on OS X, but not for pypy:
  1211                 if modname == 'readline' and sys.platform == 'darwin' and not (
  1110                 if modname == 'readline' and sys.platform == 'darwin' and not (
  1212                         is_pypy or filename.endswith(join('lib-dynload', 'readline.so'))):
  1111                         is_pypy or filename.endswith(join('lib-dynload', 'readline.so'))):
  1213                     dst_filename = join(dst_prefix, 'lib', 'python%s' % sys.version[:3], 'readline.so')
  1112                     dst_filename = join(dst_prefix, 'lib', 'python%s' % sys.version[:3], 'readline.so')
       
  1113                 elif modname == 'readline' and sys.platform == 'win32':
       
  1114                     # special-case for Windows, where readline is not a
       
  1115                     # standard module, though it may have been installed in
       
  1116                     # site-packages by a third-party package
       
  1117                     pass
  1214                 else:
  1118                 else:
  1215                     dst_filename = change_prefix(filename, dst_prefix)
  1119                     dst_filename = change_prefix(filename, dst_prefix)
  1216                 copyfile(filename, dst_filename)
  1120                 copyfile(filename, dst_filename, symlink)
  1217                 if filename.endswith('.pyc'):
  1121                 if filename.endswith('.pyc'):
  1218                     pyfile = filename[:-1]
  1122                     pyfile = filename[:-1]
  1219                     if os.path.exists(pyfile):
  1123                     if os.path.exists(pyfile):
  1220                         copyfile(pyfile, dst_filename[:-1])
  1124                         copyfile(pyfile, dst_filename[:-1], symlink)
  1221     finally:
  1125     finally:
  1222         sys.path = _prev_sys_path
  1126         sys.path = _prev_sys_path
  1223 
  1127 
  1224 
  1128 
  1225 def subst_path(prefix_path, prefix, home_dir):
  1129 def subst_path(prefix_path, prefix, home_dir):
  1230         logger.warn('Path not in prefix %r %r', prefix_path, prefix)
  1134         logger.warn('Path not in prefix %r %r', prefix_path, prefix)
  1231         return
  1135         return
  1232     return prefix_path.replace(prefix, home_dir, 1)
  1136     return prefix_path.replace(prefix, home_dir, 1)
  1233 
  1137 
  1234 
  1138 
  1235 def install_python(home_dir, lib_dir, inc_dir, bin_dir, site_packages, clear):
  1139 def install_python(home_dir, lib_dir, inc_dir, bin_dir, site_packages, clear, symlink=True):
  1236     """Install just the base environment, no distutils patches etc"""
  1140     """Install just the base environment, no distutils patches etc"""
  1237     if sys.executable.startswith(bin_dir):
  1141     if sys.executable.startswith(bin_dir):
  1238         print('Please use the *system* python to run this script')
  1142         print('Please use the *system* python to run this script')
  1239         return
  1143         return
  1240 
  1144 
  1251         logger.notify('Using base prefix %r' % sys.base_prefix)
  1155         logger.notify('Using base prefix %r' % sys.base_prefix)
  1252         prefix = sys.base_prefix
  1156         prefix = sys.base_prefix
  1253     else:
  1157     else:
  1254         prefix = sys.prefix
  1158         prefix = sys.prefix
  1255     mkdir(lib_dir)
  1159     mkdir(lib_dir)
  1256     fix_lib64(lib_dir)
  1160     fix_lib64(lib_dir, symlink)
  1257     stdlib_dirs = [os.path.dirname(os.__file__)]
  1161     stdlib_dirs = [os.path.dirname(os.__file__)]
  1258     if is_win:
  1162     if is_win:
  1259         stdlib_dirs.append(join(os.path.dirname(stdlib_dirs[0]), 'DLLs'))
  1163         stdlib_dirs.append(join(os.path.dirname(stdlib_dirs[0]), 'DLLs'))
  1260     elif is_darwin:
  1164     elif is_darwin:
  1261         stdlib_dirs.append(join(stdlib_dirs[0], 'site-packages'))
  1165         stdlib_dirs.append(join(stdlib_dirs[0], 'site-packages'))
  1270             if not os.path.isdir(stdlib_dir):
  1174             if not os.path.isdir(stdlib_dir):
  1271                 continue
  1175                 continue
  1272             for fn in os.listdir(stdlib_dir):
  1176             for fn in os.listdir(stdlib_dir):
  1273                 bn = os.path.splitext(fn)[0]
  1177                 bn = os.path.splitext(fn)[0]
  1274                 if fn != 'site-packages' and bn in REQUIRED_FILES:
  1178                 if fn != 'site-packages' and bn in REQUIRED_FILES:
  1275                     copyfile(join(stdlib_dir, fn), join(lib_dir, fn))
  1179                     copyfile(join(stdlib_dir, fn), join(lib_dir, fn), symlink)
  1276         # ...and modules
  1180         # ...and modules
  1277         copy_required_modules(home_dir)
  1181         copy_required_modules(home_dir, symlink)
  1278     finally:
  1182     finally:
  1279         logger.indent -= 2
  1183         logger.indent -= 2
  1280     mkdir(join(lib_dir, 'site-packages'))
  1184     mkdir(join(lib_dir, 'site-packages'))
  1281     import site
  1185     import site
  1282     site_filename = site.__file__
  1186     site_filename = site.__file__
  1295     if is_pypy or is_win:
  1199     if is_pypy or is_win:
  1296         stdinc_dir = join(prefix, 'include')
  1200         stdinc_dir = join(prefix, 'include')
  1297     else:
  1201     else:
  1298         stdinc_dir = join(prefix, 'include', py_version + abiflags)
  1202         stdinc_dir = join(prefix, 'include', py_version + abiflags)
  1299     if os.path.exists(stdinc_dir):
  1203     if os.path.exists(stdinc_dir):
  1300         copyfile(stdinc_dir, inc_dir)
  1204         copyfile(stdinc_dir, inc_dir, symlink)
  1301     else:
  1205     else:
  1302         logger.debug('No include dir %s' % stdinc_dir)
  1206         logger.debug('No include dir %s' % stdinc_dir)
  1303 
  1207 
  1304     platinc_dir = distutils.sysconfig.get_python_inc(plat_specific=1)
  1208     platinc_dir = distutils.sysconfig.get_python_inc(plat_specific=1)
  1305     if platinc_dir != stdinc_dir:
  1209     if platinc_dir != stdinc_dir:
  1312         if platinc_dest:
  1216         if platinc_dest:
  1313             # PyPy's stdinc_dir and prefix are relative to the original binary
  1217             # PyPy's stdinc_dir and prefix are relative to the original binary
  1314             # (traversing virtualenvs), whereas the platinc_dir is relative to
  1218             # (traversing virtualenvs), whereas the platinc_dir is relative to
  1315             # the inner virtualenv and ignores the prefix argument.
  1219             # the inner virtualenv and ignores the prefix argument.
  1316             # This seems more evolved than designed.
  1220             # This seems more evolved than designed.
  1317             copyfile(platinc_dir, platinc_dest)
  1221             copyfile(platinc_dir, platinc_dest, symlink)
  1318 
  1222 
  1319     # pypy never uses exec_prefix, just ignore it
  1223     # pypy never uses exec_prefix, just ignore it
  1320     if sys.exec_prefix != prefix and not is_pypy:
  1224     if sys.exec_prefix != prefix and not is_pypy:
  1321         if is_win:
  1225         if is_win:
  1322             exec_dir = join(sys.exec_prefix, 'lib')
  1226             exec_dir = join(sys.exec_prefix, 'lib')
  1323         elif is_jython:
  1227         elif is_jython:
  1324             exec_dir = join(sys.exec_prefix, 'Lib')
  1228             exec_dir = join(sys.exec_prefix, 'Lib')
  1325         else:
  1229         else:
  1326             exec_dir = join(sys.exec_prefix, 'lib', py_version)
  1230             exec_dir = join(sys.exec_prefix, 'lib', py_version)
  1327         for fn in os.listdir(exec_dir):
  1231         for fn in os.listdir(exec_dir):
  1328             copyfile(join(exec_dir, fn), join(lib_dir, fn))
  1232             copyfile(join(exec_dir, fn), join(lib_dir, fn), symlink)
  1329 
  1233 
  1330     if is_jython:
  1234     if is_jython:
  1331         # Jython has either jython-dev.jar and javalib/ dir, or just
  1235         # Jython has either jython-dev.jar and javalib/ dir, or just
  1332         # jython.jar
  1236         # jython.jar
  1333         for name in 'jython-dev.jar', 'javalib', 'jython.jar':
  1237         for name in 'jython-dev.jar', 'javalib', 'jython.jar':
  1334             src = join(prefix, name)
  1238             src = join(prefix, name)
  1335             if os.path.exists(src):
  1239             if os.path.exists(src):
  1336                 copyfile(src, join(home_dir, name))
  1240                 copyfile(src, join(home_dir, name), symlink)
  1337         # XXX: registry should always exist after Jython 2.5rc1
  1241         # XXX: registry should always exist after Jython 2.5rc1
  1338         src = join(prefix, 'registry')
  1242         src = join(prefix, 'registry')
  1339         if os.path.exists(src):
  1243         if os.path.exists(src):
  1340             copyfile(src, join(home_dir, 'registry'), symlink=False)
  1244             copyfile(src, join(home_dir, 'registry'), symlink=False)
  1341         copyfile(join(prefix, 'cachedir'), join(home_dir, 'cachedir'),
  1245         copyfile(join(prefix, 'cachedir'), join(home_dir, 'cachedir'),
  1345     py_executable = join(bin_dir, os.path.basename(sys.executable))
  1249     py_executable = join(bin_dir, os.path.basename(sys.executable))
  1346     if 'Python.framework' in prefix:
  1250     if 'Python.framework' in prefix:
  1347         # OS X framework builds cause validation to break
  1251         # OS X framework builds cause validation to break
  1348         # https://github.com/pypa/virtualenv/issues/322
  1252         # https://github.com/pypa/virtualenv/issues/322
  1349         if os.environ.get('__PYVENV_LAUNCHER__'):
  1253         if os.environ.get('__PYVENV_LAUNCHER__'):
  1350           os.unsetenv('__PYVENV_LAUNCHER__')
  1254             del os.environ["__PYVENV_LAUNCHER__"]
  1351         if re.search(r'/Python(?:-32|-64)*$', py_executable):
  1255         if re.search(r'/Python(?:-32|-64)*$', py_executable):
  1352             # The name of the python executable is not quite what
  1256             # The name of the python executable is not quite what
  1353             # we want, rename it.
  1257             # we want, rename it.
  1354             py_executable = os.path.join(
  1258             py_executable = os.path.join(
  1355                     os.path.dirname(py_executable), 'python')
  1259                     os.path.dirname(py_executable), 'python')
  1407             # make a symlink python --> pypy-c
  1311             # make a symlink python --> pypy-c
  1408             python_executable = os.path.join(os.path.dirname(py_executable), 'python')
  1312             python_executable = os.path.join(os.path.dirname(py_executable), 'python')
  1409             if sys.platform in ('win32', 'cygwin'):
  1313             if sys.platform in ('win32', 'cygwin'):
  1410                 python_executable += '.exe'
  1314                 python_executable += '.exe'
  1411             logger.info('Also created executable %s' % python_executable)
  1315             logger.info('Also created executable %s' % python_executable)
  1412             copyfile(py_executable, python_executable)
  1316             copyfile(py_executable, python_executable, symlink)
  1413 
  1317 
  1414             if is_win:
  1318             if is_win:
  1415                 for name in 'libexpat.dll', 'libpypy.dll', 'libpypy-c.dll', 'libeay32.dll', 'ssleay32.dll', 'sqlite.dll':
  1319                 for name in ['libexpat.dll', 'libpypy.dll', 'libpypy-c.dll',
       
  1320                             'libeay32.dll', 'ssleay32.dll', 'sqlite3.dll',
       
  1321                             'tcl85.dll', 'tk85.dll']:
  1416                     src = join(prefix, name)
  1322                     src = join(prefix, name)
  1417                     if os.path.exists(src):
  1323                     if os.path.exists(src):
  1418                         copyfile(src, join(bin_dir, name))
  1324                         copyfile(src, join(bin_dir, name), symlink)
       
  1325 
       
  1326                 for d in sys.path:
       
  1327                     if d.endswith('lib_pypy'):
       
  1328                         break
       
  1329                 else:
       
  1330                     logger.fatal('Could not find lib_pypy in sys.path')
       
  1331                     raise SystemExit(3)
       
  1332                 logger.info('Copying lib_pypy')
       
  1333                 copyfile(d, os.path.join(home_dir, 'lib_pypy'), symlink)
  1419 
  1334 
  1420     if os.path.splitext(os.path.basename(py_executable))[0] != expected_exe:
  1335     if os.path.splitext(os.path.basename(py_executable))[0] != expected_exe:
  1421         secondary_exe = os.path.join(os.path.dirname(py_executable),
  1336         secondary_exe = os.path.join(os.path.dirname(py_executable),
  1422                                      expected_exe)
  1337                                      expected_exe)
  1423         py_executable_ext = os.path.splitext(py_executable)[1]
  1338         py_executable_ext = os.path.splitext(py_executable)[1]
  1424         if py_executable_ext == '.exe':
  1339         if py_executable_ext.lower() == '.exe':
  1425             # python2.4 gives an extension of '.4' :P
  1340             # python2.4 gives an extension of '.4' :P
  1426             secondary_exe += py_executable_ext
  1341             secondary_exe += py_executable_ext
  1427         if os.path.exists(secondary_exe):
  1342         if os.path.exists(secondary_exe):
  1428             logger.warn('Not overwriting existing %s script %s (you must use %s)'
  1343             logger.warn('Not overwriting existing %s script %s (you must use %s)'
  1429                         % (expected_exe, secondary_exe, py_executable))
  1344                         % (expected_exe, secondary_exe, py_executable))
  1433             make_exe(secondary_exe)
  1348             make_exe(secondary_exe)
  1434 
  1349 
  1435     if '.framework' in prefix:
  1350     if '.framework' in prefix:
  1436         if 'Python.framework' in prefix:
  1351         if 'Python.framework' in prefix:
  1437             logger.debug('MacOSX Python framework detected')
  1352             logger.debug('MacOSX Python framework detected')
  1438             # Make sure we use the the embedded interpreter inside
  1353             # Make sure we use the embedded interpreter inside
  1439             # the framework, even if sys.executable points to
  1354             # the framework, even if sys.executable points to
  1440             # the stub executable in ${sys.prefix}/bin
  1355             # the stub executable in ${sys.prefix}/bin
  1441             # See http://groups.google.com/group/python-virtualenv/
  1356             # See http://groups.google.com/group/python-virtualenv/
  1442             #                              browse_thread/thread/17cab2f85da75951
  1357             #                              browse_thread/thread/17cab2f85da75951
  1443             original_python = os.path.join(
  1358             original_python = os.path.join(
  1453 
  1368 
  1454         if os.path.exists(virtual_lib):
  1369         if os.path.exists(virtual_lib):
  1455             os.unlink(virtual_lib)
  1370             os.unlink(virtual_lib)
  1456         copyfile(
  1371         copyfile(
  1457             os.path.join(prefix, 'Python'),
  1372             os.path.join(prefix, 'Python'),
  1458             virtual_lib)
  1373             virtual_lib,
       
  1374             symlink)
  1459 
  1375 
  1460         # And then change the install_name of the copied python executable
  1376         # And then change the install_name of the copied python executable
  1461         try:
  1377         try:
  1462             mach_o_change(py_executable,
  1378             mach_o_change(py_executable,
  1463                           os.path.join(prefix, 'Python'),
  1379                           os.path.join(prefix, 'Python'),
  1494 
  1410 
  1495         for pth in required_symlinks:
  1411         for pth in required_symlinks:
  1496             full_pth = join(bin_dir, pth)
  1412             full_pth = join(bin_dir, pth)
  1497             if os.path.exists(full_pth):
  1413             if os.path.exists(full_pth):
  1498                 os.unlink(full_pth)
  1414                 os.unlink(full_pth)
  1499             os.symlink(py_executable_base, full_pth)
  1415             if symlink:
       
  1416                 os.symlink(py_executable_base, full_pth)
       
  1417             else:
       
  1418                 copyfile(py_executable, full_pth, symlink)
  1500 
  1419 
  1501     if is_win and ' ' in py_executable:
  1420     if is_win and ' ' in py_executable:
  1502         # There's a bug with subprocess on Windows when using a first
  1421         # There's a bug with subprocess on Windows when using a first
  1503         # argument that has a space in it.  Instead we have to quote
  1422         # argument that has a space in it.  Instead we have to quote
  1504         # the value:
  1423         # the value:
  1547     if os.path.exists(pydistutils):
  1466     if os.path.exists(pydistutils):
  1548         logger.notify('Please make sure you remove any previous custom paths from '
  1467         logger.notify('Please make sure you remove any previous custom paths from '
  1549                       'your %s file.' % pydistutils)
  1468                       'your %s file.' % pydistutils)
  1550     ## FIXME: really this should be calculated earlier
  1469     ## FIXME: really this should be calculated earlier
  1551 
  1470 
  1552     fix_local_scheme(home_dir)
  1471     fix_local_scheme(home_dir, symlink)
  1553 
  1472 
  1554     if site_packages:
  1473     if site_packages:
  1555         if os.path.exists(site_packages_filename):
  1474         if os.path.exists(site_packages_filename):
  1556             logger.info('Deleting %s' % site_packages_filename)
  1475             logger.info('Deleting %s' % site_packages_filename)
  1557             os.unlink(site_packages_filename)
  1476             os.unlink(site_packages_filename)
  1608     ## FIXME: this is breaking things, removing for now:
  1527     ## FIXME: this is breaking things, removing for now:
  1609     #distutils_cfg = DISTUTILS_CFG + "\n[install]\nprefix=%s\n" % home_dir
  1528     #distutils_cfg = DISTUTILS_CFG + "\n[install]\nprefix=%s\n" % home_dir
  1610     writefile(os.path.join(distutils_path, '__init__.py'), DISTUTILS_INIT)
  1529     writefile(os.path.join(distutils_path, '__init__.py'), DISTUTILS_INIT)
  1611     writefile(os.path.join(distutils_path, 'distutils.cfg'), DISTUTILS_CFG, overwrite=False)
  1530     writefile(os.path.join(distutils_path, 'distutils.cfg'), DISTUTILS_CFG, overwrite=False)
  1612 
  1531 
  1613 def fix_local_scheme(home_dir):
  1532 def fix_local_scheme(home_dir, symlink=True):
  1614     """
  1533     """
  1615     Platforms that use the "posix_local" install scheme (like Ubuntu with
  1534     Platforms that use the "posix_local" install scheme (like Ubuntu with
  1616     Python 2.7) need to be given an additional "local" location, sigh.
  1535     Python 2.7) need to be given an additional "local" location, sigh.
  1617     """
  1536     """
  1618     try:
  1537     try:
  1625             if not os.path.exists(local_path):
  1544             if not os.path.exists(local_path):
  1626                 os.mkdir(local_path)
  1545                 os.mkdir(local_path)
  1627                 for subdir_name in os.listdir(home_dir):
  1546                 for subdir_name in os.listdir(home_dir):
  1628                     if subdir_name == 'local':
  1547                     if subdir_name == 'local':
  1629                         continue
  1548                         continue
  1630                     os.symlink(os.path.abspath(os.path.join(home_dir, subdir_name)), \
  1549                     copyfile(os.path.abspath(os.path.join(home_dir, subdir_name)), \
  1631                                                             os.path.join(local_path, subdir_name))
  1550                                                             os.path.join(local_path, subdir_name), symlink)
  1632 
  1551 
  1633 def fix_lib64(lib_dir):
  1552 def fix_lib64(lib_dir, symlink=True):
  1634     """
  1553     """
  1635     Some platforms (particularly Gentoo on x64) put things in lib64/pythonX.Y
  1554     Some platforms (particularly Gentoo on x64) put things in lib64/pythonX.Y
  1636     instead of lib/pythonX.Y.  If this is such a platform we'll just create a
  1555     instead of lib/pythonX.Y.  If this is such a platform we'll just create a
  1637     symlink so lib64 points to lib
  1556     symlink so lib64 points to lib
  1638     """
  1557     """
  1639     if [p for p in distutils.sysconfig.get_config_vars().values()
  1558     if [p for p in distutils.sysconfig.get_config_vars().values()
  1640         if isinstance(p, basestring) and 'lib64' in p]:
  1559         if isinstance(p, basestring) and 'lib64' in p]:
       
  1560         # PyPy's library path scheme is not affected by this.
       
  1561         # Return early or we will die on the following assert.
       
  1562         if is_pypy:
       
  1563             logger.debug('PyPy detected, skipping lib64 symlinking')
       
  1564             return
       
  1565 
  1641         logger.debug('This system uses lib64; symlinking lib64 to lib')
  1566         logger.debug('This system uses lib64; symlinking lib64 to lib')
       
  1567 
  1642         assert os.path.basename(lib_dir) == 'python%s' % sys.version[:3], (
  1568         assert os.path.basename(lib_dir) == 'python%s' % sys.version[:3], (
  1643             "Unexpected python lib dir: %r" % lib_dir)
  1569             "Unexpected python lib dir: %r" % lib_dir)
  1644         lib_parent = os.path.dirname(lib_dir)
  1570         lib_parent = os.path.dirname(lib_dir)
  1645         top_level = os.path.dirname(lib_parent)
  1571         top_level = os.path.dirname(lib_parent)
  1646         lib_dir = os.path.join(top_level, 'lib')
  1572         lib_dir = os.path.join(top_level, 'lib')
  1647         lib64_link = os.path.join(top_level, 'lib64')
  1573         lib64_link = os.path.join(top_level, 'lib64')
  1648         assert os.path.basename(lib_parent) == 'lib', (
  1574         assert os.path.basename(lib_parent) == 'lib', (
  1649             "Unexpected parent dir: %r" % lib_parent)
  1575             "Unexpected parent dir: %r" % lib_parent)
  1650         if os.path.lexists(lib64_link):
  1576         if os.path.lexists(lib64_link):
  1651             return
  1577             return
  1652         os.symlink('lib', lib64_link)
  1578         if symlink:
       
  1579             os.symlink('lib', lib64_link)
       
  1580         else:
       
  1581             copyfile('lib', lib64_link)
  1653 
  1582 
  1654 def resolve_interpreter(exe):
  1583 def resolve_interpreter(exe):
  1655     """
  1584     """
  1656     If the executable given isn't an absolute path, search $PATH for the interpreter
  1585     If the executable given isn't an absolute path, search $PATH for the interpreter
  1657     """
  1586     """
       
  1587     # If the "executable" is a version number, get the installed executable for
       
  1588     # that version
       
  1589     python_versions = get_installed_pythons()
       
  1590     if exe in python_versions:
       
  1591         exe = python_versions[exe]
       
  1592 
  1658     if os.path.abspath(exe) != exe:
  1593     if os.path.abspath(exe) != exe:
  1659         paths = os.environ.get('PATH', '').split(os.pathsep)
  1594         paths = os.environ.get('PATH', '').split(os.pathsep)
  1660         for path in paths:
  1595         for path in paths:
  1661             if os.path.exists(os.path.join(path, exe)):
  1596             if os.path.exists(os.path.join(path, exe)):
  1662                 exe = os.path.join(path, exe)
  1597                 exe = os.path.join(path, exe)
  1685     activate_this = os.path.join(bin_dir, 'activate_this.py')
  1620     activate_this = os.path.join(bin_dir, 'activate_this.py')
  1686     if not os.path.exists(activate_this):
  1621     if not os.path.exists(activate_this):
  1687         logger.fatal(
  1622         logger.fatal(
  1688             'The environment doesn\'t have a file %s -- please re-run virtualenv '
  1623             'The environment doesn\'t have a file %s -- please re-run virtualenv '
  1689             'on this environment to update it' % activate_this)
  1624             'on this environment to update it' % activate_this)
  1690     fixup_scripts(home_dir)
  1625     fixup_scripts(home_dir, bin_dir)
  1691     fixup_pth_and_egg_link(home_dir)
  1626     fixup_pth_and_egg_link(home_dir)
  1692     ## FIXME: need to fix up distutils.cfg
  1627     ## FIXME: need to fix up distutils.cfg
  1693 
  1628 
  1694 OK_ABS_SCRIPTS = ['python', 'python%s' % sys.version[:3],
  1629 OK_ABS_SCRIPTS = ['python', 'python%s' % sys.version[:3],
  1695                   'activate', 'activate.bat', 'activate_this.py']
  1630                   'activate', 'activate.bat', 'activate_this.py',
  1696 
  1631                   'activate.fish', 'activate.csh']
  1697 def fixup_scripts(home_dir):
  1632 
       
  1633 def fixup_scripts(home_dir, bin_dir):
       
  1634     if is_win:
       
  1635         new_shebang_args = (
       
  1636             '%s /c' % os.path.normcase(os.environ.get('COMSPEC', 'cmd.exe')),
       
  1637             '', '.exe')
       
  1638     else:
       
  1639         new_shebang_args = ('/usr/bin/env', sys.version[:3], '')
       
  1640 
  1698     # This is what we expect at the top of scripts:
  1641     # This is what we expect at the top of scripts:
  1699     shebang = '#!%s/bin/python' % os.path.normcase(os.path.abspath(home_dir))
  1642     shebang = '#!%s' % os.path.normcase(os.path.join(
       
  1643         os.path.abspath(bin_dir), 'python%s' % new_shebang_args[2]))
  1700     # This is what we'll put:
  1644     # This is what we'll put:
  1701     new_shebang = '#!/usr/bin/env python%s' % sys.version[:3]
  1645     new_shebang = '#!%s python%s%s' % new_shebang_args
  1702     if is_win:
  1646 
  1703         bin_suffix = 'Scripts'
       
  1704     else:
       
  1705         bin_suffix = 'bin'
       
  1706     bin_dir = os.path.join(home_dir, bin_suffix)
       
  1707     home_dir, lib_dir, inc_dir, bin_dir = path_locations(home_dir)
       
  1708     for filename in os.listdir(bin_dir):
  1647     for filename in os.listdir(bin_dir):
  1709         filename = os.path.join(bin_dir, filename)
  1648         filename = os.path.join(bin_dir, filename)
  1710         if not os.path.isfile(filename):
  1649         if not os.path.isfile(filename):
  1711             # ignore subdirs, e.g. .svn ones.
  1650             # ignore subdirs, e.g. .svn ones.
  1712             continue
  1651             continue
  1721         finally:
  1660         finally:
  1722             f.close()
  1661             f.close()
  1723         if not lines:
  1662         if not lines:
  1724             logger.warn('Script %s is an empty file' % filename)
  1663             logger.warn('Script %s is an empty file' % filename)
  1725             continue
  1664             continue
  1726         if not lines[0].strip().startswith(shebang):
  1665 
       
  1666         old_shebang = lines[0].strip()
       
  1667         old_shebang = old_shebang[0:2] + os.path.normcase(old_shebang[2:])
       
  1668 
       
  1669         if not old_shebang.startswith(shebang):
  1727             if os.path.basename(filename) in OK_ABS_SCRIPTS:
  1670             if os.path.basename(filename) in OK_ABS_SCRIPTS:
  1728                 logger.debug('Cannot make script %s relative' % filename)
  1671                 logger.debug('Cannot make script %s relative' % filename)
  1729             elif lines[0].strip() == new_shebang:
  1672             elif lines[0].strip() == new_shebang:
  1730                 logger.info('Script %s has already been made relative' % filename)
  1673                 logger.info('Script %s has already been made relative' % filename)
  1731             else:
  1674             else:
  1738         f.write('\n'.join(script).encode('utf-8'))
  1681         f.write('\n'.join(script).encode('utf-8'))
  1739         f.close()
  1682         f.close()
  1740 
  1683 
  1741 def relative_script(lines):
  1684 def relative_script(lines):
  1742     "Return a script that'll work in a relocatable environment."
  1685     "Return a script that'll work in a relocatable environment."
  1743     activate = "import os; activate_this=os.path.join(os.path.dirname(os.path.realpath(__file__)), 'activate_this.py'); execfile(activate_this, dict(__file__=activate_this)); del os, activate_this"
  1686     activate = "import os; activate_this=os.path.join(os.path.dirname(os.path.realpath(__file__)), 'activate_this.py'); exec(compile(open(activate_this).read(), activate_this, 'exec'), dict(__file__=activate_this)); del os, activate_this"
  1744     # Find the last future statement in the script. If we insert the activation
  1687     # Find the last future statement in the script. If we insert the activation
  1745     # line before a future statement, Python will raise a SyntaxError.
  1688     # line before a future statement, Python will raise a SyntaxError.
  1746     activate_at = None
  1689     activate_at = None
  1747     for idx, line in reversed(list(enumerate(lines))):
  1690     for idx, line in reversed(list(enumerate(lines))):
  1748         if line.split()[:3] == ['from', '__future__', 'import']:
  1691         if line.split()[:3] == ['from', '__future__', 'import']:
  1913     b = base64.b64decode(s.encode('ascii'))
  1856     b = base64.b64decode(s.encode('ascii'))
  1914     return zlib.decompress(b).decode('utf-8')
  1857     return zlib.decompress(b).decode('utf-8')
  1915 
  1858 
  1916 ##file site.py
  1859 ##file site.py
  1917 SITE_PY = convert("""
  1860 SITE_PY = convert("""
  1918 eJzFPf1z2zaWv/OvwMqToZTIdOK0vR2nzo2TOK3v3MTbpLO5dT1aSoIs1hTJEqRl7c3d337vAwAB
  1861 eJzFPf1z2zaWv/OvwMqToZTKdOJ0e3tO3RsncVrfuYm3yc7m1vXoKAmyWFMkS5C2tTd3f/u9DwAE
  1919 kpLtTXdO04klEnh4eHhfeHgPHQwGJ0Uhs7lY5fM6lULJuJwtRRFXSyUWeSmqZVLO94u4rDbwdHYT
  1862 +CHb2+6cphNLJPDw8PC+8PAeOhqNTopCZkuxyZd1KoWScblYiyKu1kqs8lJU66Rc7hdxWW3h6eIm
  1920 X0slqlyojYqwVRQET7/yEzwVn5eJMijAt7iu8lVcJbM4TTciWRV5Wcm5mNdlkl2LJEuqJE6Tf0CL
  1863 vpZKVLlQWxVhqygInv/GT/BcfF4nyqAA3+K6yjdxlSziNN2KZFPkZSWXYlmXSXYtkiypkjhN/g4t
  1921 PIvE06/HIDjLBMw8TWQpbmWpAK4S+UJcbKplnolhXeCcX0Tfxi9HY6FmZVJU0KDUOANFlnEVZFLO
  1864 8iwSz387BsFZJmDmaSJLcStLBXCVyFfiYlut80yM6wLn/DL6Y/xqMhVqUSZFBQ1KjTNQZB1XQSbl
  1922 AU1oWSsgZVLJfVXIWbJIZrbhOq/TuSjSeCbF3//OU6OmYRiofCXXS1lKkQEyAFMCrALxgK9JKWb5
  1865 EtCElrUCUiaV3FeFXCSrZGEb3uV1uhRFGi+k+K//4qlR0zAMVL6Rd2tZSpEBMgBTAqwC8YCvSSkW
  1923 XEZCvJGzGAfg5w2xAoY2xjVTSMYsF2meXcOcMjmTSsXlRgyndUWACGUxzwGnBDCokjQN1nl5o0aw
  1866 +VJGQryRixgH4OcNsQKGNsU1U0jGLBdpnl3DnDK5kErF5VaM53VFgAhlscwBpwQwqJI0De7y8kZN
  1924 pLQea3gkYmYPfzLMHjBPHL/LOYDjxyz4JUvuxgwbuAfBVUtmm1IukjsRI1j4Ke/kbKKfDZOFmCeL
  1867 YElpPe7gkYiZPfzJMHvAPHH8LucAjh+z4C9Zcj9l2MA9CK5aM9uUcpXcixjBwk95Lxcz/WycrMQy
  1925 BdAgq0bYJGAElEiT6UFBy/G9XqHXB4SV5coYxpCIMjfml9QjCs4qEacK2LYukEaKMH8np0mcATWy
  1868 Wa2ABlk1wSYBI6BEmswPClqOb/UKfXdAWFmujGEMiShzY35JPaLgrBJxqoBt6wJppAjzd3KexBlQ
  1926 WxgOIAJJg75x5omq7Dg0O5EDgBLXsQIpWSkxXMVJBsz6UzwjtP+aZPN8rUZEAVgtJX6rVeXOf9hD
  1869 I7uF4QAikDToG2eZqMqOQ7MTOQAocR0rkJKNEuNNnGTArD/GC0L7r0m2zO/UhCgAq6XEL7Wq3PmP
  1927 AGjtEGAc4GKZ1ayzNLmR6WYECHwG7Eup6rRCgZgnpZxVeZlIRQAAtY2Qd4D0WMSl1CRkzjRyOyb6
  1870 ewgArR0CTANcLLOadZYmNzLdTgCBz4B9KVWdVigQy6SUiyovE6kIAKC2FfIekJ6KuJSahMyZRm6n
  1928 E02SDBcWBQwFHl8iSRbJdV2ShIlFApwLXPH+48/i3embs5MPmscMMJbZ6xXgDFBooR2cYABxUKvy
  1871 RH+iSZLhwqKAocDjSyTJKrmuS5IwsUqAc4Er3n/8Sbw7fXN28kHzmAHGMnu9AZwBCi20gxMMIA5q
  1929 IM1BoKPgHP+IeD5HIbvG8QGvpsHBvSsdDGHuRdTu4yw4kF0vrh4G5liBMqGxAur339BlrJZAn/+5
  1872 VR6kOQh0FJzjHxEvlyhk1zg+4NU0OHhwpYMxzL2I2n2cBQey68XVw8AcK1AmNFZA/f4bukzVGujz
  1930 Z72D4GQbVWji/G29zEEms3glxTJm/kLOCL7XcF5HRbV8BdygEE4FpFK4OIhggvCAJC7NhnkmRQEs
  1873 Pw+sdxCcDFGFJs7f7tY5yGQWb6RYx8xfyBnBtxrOd1FRrV8DNyiEUwGpFC4OIpggPCCJS7NxnklR
  1931 liaZHAVAoSm19VcRWOFDnu3TWrc4ASCUQQYvnWcjGjGTMNEurFeoL0zjDc1MNwnsOq/ykhQH8H82
  1874 AIulSSYnAVBoTm39VQRW+JBn+7TWLU4ACGWQwUvn2YRGzCRMtAvrNeoL03hLM9NNArvOm7wkxQH8
  1932 I12UxtkN4aiIofjbVF4nWYYIIS8E4V5IA6ubBDhxHolzakV6wTQSIWsvbokiUQMvIdMBT8q7eFWk
  1875 ny1IF6VxdkM4KmIo/jaX10mWIULIC0G4F9LA6iYBTlxG4pxakV4wjUTI2otbokjUwEvIdMCT8j7e
  1933 cszii7p1txqhwWQlzFqnzHHQsiL1SqvWTLWX9w6jLy2uIzSrZSkBeD31hG6R52MxBZ1N2BTxisWr
  1876 FKmcsviibt2tRmgwWQmz1ilzHLSsSL3SqjVT7eW9w+hLi+sIzWpdSgBezz2hW+X5VMxBZxM2Rbxh
  1934 WufEOUGPPFEn5AlqCX3xO1D0RKl6Je1L5BXQLMRQwSJP03wNJDsKAiH2sJExyj5zwlt4B/8CXPw3
  1877 8arucuKcoEeeqBPyBLWEvvgdKHqiVL2R9iXyCmgWYqhgladpfgckOwoCIfawkTHKPnPCW3gH/wJc
  1935 ldVsGQTOSBawBoXIbwOFQMAkyExztUbC4zbNym0lk2SsKfJyLksa6mHEPmDEH9gY5xp8yCtt1Hi6
  1878 /DeV1WIdBM5IFrAGhcgPgUIgYBJkprlaI+Fxm2bltpJJMtYUebmUJQ31OGIfMOKPbIxzDT7klTZq
  1936 uMr5KqlQJU21yUzY4mVhxfrxFc8bpgGWWxHNTNOGTiucXlos46k0LslULlAS9CK9sssOYwY9Y5It
  1879 PF1c5XyTVKiS5tpkJmzxsrBi/fia5w3TAMutiGamaUOnDU4vLdbxXBqXZC5XKAl6kV7bZYcxg54x
  1937 rsSKrQy8A7LIhC1Iv2JBpbOoJDkBAIOFL86Sok6pkUIGEzEMtCoI/ipGk55rZwnYm81ygAqJzfcM
  1880 yRZXYsNWBt4BWWTCFqRfsaDSWVWSnACAwcIXZ0lRp9RIIYOJGAbaFAR/E6NJz7WzBOzNZjlAhcTm
  1938 7A/g9g8Qo/UyAfrMAAJoGNRSsHzTpCrRQWj0UeAbfdOfxwdOPVto28RDLuIk1VY+zoIzenhaliS+
  1881 ewH2B3D7O4jR3ToB+iwAAmgY1FKwfPOkKtFBaPRR4Bt905/HB049W2nbxEOu4iTVVj7OgjN6eFqW
  1939 M1lgr7EmhoIZZhW6dtcZ0BHFfDAYBIFxhzbKfM1VUJWbI2AFYcaZTKZ1goZvMkFTr3+ogEcRzsBe
  1882 JL4LWWCvqSaGghlmFbp21xnQEcV8NBoFgXGHtsp8zVVQldsjYAVhxpnN5nWChm82Q1Ovf6iARxHO
  1940 N9vOwgMNYTp9ACo5XRZlvsLXdm6fQJnAWNgj2BMXpGUkO8geJ75C8rkqvTBN0XY77CxQDwUXP5++
  1883 wF43287CAw1hOn0AKjldVmW+wdd2bp9AmcBY2CPYExekZSQ7yB4nvkbyuSq9ME3RdjvsLFAPBRc/
  1941 P/ty+kkci8tGpY3b+uwKxjzNYmBrsgjAVK1hG10GLVHxJaj7xHsw78QUYM+oN4mvjKsaeBdQ/1zW
  1884 nb4/+3L6SRyLy0alTdv67ArGPM1iYGuyCMBUrWEbXQYtUfElqPvEezDvxBRgz6g3ia+Mqxp4F1D/
  1942 9BqmMfNeBqcfTt6cn05++XT68+TT2edTQBDsjAz2aMpoHmtwGFUEwgFcOVeRtq9Bpwc9eHPyyT4I
  1885 XNb0Gqax8F4Gpx9O3pyfzv7y6fSn2aezz6eAINgZGezRlNE81uAwqgiEA7hyqSJtX4NOD3rw5uST
  1943 JomafPcNsBs8GV7LCpi4HMKMxyJcxXcKGDQcU9MR4thpABY8HI3Ea3H49OnLQ4JWbIoNAAOz6zTF
  1886 fRDMEjX75mtgN3gyvpYVMHE5hhlPRbiJ7xUwaDilphPEsdMALHg4mYjvxOHz568OCVqxLbYADMyu
  1944 hxNt0SdJtsjDETX+jV36Y1ZS2n+7PPrmShwfi/C3+DYOA/ChmqbMEj+ROH3eFBK6VvBnmKtREMzl
  1887 0xQfzrRFnyXZKg8n1PgXdumPWUlp/+3y6OsrcXwswl/i2zgMwIdqmjJL/Eji9HlbSOhawZ9xriZB
  1945 AkTvRqKADp+SXzziDrAk0DLXdvq3PMnMe+ZKdwjSH0PqAThMJrM0VgobTyYhEIE69HygQ8TONUrd
  1888 sJQrEL0biQI6fk5+8YQ7wJJAy1zb6V/yJDPvmSvdIUh/jKkH4DCbLdJYKWw8m4VABOrQ84EOETvX
  1946 EDoWG7frSKOCn1LCwmbYZYz/9KAYT6kfosEoul1MIxDX1SxWklvR9KHfZII6azIZ6gFBmEliwOFi
  1889 KHVj6Fhs3a4TjQp+SgkLm2GXKf7Tg2I8p36IBqPodjGNQFw3i1hJbkXTh36zGeqs2WysBwRhJokB
  1947 NRQK0wR1VpmAX0uchzpsqvIUfyJ81AIkgLi1Qi2Ji6S3TtFtnNZSDZ1JARGHwxYZUdEmivgRXJQh
  1890 h4vVUChME9RZZQJ+LXEe6rC5ylP8ifBRC5AA4tYKtSQukt46RbdxWks1diYFRByPW2RERZso4kdw
  1948 WOJm6UajNjUNz0AzIF+agxYtW5TDzx74O6CuzCYON3q892KaIab/wTsNwgFczhDVvVItKKwdxcXp
  1891 UcZgiZulm0za1DQ8A82AfGkOWrRsUQ4/e+DvgLoymzjc6PHei2mGmP477zQIB3A5Q1T3SrWgsHYU
  1949 hXj5/HAf3RnYc84tdbzmaKGTrJb24QJWy8gDI8y9jLy4dFmgnsWnR7thriK7Ml1WWOglLuUqv5Vz
  1892 F6cX4tWLw310Z2DPubTU8ZqjhU6yWtqHK1gtIw+MMPcy8uLSZYV6Fp8e7Ya5iezKdFlhpZe4lJv8
  1950 wBYZ2Fll8TO9gZ05zGMWwyqCXid/gFWo8Rtj3Ify7EFa0HcA6q0Iill/s/R7HAyQmQJFxBtrIrXe
  1893 Vi4BW2RgZ5XFT/QGduYwj0UMqwh6nfwBVqHGb4xxH8qzB2lB3wGotyEoZv3N0u9xMEBmChQRb6yJ
  1951 9bMpLMr8NkFnY7rRL8FWgrJEi2kcm8BZOI/J0CSChgAvOENKrWUI6rCs2WElvBEk2ot5o1gjAneO
  1894 1HrXz6awKPPbBJ2N+Va/BFsJyhItpnFsAmfhPCZDkwgaArzgDCl1J0NQh2XNDivhjSDRXiwbxRoR
  1952 mvqKvt5k+Tqb8E74GJXucGRZFwVLMy82aJZgT7wHKwRI5rCxa4jGUMDlFyhb+4A8TB+mC5SlvQUA
  1895 uHPU1Ff09SbL77IZ74SPUemOJ5Z1UbA082KDZgn2xHuwQoBkDhu7hmgMBVx+gbK1D8jD9GG6QFna
  1953 AkOvaLvmwDJbPZoi7xpxWIQxeiVIeEuJ/sKtGYK2WoYYDiR6G9kHRksgJJicVXBWNWgmQ1kzzWBg
  1896 WwAgMPSKtmsOLLPVoynyrhGHRRiT14KEt5ToL9yaIWirZYjhQKK3kX1gtARCgslZBWdVg2YylDXT
  1954 hyQ+151HvAX1AbSoGIHZHGpo3MjQ7/IIlLM4d5WS0w8t8pcvX5ht1JLiK4jYFCeNLsSCjGVUbMCw
  1897 DAZ2SOJz3XnEW1AfQIuKEZjNsYbGjQz9Lo9AOYtzVyk5/dAif/nyhdlGrSm+gojNcdLoQqzIWEbF
  1955 JqATjEfG0RpigzU4twCmVpo1xf4nkRfsjcF6XmjZBj8AdndVVRwdHKzX60hHF/Ly+kAtDr7983ff
  1898 FgxrAjrBeGQcrSE2uAPnFsDUSrOm2P8k8oK9MVjPCy3b4AfA7q6qiqODg7u7u0hHF/Ly+kCtDv74
  1956 /fk568T5nPgHpuNIiw61RQf0Dj3a6HtjgV6blWvxY5L53EiwhpK8MnJFEb8f6mSei6P9kdWfyMWN
  1899 p2+++dML1onLJfEPTMeRFh1qiw7oHXq00bfGAn1nVq7Fj0nmcyPBGkvyysgVRfy+r5NlLo72J1Z/
  1957 mcZ/jSsDCmRiBmUqA20HDUZP1P6T6KUaiCdknW3b4Yj9Em1SrRXzrS70qHLwBMBvmeU1muqGE5R4
  1900 Ihc3Zhr/Na4MKJCZGZSpDLQdNRg9U/vPoldqJJ6RdbZtxxP2S7RJtVbMt7rQo8rBEwC/ZZHXaKob
  1958 BtYNduhzOa2vQzu4ZyPND5gqyunQ8sD+iyvEwOcMw1fGFE9QSxBboMV3SP8zs01M3pHWEEheNFGd
  1901 TlDiK7BusENfynl9HdrBPRtpfsBUUU7Hlgf2X14hBj5nGL4ypniGWoLYAi2+Q/qfmG1i8o60hkDy
  1959 3fOmX4sZ4s4fLu/W13SExswwUcgdKBF+kwcLoG3clRz8aNcW7Z7j2pqPZwiMpQ8M82rHcoiCQ7jg
  1902 oonq7J63/VrMEHf5eHm3vqYjNGaGiULuQInwmzxaAG3jruTgR7u2aPcc19Z8PENgLH1gmFc7lmMU
  1960 WoxdqXO4Gj1ekKY1q2ZQMK5qBAUNTuKUqa3BkY0MESR6N2azzwurWwCdWpFDEx8wqwAt3HE61q7N
  1903 HMIF12LqSp3D1ejxgjTdsWoGBeOqRlDQ4CTOmdoaHNnIEEGid2M2+7ywugXQqRU5NPEBswrQwh2n
  1961 Co4nhDxwLF7QEwku8lHn3XNe2jpNKaDT4lGPKgzYW2i00znw5dAAGItB+cuAW5ptysfWovAa9ADL
  1904 Y+3arOB4QsgDx+IlPZHgIh913r3gpa3TlAI6LR71qMKAvYVGO50DX44NgKkYlX8ZcUuzTfnYWhRe
  1962 OQaEDLboMBO+cX3Awd6gh506Vn9bb6ZxHwhcpCHHoh4EnVA+5hFKBdJUDP2e21jcErc72E6LQ0xl
  1905 gx5gOceAkMFWHWbCN64PONob9bBTx+oP9WYa94HARRpzLOpR0AnlYx6hVCBNxdjvOcTilrjdwXZa
  1963 lolEWm0Rrrby6BWqnYZpkWSoe51FimZpDl6x1YrESM1731mgfRA+7jNmWgI1GRpyOI2OydvzBDDU
  1906 HGIqs0wk0mpAuNrKo1eodhqmVZKh7nUWKVqkOXjFVisSIzXvfWeB9kH4uM+YaQnUZGjI4TQ6Jm/P
  1964 7TB8dl1joMGNwyBGq0SRdUMyLeEfcCsovkHBKKAlQbNgHipl/sT+AJmz89VftrCHJTQyhNt0mxvS
  1907 E8BQt8Pw2XWNgQY3DoMYbRJF1g3JtIZ/wK2g+AYFo4CWBM2CeayU+RP7HWTOzld/GWAPS2hkCLfp
  1965 sRgajnm/J5CMOhoDUpABCbvCSK4jq4MUOMxZIE+44bXcKt0EI1IgZ44FITUDuNNLb4ODTyI8ASEJ
  1908 kBvSsRgajnm/J5CMOhoDUpABCbvCSK4jq4MUOMxZIE+44bUclG6CESmQM8eCkJoB3Omlt8HBJxGe
  1966 Rch3lZKFeCYGsHxtUX2Y7v5DudQEIYZOA3IVdPTi2I1sOFGN41aUw2doP75BZyVFDhw8BZfHDfS7
  1909 gJCEIuT7SslCfCVGsHxtUX2c7v5dudQEIcZOA3IVdPTi2I1sOFGN41aUw2doP75BZyVFDhw8B5fH
  1967 bG6Y1gZdwFn3FbdFCjQyxWEGIxfVK0MYN5j8p2OnRUMsM4hhKG8g70jHjDQK7HJr0LDgBoy35u2x
  1910 DfS7bG6Y1gZdwFn3FbdFCjQyxWFGExfVK0MYN5j8h2OnRUMsM4hhKG8g70jHjDQJ7HJr0LDgBoy3
  1968 9GM3YoF9h2GuDuXqDvZ/YZmoWa5Cipm0YxfuR3NFlzYW2/NkOoA/3gIMRlceJJnq+AVGWf6JQUIP
  1911 5u2x9GM3YoF9x2GuDuXmHvZ/YZmoRa5Cipm0YxfuR3NFlzYW2/NkPoI/3gKMJlceJJnq+AVGWf6B
  1969 etgH3ZsshkXmcblOspAUmKbfsb80HTwsKT0jd/CJtlMHMFGMeB68L0FA6OjzAMQJNQHsymWotNvf
  1912 QUIPetgH3ZsshkWWcXmXZCEpME2/Y39pOnhYUnpG7uATbacOYKIY8Tx4X4KA0NHnAYgTagLYlctQ
  1970 BbtzigMLl7sPPLf58ujlVZe4420RHvvpX6rTu6qMFa5WyovGQoGr1TXgqHRhcnG20YeX+nAbtwll
  1913 abe/C3bnFEcWLncfeW7z5dGrqy5xp0MRHvvpX6rT+6qMFa5WyovGQoGr1TXgqHRhcnG21YeX+nAb
  1971 rmAXKT5++iKQEBzXXcebx029YXjE5t45eR+DOui1e8nVmh2xCyCCWhEZ5SB8PEc+HNnHTm7HxB4B
  1914 twllrmAXKT5++iKQEBzXvYu3T5t6w/CIzYNz8j4GddBrD5KrNTtiF0AEtSIyykH4dI58PLJPndyO
  1972 5FEMs2NRDCTNJ/8MnF0LBWPszzcZxtHaKgM/8Pq7byY9kVEXye++GdwzSosYfWI/bHmCdmROKtg1
  1915 iT0ByJMYZseiGEiaT/4ROLsWCsbYX24zjKO1VQZ+4PU3X896IqMukt98PXpglBYx+sR+3PIE7cic
  1973 21LGKbkaTh8KKmYN69g2xYj1OW3/NI9d9ficGi0b++5vgR8DBUPqEnyE5+OGbN2p4sd3p7bC03Zq
  1916 VLBrtqWMU3I1nD4UVMwa1rFtignrc9r+aR676vE5NVo29t3fAj8GCobUJfgIL6YN2bpTxY/vTg3C
  1974 B7DObtV89mgRYG+fT3+DHbLSQbXbOEnpXAEmv7+PytVs7jle0a89PEg7FYxDgr79l7p8DtwQcjRh
  1917 03ZqB7DObtV89mgRYG+fz3+BHbLSQbXbOEnpXAEmv7+PytVs7jle0a89PEg7FYxDgr79l7p8AdwQ
  1975 1J2OdsZOTMC5ZxdsPkWsuqjs6RyC5gjMywtwjz+7ULUFM4z7nI8XDntUkzfjPmfia9Qqfv4QDWSB
  1918 cjRh0p2OdsZOTMC5ZxdsPkWsuqjs6RyC5gjMywtwjz+HFU6ve+B7Bge/r7p8IiBvTqMeMmpbbIZ4
  1976 eTQY9JF9Kzv+f8zy+b9mkg+cijm5/gOt4SMB/VEzYePB0LTx8GH1L7trdw2wB5inLW7nDrewOzSf
  1919 wQclhz1K9gnzfvqMf9dZP27mw4L1/zHLF/+cST5hKgaaNh4+rH5iuXbXAHuEeRpwO3e4hd2h+axy
  1977 VS6Mc8cqSYmnqLueijWlK1BsFU+KAMqc/b4eOLiM+tD7bV2WfHRNKrCQ5T4ex44FZmoZz6/XxOyJ
  1920 ZZw7VklKPEfd9VzcUboCxVbxpAigLNnv64GDUqoPvd/WZclH16QCC1nu43HsVGCmlvH8ek3Mnjj4
  1978 gw+yQkxssxnFqp28nrxPjYQ6+mxnEjb7hn45W+YmZiWz26SEvqBwh+GPH386DftNCMZxodPDrcjD
  1921 ICvExDZbUKzayevJ+4Qv1NFnO5Ow2Tf0c+c6NzErmd0mJfQFhTsOf/j442nYb0IwjgudHm9FHu83
  1979 /QaE+wimDTVxwsf0YQo9pss/L1XtrYtPUJMRYCLCmmy99sEPBJs4Qv8a3BMR8g5s+Zgdd+izpZzd
  1922 INwnMG6oiRM+pQ9T6Cld/nH10d66+AQ1GQEmIqzJ1iVsJxBs4gj9a/BARMg7sOVjdtyhL9ZycTOT
  1980 TCSlDiCbYlcnKP4WXyMmNqPAz/9S8YKS2GAms7RGWrHjjdmHizqb0flIJcG/0qnCmDpECQEc/luk
  1923 lDqAbIpdnaD4W3yNmNiMAj//S8UrSmKDmSzSGmnFjjdmH67qbEHnI5UE/0qnCmPqECUEcPhvlcbX
  1981 8bUYUuc5hp40N1J06jYutfdZlDkmp4o6mR9cJ3Mhf6/jFLf1crEAXPDwSr+KeHiKQIl3nNPASYtK
  1924 Ykydlxh60txI0anbuNTeZ1HmmJwq6mR5cJ0shfy1jlPc1svVCnDBwyv9KuLhKQIl3nFOAyctKrmo
  1982 zuoyqTZAgljl+uyP0h+chtMNT3ToIcnHPExATIg4Ep9w2vieCTc35DLBAf/EAyeJ+27s4CQrRPQc
  1925 y6TaAglileuzP0p/cBrOtzzRsYckH/MwATEh4kh8wmnjeybc0pDLBAf8Ew+cJO67sYOTrBDRc3if
  1983 3mf5BEedUI7vmJHqnsvT46A9Qg4ABgAU5j8Y6cid/0bSK/eAkdbcJSpqSY+UbqQhJ2cMoQxHGOng
  1926 5TMcdUY5vlNGqnsuT4+D9gg5ABgBUJj/aKIjd/4bSa/cA0Zac5eoqCU9UrqRhpycMYQynmCkg3/T
  1984 3/TTZ0SXt7Zgeb0dy+vdWF63sbzuxfLax/J6N5auSODC2qCVkYS+wFX7WKM338aNOfEwp/Fsye0w
  1927 T58RXd4awPJ6GMvr3Vhet7G87sXy2sfyejeWrkjgwtqglZGEvsBV+1ijN9/GjTnxMKfxYs3tMPcT
  1985 9xNzPAGiKMwG28gUp0B7kS0+3yMgpLadA2d62OTPJJxUWuYcAtcgkfvxEEtv5k3yutOZsnF0Z56K
  1928 czwBoijMBtvIFKdAe5EtPt8jIKS2nQNnetjkzyScVFrmHALXIJH78RBLb+ZN8rrTmbJxdGeeinFn
  1986 cWe35RD5fQ+iiFLFptSd5W0eV3HkycV1mk9BbC264wbAWLTTiThWmt1OphzdbVmqwcV/ff7x4wds
  1929 h3KI/L4HUUSpYnPqzvK2jKs48uTiOs3nILYW3WkDYCra6UQcK81uZ3OO7rYs1ejiPz//8PEDNkdQ
  1987 jqAGJr2BuuEiomHBqQyfxuW16kpTs/krgB2ppZ+IQ900wL0HRtZ4lD3+5x1leCDjiDVlKOSiAA+A
  1930 I5PeQN1wEdGw4FTGz+PyWnWlqdn8FcCO1NJPxKFuGuDeIyNrPMoe//OOMjyQccQdZSjkogAPgLK6
  1988 srpsMzf3KQxbz3WSlH7OTM6HTcdikFWDZlJbiHRycfHu5PPJgEJ+g/8duAJjaOtLh4uPaWEbdP03
  1931 bDM39ykMW891kpR+zkzOh03HYpRVo2ZSA0Q6ubh4d/L5ZEQhv9H/jlyBMbT1pcPFx7SwDbr+m9vc
  1989 t7mlOPYBodaxrcb4uXPyaN1wxP021oDt+PCtB4cPMdi9YQJ/lv9SSsGSAKEiHfx9DKEevAf6qm1C
  1932 Uhz7gFDr2FZj/Nw5ebRuOOJhG2vAdjzf1oPDxxjs3jCBP8t/KqVgSYBQkQ7+PoVQj945/Kb9UIc+
  1990 hz6GETvJf+7JGjsr9p0je46L4oh+37FDewD/sBP3GBMggHahhmZn0GymWkrfmtcdFHWAPtDX++ot
  1933 hhE7yX/uyRo7K/adI3uOi+KIft+xQ3sA/7AT9xgzIIB2ocZmZ9DslVtK35rXHRR1gD7S1/vNe832
  1991 WHvr1d7J+BS1k+hxAB3K2mbb3T/vnIaNnpLVm9Mfzj6cn725OPn8o+MCoiv38dPBoTj96Yug/BA0
  1934 1qu9k/EpaifR4wA6lLXNht0/75yGjZ6S1ZvT788+nJ+9uTj5/IPjAqIr9/HTwaE4/fGLoPwQNGDs
  1992 YOwTxZgaUWEmEhgWt9BJzHP4r8bIz7yuOEgMvd6dn+uTmhWWumDuM9qcCJ5zGpOFxkEzjkLbhzr/
  1935 E8WYGlFhJhIYFrfQSSxz+K/GyM+yrjhIDL3enZ/rk5oNlrpg7jPanAiecxqThcZBM45C24c6/wgx
  1993 CDFK9QbJqSmidB2qOcL90orrWVSu86OpVGmKzmqtt166VszUlNG5dgTSB41dUjAITjGDV5TFXpld
  1936 SvUGyakponQdqjnC/dKG61lUrvOjqVRpjs5qrbdeulbM1JTRuXYE0geNXVIwCE4xg1eUxV6ZXWHJ
  1994 YckngLrOqgcpbaNtYkhKQcFOuoBz/mVOV7xAKXWGJ01nregvQxfX8CpSRZrATu5VaGVJd8P0mIZx
  1937 J4C6zqoHKW2jbWJISkHBTrqAc/5lTle8QCl1hidNZ63oL0MX1/AqUkWawE7udWhlSXfD9JiGcfRD
  1995 9EN7wM149WlApzuMrBvyrLdigVbrVchz0/1HDaP9XgOGDYO9g3lnktJDKAMbk9tEiI34JCeUd/DV
  1938 e8DNePVpQKc7jKwb8qwHsUCr9Trkuen+k4bRfq0Bw4bB3sG8M0npIZSBjcltIsRGfJITynv4apde
  1996 Lr1eAwULhgd9FS6iYboEZh/D5losE9hAAE8uwfriPgEgtFbCPxA4cqIDMsfsjPDtar7/l1ATxG/9
  1939 r4GCBcODvgoX0TBdArOPYXMt1glsIIAn12B9cZ8AEFor4R8IHDnRAZljdkb4drPc/3OoCeK3/vnn
  1997 6689zasy3f+bKGAXJDiVKOwhptv4HWx8IhmJ04/vRyEjR6m54i81lgeAQ0IBUEfaKX+JT9AnQyXT
  1940 nuZVme7/TRSwCxKcShT2ENNt/A42PpGMxOnH95OQkaPUXPHnGssDwCGhAKgj7ZS/xCfos7GS6Urn
  1998 hc4v8fUBvtB+Ar1udS9lUeru/a5xiBLwRA3Ja3iiDP1CTPeysMc4lVELNFY+WMywgtBNQzCfPfFp
  1941 l/j6AF9oP4Fet7qXsih1937XOEQJeKbG5DU8U4Z+IaZ7WdhTnMqkBRorHyxmWEHopiGYz574tJZp
  1999 KdNU57ufvTs/Bd8RizFQgvjc7RSG43gJHqHr5DuucGyBwgN2eF0iG5fowlKSxTzymvUGrVHkqLeX
  1942 qvPdz96dn4LviMUYKEF87nYKw3G8BI/QdfIdVzi2QOEBO7wukY1LdGEpyWIZec16g9YoctTby8uw
  2000 l2HXiQLD3V6dKHAZJ8pFe4jTZlimnCBCVoa1MMvKrN1qgxR22xDFUWaYJSYXJSWw+jwBvExPY94S
  1943 60SB4W6vThS4jBPloj3GaTMsU04QISvDWphlZdZutUEKu22I4igzzBKzi5ISWH2eAF6mpzFviWCv
  2001 wV4JSz1MBJ5PkZOsMhmLaTIDPQoqFxTqGIQEiYv1jMR5ecYx8LxUpgwKHhabMrleVni6AZ0jKsHA
  1944 hKUeJgLPp8hJVpmMxTRZgB4FlQsKdQpCgsTFekbivDzjGHheKlMGBQ+LbZlcrys83YDOEZVgYPMf
  2002 5j+dfDk/+0BlCYcvG6+7hznHtBMYcxLJMaYIYrQDvrhpf8hVk0kfz+pXCAO1D/xpv+LslGMeoNOP
  1945 T76cn32gsoTDV43X3cOcU9oJTDmJ5BhTBDHaAV/ctD/kqtmsj2f1K4SB2gf+tF9xdsoxD9Dpx4FF
  2003 A4v4p/2K69COnZ0gzwAUVF20xQM3AE63PrlpZIFxtftg/LgpgA1mPhiKRWLZi070cOfX5UTbsmVK
  1946 /NN+xXVox85OkGcACqou2uKBGwCnW5/cNLLAuNp9MH7cFMAGMx8MxSKx7EUnerjz63KibdkyJRT3
  2004 KO5jXj7iAGdR2JQ03dlNSWt/9BwXBZ5zzYf9jeBtn2yZzxS63nTebEt+cz8dKcSSWMCo29ofw2SH
  1947 MS+fcICzKmxKmu7spqS1P3qOqwLPuZbj/kbwtk+2zGcOXW86b4aS39xPRwqxJBYw6rb2xzDZYZ2m
  2005 dZrq6TjMto1baFurbeyvmRMrddrNMhRlIOLQ7TxymaxfCevmzIFeGnUHmPheo2sksVeVD37NBtrD
  1948 ejoOsw1xC21rtY39OXNipU67RYaiDEQcu50nLpP1K2HdnDnQS6PuABPfanSNJPaq8tHP2Uh7GB4m
  2006 8DCxxO7sU0xHKmMhI4CRDKlrf2rwodAigAKh7N+hI7nj0dNDb46ONbh/jlp3gW38ERShzsWlGo+8
  1949 ltidfYrpSGUsZAQwkiF17U8NPhRaBFAglP07diR3Onl+6M3RsQYPz1HrLrCNP4Ai1Lm4VOORl8CJ
  2007 BE6EL7+z48ivCC3Uo0cidDyVTGa5zRPDz3qJXuULf469MkBBTBS7Ms6u5ZBhjQ3MZz6xt4RgSdt6
  1950 8OVXdhz5FaGFevRIhI6nkskst3li+Llbo1f50p9jrwxQEBPFroyzazlmWFMD8yuf2AMhWNK2Hqkv
  2008 pL5MrvoMizgD5/RuC4d35aL/4MSg1mKETrsbuWmrI5882KC3FGQnwXzwZbwG3V/U1ZBXcss5dG8t
  1951 k6s+wyLOwDm9H+Dwrlz0H5wY1FqM0Gl3I7dtdeSTBxv0loLsJJgPvozvQPcXdTXmlRw4h+6tpRuG
  2009 3Xao90PE7ENoqk/fhyGGY34Pt6xPA7iXGhoWeni/bzmF5bUxjqy1j62qptC+0B7srIStWaXoWMYp
  1952 +jBEzD6Epvr0fRxiOObXcGB9GsC91NCw0MP7deDsktfGOLLWPraqmkL7QnuwixK2ZpWiYxmnONH4
  2010 TjS+qPUCGoN73Jj8gX2qE4Xs7546MScmZIHy4C5Ib24D3aAVThhwuRJXjiaUDt9U0+h3c3krUzAa
  1953 otYLaAzucWPyR/apThSyv3vqxJyYkAXKg7sgvbmNdINWOGHE5UpcOZpQOnxTTaPfLeWtTMFogJEd
  2011 YGSHWO3wm612GEU2nNKbB/bV2F1sLjb9uNGbBrMjU46BnpkqYP2iTFYHiE5vxGcXZg0yuNS/6i1J
  1954 Y7XDL7baYRLZcEpvHthvxu5ie7Htx43eNJgdmXIMRIAKMXoDPbsQanDAFf5Z70Ti7Iac47d/PZuK
  2012 nN2Ql/z2r2dj8fbDz/DvG/kRTCkWP47F3wAN8TYvYX/J1bt0rQJWclS8ccxrhRWSBI2OKvgGCnTb
  1955 tx9+gn/fyI9gQbHmcSr+BqOLt3kJ20ou2qXbFLCAo+L9Yl4rLIwkaHRCwRdPoLd24ZEXT0N0ZYlf
  2013 Ljw647GILjHxa0usphSYVVuu+NoTQJEnSBXtjZ9gCifgt6nsanmjxlPsW5SBfok02F7sggUiB7pl
  1956 UmIVpMBk2nLDt50AijxBKmRv3ANTLwG/TUFXywk1DmLfWoz0S6TBcI0L1oUc6JbRutqkaCac4Eiz
  2014 tKxWKdoLJ0rSrObl4Pzs7emHT6dRdYccbn4OnCiKn5CF09FnxCWeh42FfTKr8cmV4zj/KNOix2/W
  1957 iJej87O3px8+nUbVPTK2+Tlygid+HhZORx8Nl3gMNhX2yaLGJ1eOv/yDTIsed1nvNU29DO41RQjb
  2015 m05TOIObThHCvqSwG02+UiO2m4u4xMiBKDbzfBZhS2B5rtWr1uBIj5z95b2G3rOyCGs40qdojTeP
  1958 kcLuL/kmjdjuKeISAwai2C7zRYQtgdO5RK+6A/954mwrH7TvnnFFWOOJPjxrnHh8DNQQP7f1zwga
  2016 j4Ea4te2IhpAQ+qj50Q9CaF4ikVj/Dga9JvisaDQNvx5erOeu5FxXf1DE2xj2sx66He3unDJdNbw
  1959 Uh89J+pJCMVzrBXjx9Go3wJPBUW04c/zm7ulGxDXRT80wTamzazHfnerAtdMZw3PchLhdWyXwdSB
  2017 LCcRXsd2GUxBaJrEajWduYWCHzOhb0QBLUfnHHIR12klZAaSS5t8upoCNL1b28cSwqzC5owK3ihM
  1960 pkmsNvOFWx/4MRP6IhRQbnS8IVdxnVZCZrCVor093UgBCt4t6WMJYVZhK0Z1bhSdSe/irXJyj2Il
  2018 k67jjXKSkGIlBjjqgKrr8UCGIoawB/8pvmF7gEWHouZaaIBOiNL+KXe6qnq2ZAnmLRFRryfxYJ1k
  1961 RjjqiIrq8RyGAoWw9f4xvmEzgLWGouYSaIBOiNK2KXe6qnqxZgnmnRBRryff4C7JXrnJL5rCPChv
  2019 L918Hk1hHpR3yLPGkYV5otvIGF3LSs+fHwxHly+aTAeKSs+8yt5ZAVbPZZM9UJ3F06dPB+Lf7/d+
  1962 jBeN/wrzRG+RMbqWlZ4/PxhPLl82CQ4UjF54Bb2LAoydyyZ7oDGL58+fj8S/Pez0MCpRmuc34I0B
  2020 GJUozfMbcMsAdq/Xck6vt1huPTm7Wl3P3ryJgB9nS3kJD64oem6f1xmFJnd0pQWR9q+BEeLahJYZ
  1963 7F5n5ZxeDxhsPTm7Wl2H3ryJgB8Xa3kJD64oaG6f1xlFJHd0pQWR9q+BEeLahJYZTfuWOeZYXcnn
  2021 TfuWXeagXckHzdyCD6y05fglS+jeIwwtSVS2+vooDDsZaSKWBMUQxmqWJCGHKWA9NnmNRXkYZtT8
  1964 y9yCz6m0wfhLltB1RxhRkqhs9a1RGG0y0kQsCYohjNUiSUKOTsB6bPMaa/Ewuqj5Rd4DxycIZopv
  2022 Iu+A4xMEM8a3eELGW+0lepiUQGu5x6JzLAYEeEC5ZTwaVTVTWRrgObnYaDQnZ1lSNfUkz93DU30X
  1965 8WCMd9hrdCwpb9Zyj0XnWIwI8IhSyng0KmamajTAc3ax1WjOzrKkaspIXrhnpvoKgMreYqT5SsR3
  2023 QGWvM9J8JeI1SoaZR4sYTn2nx6qNh53vZFFvx5LPLt2AY2uW/Po+3IG1QdLyxcJgCg/NIs1yWc6M
  1966 KBlmHi1iOGWdHqs2jnW+k0W9jUq+uHTjjK1Z8uuHcAfWBknLVyuDKTw0i7TIZbkw5hRXLFkklQPG
  2024 OcUVS2ZJ5YAx7RAOd6ZbnMj6REEPSgNQ72QV5lai7ds/2XVxMf1I58j7ZiSdPlTZm7E4OBRnrQTD
  1967 tEM43JkubyLrEwU9KI1AvZNVWFqJtm//YNfFxfQjHR/vm5F01lBlL8TimFCctfIKo6gZn6JPlpCW
  2025 KGrGpzCUJaTlW/NlBKN8oLC29gS8scSfdFAViwm8CzzcusY60xdzcP5Gc1sHwKHLoKyCtOzo6Qjn
  1968 b82XCYzygaLZ2hPwxhJ/0LFUrCHw7u1wyxnrTN/HwWkbzSUdAIfugLIK0rKjpyOci8csfGbagVs0
  2026 BjILn5l2y3Ua+KEtOuF2m5RVHacTff/DBB22iT1Y13jaeridlZ7WWwEnPwcPeF+n7oPjYLJskJ6Y
  1969 8EM7c8LtNimrOk5n+tqHGfppM3uervG0ZXA7CzyttwK+fQ6O777O2AfHwSTXID0x49ZUZByLlY5M
  2027 emtKM47FQocoIrfEzK/GKnL08g7ZVwKfAikzn5jCaBNEurTsaitOdc6mo+IR1DNTxbTFMzflM53K
  1970 RG5lmV+EVeTo5R2yrwQ+BVJmOTP10CZ2dGnZ1Raa6gRHR8UjqK9M8dKAQ26qZjoFJy7mU0pvMuUO
  2028 ExfzMeU5mbqHLV60waV9kYV4fSyGL8bi29ZGaFZs8GInQPnJPHoyD32fjLpeHh02dqa78WxB2Ark
  1971 A86zn29JV1eI78T41VQctnY+i2KLNzkBss+Woe+KUTeYihMMMHNs34shvjsW45dT8ccd0KOBAY4O
  2029 5dWjp5smU5pe2Jdzfn9fnXSIG8AVyM4ikfP9JwqxY5y/FqqG0sxrO6fQjLEkfc9mPelq7KZGhUrR
  1972 3RHa+9gWhEEgr66eTMY0mRPZwr4U9of76hxG0PSM4+SqTf4umb4lKv1ri0pcIagTlV+2E5VbYw/u
  2030 puDVrxuF4qgW43/aQUyZt9YDXBGLQssWyFbxm8STVvKfvbcNEwM1ev7Koucy6Tucwm94Wwq81wR1
  1973 WzsfH8lwA4pjlcjl/jOFJNRIN7p5mMEJPyyg37M5Wrp2vKmoocK5OWxG7ho96GhE4zbbQUxRulZf
  2031 HZ2th5Y6rd6C7dmT69pJPoJqGjYcf69H9ShRaueId1rh8WQjcS7rP4KHQ7pZhpjmWetY+F/JPJy0
  1974 XL+LuoYNp71zwKTJtFIV7S1zmMao0WsRFQDM+o7S8Bve7QLvNSlc/2zwiFUXAViwPREEXenJB2ZN
  2032 v+1wsYPld9/swtNVML1lEj0Lurt2gZe6XbDQLLf59Ie6PEbp6/pVAuNAaUQHvD5z+SP5a0eYD8y3
  1975 w0ZQH3QEn6QBHmAUEeJhaqMoXMl6goiEdA8OMdFXrUNsh+N/d+bhEoOho9AOlt98vQtPVzB7izp6
  2033 uuQ2L3iF1yvSWS/allS6/gfvSfkeLXQIaBNO6VmwFuCS1As8mr2l2yJPFKWR4aUv3xy+GJtaWwak
  1976 FnR3pYUnsra8ollu8+kPzHmM0tf1NwmMA6URHXBWzVWV5GYeYfYy30GT2yzmDV4GSSfTaBJT6bpN
  2034 J/AyevlMX6pI3cx1Ar6zOtabIHip+x1G/+YASyq/t33V2RbQtI5btyv5g4UUjxpFE0uHxnLcX1nR
  1977 vJXmW7/Qj6HYASWTwVqAJ1Wv8CD5lu62PFGU9IZX1Hx9+HJqKoMZkJ7Aq+jVV/oKSOpmLj/wfeyp
  2035 rFks8BbChpjspNorNd6D2zAFh8FcJ5qD5wM7u6gPXVdjNNK7TbVtEeCtwUP72SY5D+raKFJEepew
  1978 3rvBS93vMPoXB1hS+b3tq85uhqZ13LoLyh8spOjZJJpZOjSG6eE6kGbNYoF3JjbEZN/aXgDyHryd
  2036 bVOeuxTno0VB9+q3ILgXR85fxvwGfaq6OLKxKmNT8Cxx6OZH4qe66a3kYnuCxrW6CXdNn/vvmrtu
  1979 Ofg55vLTHBw22JBGfei6GqOR3iHVNiDAD5uMIcl5VNdGkSLSu4RtSHnuUpxPFgXdq9+CYAgBOX8d
  2037 EdiZm/SAztz9ik2XBrrvdivaRwOOE2hCPKjooNH4/cbEtQNjnZXSH/PWHyS/2wlnusWs3AfG5MBg
  1980 8xt0BeviyIbYjE3Bk8+xm82Jn+qmt+6M7Qka2+om3DV97r9r7rpFYGdukhk6c/frS10a6L7DVrSP
  2038 BJ3YU2NvzP4qnrnfMcVqn684dgt0e52N1rQ7NqPN8Q/xFDidBJ/bmn3KEZprDuSNB91ZN+Gs04m8
  1981 Bhze0IR4VIlEo/H7jYlrB6Y6h6Y/Qq8/SH63E850wKw8BMZk7GC8n9hTY2/M/iZeuN8xIWyfL2R2
  2039 vlaTGO9LnNBulTKkOtsQs/95T9fdyVhtzLYFrwECEIabdC6rm64OjAG6ku9t5gQj574XQUNTGq6T
  1982 y4l7nY3WtDs2o83xj/EUOPkFn9sbBiijaak5kPdLdMPejHNkZ/L6Ws1ivN1xRptsyufq7J7Mtu09
  2040 16uSOZsEvUcCcBGHHqm/CW1zYu4glRgxVnVZlLCtHOjbfTnzpS9ZuAFqImGrWN0Y1E2Psb7slRQr
  1983 Xc4nY7U1uy28tAhAGG7Smbducj0wBuhKvmWa06Gc22kEDU1Jw04WskqWbBL01g7ARRwxpf4mEM9p
  2041 pVuZol4OeLbSZoAIbMQ7pmEyse+AV543FxckY8sMMqtXsoyr5tIe/4w9Ea+dEaiMGxfXiXM1Utni
  1984 xKNUYqBb1WVRwm54pO8i5jydvtTmBqgJ4G1idWNQNz2m+mpaUqyUHGZKkDlO20ryASKwEe+YhtnM
  2042 EhexxPKGgxRGmuz3Z7BD83anO24qGFlt93B2oh46dvqYSxAcY2S4OLmzF/a5F0XN6bJo1zu0zRqu
  1985 vgNeedFcs5BMLTPIrN7IMq6aK4b8jIAENl3NCFR0jovrhOcaqWxxiYtYYnnDQQoDZPb7V7Cx9DbV
  2043 s5cUwTKY2+dIR+qgE7/VN2Lxra0cEkf/0uEfkHe3ltHP67bqjL1bi4bzzFUI3SuQsAafjHPfzYYd
  1986 O+5VmFht93h2oh465PuUKxscY2S4OLm31wu611ot6Wpr1zu0zRqus1cqwTKYu/JIR+pYGb/V93fx
  2044 DujeYdjaodrxfX1hGaXjYW5pbKmoffJehdOMNmpCMZiCeU8oxk+zf2QoxoP/wFCMvocSDI3GR+uB
  1987 HbMcyUf/0uEfkHe38tLPQrfqjL1bi4bzzFUI3Qub8MYAMs599zB2OKB742JrA2zH9/WFZZSOhznQ
  2045 3sT7e2I2rB7cSx0bRoA+EyASHgm3rgQ0pnLoprEXuUruBvaKZtaVTm2cMQ/Ikd3bvggEX96o3Jxf
  1988 2FJR++S9CqcZbdJEkDBh9IEIkl8U8MQIkgf/kREkfWsmGBqNj9YDvWUCD4SaWD24V1A2jAB9ZkAk
  2046 73K1XaEYX7ro8Q/nH9+cnBMtJhcnb//z5AdKc8Jzh5atenCsKsv3mdr7XkK1G7fSqSl9gzfY9ty5
  1989 PMBuXWBoTOXYTbovcpXcj+yF0qwrnUo+Yx6QI7t3kxEIvmpSuRnK3lVwuyJIvnTR4+/PP745OSda
  2047 ylVBGkLnfedUvwdCfwVY34K2FZn7eluHTiVNtxMgvnvaLajbVHYv5I5fpqs23ISUVuZzoJ9ymqr5
  1990 zC5O3v7HyfeUlIXHJS1b9egQW5bvM7X3vfRvN9ymE2n6Bm+w7bkhlmuYNITO+04OQg+E/nq1vgVt
  2048 5Zz1m0fmyIvFoTnSMu+bUwgto50g7baFcxJGu+pE+6v6Xs0tAeSRTVumFcDDB+Qve/ZgalBshJsd
  1991 KzL39VCHTt1PtxMgvnvaLahDKrsXcscv0zUmbvpMK0870E85qdb8cjITzCNzUsfi0JzEmffN4YmW
  2049 lPb/OINyrbF+z9xJA1I4k87diHQtIoOq/P9DRwnKLsa9HTuKY3vbNbXjcxZlr3HHQ9SZjAxBvAK6
  1992 0U5seWjhnPTWrjrR/qq+BXQg7j2xSda0Anhmgvxlj0xMxYwNzLOD0v7ffFBmOFYbmht0QAoX0rnJ
  2050 QXd+rrDPZbqFCkHACk/f/MeIGP2nTybtOf4TJS73qVR3H5XNlf2Fa6ad278meFpf2Ru0FKf88Hkl
  1993 kS5xZFCV//8TKUHZxbi3Y0dxau/mpnZ8PKTspfN49ruQkSGIV+436s7PFfalTAeoEASs8PQ9hYyI
  2051 NF7UqXsCb/t0OpDTR8c6+cKpDQHNdwB0bsRTAXujv8QKcboRIWwctUuG6aZER339nYM82k0He0Or
  1994 0X/6QNWmHzxT4nKfCov3Udlc2V+4Ztq5/WuCSQaVve9LcYISH7NC41WduokDtk+nAzl9dBqVr5xK
  2052 52J/WyGnW8goxIvtDeetWknd45B7qHt6qNqUyzkWGPMet1VoitcEmc8FBV2Z5TkfeBitt/3w9fby
  1995 FtB8B0DnRjwVsDf6S6wQ51sRwsZRu2SYHEt01Jf1Ocij3XSwN7R6IfaHyk7dskshXg43XLYqO3WP
  2053 xZGN0iO/42tHkVB+1sAx7JdOfuPOaxqd7sQs5ZgS4HCv5tT36hZXDlT2CbbtbTpFHlv2PyZhgCEN
  1996 Q+6hHuihalPc51hgzNIcqicV3xFkPs4UdMGX53zgGbre9sPX28uXR/ZwAfkdXzuKhLLJRo5hv3Sy
  2054 vPf9ITPTw7vMftDG1LLeEUxJDJ+oEU3LKYvRuNsno+50G7XVBcIlPg8A0lGBAAvBdHSjk3K54bzp
  1997 MXdeKul0J2Ypp5Suh3s1JySsW1w5UNknGNrbdEpSBvY/Js+BIY289/0hM9PDu3p/1MbUst4RTEmM
  2055 4XO9G5zWdMGte1QTOlJB6Vc+R3AP4/s1+LW7U2nug7oziqY/N2hzoF5yEG72HbjVyAuFbDcJ7ak3
  1998 n6kJTcsp4tG42yeT7nQbtdUFwgVJjwDSUYEAC8F0dKOTILrlLO/xC70bnNd0Ha97whQ6UkHJYj5H
  2056 fLDFBeAq5/7+Lx7Qv5sYaLsf7vKrbauXvZV17MtiLimm2LRIZB5HYGRAbw5JW2MBghF0vNiloaPL
  1999 cA/j+zX4tbtTIfGjujOKpj83aHOgXnIQbvYduNXEC4UMm4T21Bs+GHABuCa7v//LR/TvpjHa7oe7
  2057 UM3ckC/Q8aP8VLy+mjYY5MxOtAdgjULwf2RtvCc=
  2000 /Grb6lVvHSD7spj5iplBLRKZxxEYGdCbY9LWWC5hBB2voWno6DJUMzfkC3T8KJsWL9umDQY5szPt
  2058 """)
  2001 AVijEPwfucjncQ==
  2059 
       
  2060 ##file ez_setup.py
       
  2061 EZ_SETUP_PY = convert("""
       
  2062 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
       
  2128 qL7+C1AkCcw=
       
  2129 """)
       
  2130 
       
  2131 ##file distribute_from_egg.py
       
  2132 DISTRIBUTE_FROM_EGG_PY = convert("""
       
  2133 eJw9j8tqAzEMRfcG/4MgmxQyptkGusonZBmGoGTUGYFfWPKE6dfXTkM3gqt7rh47OKP3NMF3SQFW
       
  2134 LlrRU1zhybpAxoKBlIqcrNnBdRjQP3GTocYfzmNrrCPQPN9iwzpxSQfQhWBi0cL3qtRtYIG/4Mv0
       
  2135 KApY5hooqrOGQ05FQTaxptF9Fnx16Rq0XofjaE1XGXVxHIWK7j8P8EY/rHndLqQ1a0pe3COFgHFy
       
  2136 hLLdWkDbi/DeEpCjNb3u/zccT2Ob8gtnwVyI
       
  2137 """)
       
  2138 
       
  2139 ##file distribute_setup.py
       
  2140 DISTRIBUTE_SETUP_PY = convert("""
       
  2141 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
       
  2228 """)
  2002 """)
  2229 
  2003 
  2230 ##file activate.sh
  2004 ##file activate.sh
  2231 ACTIVATE_SH = convert("""
  2005 ACTIVATE_SH = convert("""
  2232 eJytVVFvokAQfudXTLEPtTlLeo9tvMSmJpq02hSvl7u2wRUG2QR2DSxSe7n/frOACEVNLlceRHa+
  2006 eJytVVFvokAQfudXTLEPtTlLeo9tvMSmJpq02hSvl7u2wRUG2QR2DSxSe7n/frOACEVNLlceRHa+
  2246 +n8O9H8f5vsGOWXsL1+1k3g=
  2020 +n8O9H8f5vsGOWXsL1+1k3g=
  2247 """)
  2021 """)
  2248 
  2022 
  2249 ##file activate.fish
  2023 ##file activate.fish
  2250 ACTIVATE_FISH = convert("""
  2024 ACTIVATE_FISH = convert("""
  2251 eJyVVWFv2jAQ/c6vuBoqQVWC9nVSNVGVCaS2VC2rNLWVZZILWAs2s52wVvvxsyEJDrjbmgpK7PP5
  2025 eJydVW2P2jgQ/s6vmAZQoVpA9/WkqqJaTou0u6x2uZVOVWWZZEKsS+yc7UDpr+84bziQbauLxEvs
  2252 3bt3d22YLbmGlGcIq1wbmCPkGhPYcLMEEsGciwGLDS+YwSjlekngLFVyBe73GXSXxqw/DwbuTS8x
  2026 eXnsZ56ZIWwTYSAWKUJWGAs7hMJgBEdhEwiMKnSIsBNywUMrDtziPBYmCeBDrFUG7v8HmCTW5n8u
  2253 yyKpFr1WG15lDjETQhpQuQBuIOEKY5O9tlppLqxHKSDByjVAPwEy+mXtCq5MzjIUBTCRgEKTKwFG
  2027 Fu7NJJim81Bl08EQTqqAkEupLOhCgrAQCY2hTU+DQVxIiqgkRNiEBphFEKy+kd1BaFvwFOUBuIxA
  2254 gpBqxTLYXgN2myspVigMaYF92tZSowGZJf4mFExxNs9Qb614CgZtmH0BpEOn11f0cXI/+za8pnfD
  2028 oy20BKtAKp3xFMo0QNtCK5mhtMEA6BmSpUELKo38TThwLfguRVNaiRgs0llnEoIR29zfstf18/bv
  2255 2ZjA1sg9zlV/8QvcMhxbNu0QwgYokn/d+n02nt6Opzcjcnx1vXcIoN74O4ymWQXmHURfJw9jenc/
  2029 5T17Wm7vAiiN3ONCzfbfwC3DtWXXDqHfAGX0q6z/bO82j3ebh1VwnbrduwTQbvwcRtesAfMGor/W
  2256 vbmb0enj6P5+cuVhqlKm3S0u2XRtRbA2QQAhV7VhBF0rsgUX9Ur1rBUXJgVSy8O751k8mzY5OrKH
  2030 L3fs6Xnz8LRlm9fV8/P61sM0LDNwCZjl9gSpCokJRzpryGQ5t8kNGFUt51QjOZGu0Mj35FlYlXEr
  2257 RW3eaQhYGTr8hrXO59ALhxQ83mCsDLAid3T72CCSdJhaFE+fXgicXAARUiR2WeVO37gH3oYHzFKo
  2031 yC09EVOp4lEXfF84Lz1qbhBsgl59vDedXI3rTV03xipduSgt9kLytI3XmBp3aV6MPoMQGNUU62T6
  2258 9k7CaPZ1UeNwH1tWuXA4uFKYYcEa8vaKqXl7q1UpygMPhFLvlVKyNzsSM3S2km7UBOl4xweUXk5u
  2032 uQdeefTy1Hfj10zVHg2pq8fXDoHBiOv94csfXwN49xECqWREy7pwukKfvxdMY2j23vXDPuuxxeE+
  2259 6e3wZmQ9leY1XE/Ili670tr9g/5POBBpGIJXCCF79L1siarl/dbESa8mD8PL61GpzqpzuMS7tqeB
  2033 JOdCOhxCE3N44B1ZeSLuZh8Mmkr2wEPAmPfKWHA2uxIRjEopdbQYjDz3BWOf14/scfmwoki1eQvX
  2260 1YkALrRBloBMbR9yLcVx7frQAgUqR7NZIuzkEu110gbNit1enNs82Rx5utq7Z3prU78HFRgulqNC
  2034 ExBdF60Mqh+Y/QcX4uiH4Amwzx79KOVFtbL63sXJbtcvy8/3q5rupmO5CnE91wBviQAhjUUegYpL
  2261 OTwbqJa9vkJFclQgZSjbKeBgSsUtCtt9D8OwAbIVJuewQdfvQRaoFE9wd1TmCuRG7OgJ1bVXGHc7
  2035 vVEbpLt2/W+PklRgq5Ku6mp+rpMhhCo/lXthQTxJ2ysO4Ka0ad97S7VT/n6YXus6fzk3fLnBZW5C
  2262 z5WDL/WW36v2oi37CyVBak61+yPBA9C1qqGxzKQqZ0oPuocU9hpud0PIp8sDHkXR1HKkNlzjuUWA
  2036 KDC6gSO62QDqgFqLCCtPmjegjnLeAdArtSE8VYGbAJ/aLb+vnQutFhk768E9uRbSxhCMzdgEveYw
  2263 a0enFUyzOWZA4yXGP+ZMI3Tdt2OuqU/SO4q64526cPE0A7ZyW2PMbWZiZ5HamIZ2RcCKLXhcDl2b
  2037 IZ5ZqFKl6+kz7UR4U+buqQZXu9SIujrAfD7f0FXpozB4Q0gwp31H9mVTZGGC4b871/wm7lvyDLu1
  2264 vXL+eccQoRzem80mekPDEiyiWK4GWqZmwxQOmPM0eIfgp1P9cqrBsewR2p/DPMtt+pfcYM+Ls2uh
  2038 FUyvTj/yvD66k3UPTs08x1AQQaGziOl0S1qRkPG9COtBTSTWM9NzQ4R64B+Px/l3tDzCgxv5C6Ni
  2265 hALufTAdmGl8B1H3VPd2af8fQAc4PgqjlIBL9cGQqNpXaAwe3LrtVn8AkZTUxg==
  2039 e+QaF9xFWrxx0V/G5uvYQOdiZzvYpQUVQSIsTr1TTghI33GnPbTA7/GCqcE3oE3GZurq4HeQXQD6
       
  2040 32XS1ITj/qLjN72ob0hc5C9bzw8MhfmL
  2266 """)
  2041 """)
  2267 
  2042 
  2268 ##file activate.csh
  2043 ##file activate.csh
  2269 ACTIVATE_CSH = convert("""
  2044 ACTIVATE_CSH = convert("""
  2270 eJx9VG1P2zAQ/u5fcYQKNgTNPtN1WxlIQ4KCUEGaxuQ6yYVYSuzKdhqVX7+zk3bpy5YPUXL3PPfc
  2045 eJx9VG1P2zAQ/u5fcYQKNgTNPtN1WxlIQ4KCUEGaxuQ6yYVYSuzKdhqVX7+zk3bpy5YPUXL3PPfc
  2295 EchHtwsohN1bILUgw61c/Vy4AJYPYm4=
  2070 EchHtwsohN1bILUgw61c/Vy4AJYPYm4=
  2296 """)
  2071 """)
  2297 
  2072 
  2298 ##file activate.ps1
  2073 ##file activate.ps1
  2299 ACTIVATE_PS = convert("""
  2074 ACTIVATE_PS = convert("""
  2300 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
  2386 QastYw==
  2161 rKQDxR6N/rffXv+lROXet/9Q+l9I4D1U
  2387 """)
  2162 """)
  2388 
  2163 
  2389 ##file distutils-init.py
  2164 ##file distutils-init.py
  2390 DISTUTILS_INIT = convert("""
  2165 DISTUTILS_INIT = convert("""
  2391 eJytV1uL4zYUfvevOE0ottuMW9q3gVDa3aUMXXbLMlDKMBiNrSTqOJKRlMxkf33PkXyRbGe7Dw2E
  2166 eJytV1uL4zYUfvevOE0ottuMW9q3gVDa3aUMXXbLMlDKMBiNrSTqOJKRlMxkf33PkXyRbGe7Dw2E
  2420 9FDOlL0FPGluf4QjcInLlxd6f6rqkgPu/5nHLg0cXCscXoozRrP51DRT3j9QNl99AP53T2Q=
  2195 9FDOlL0FPGluf4QjcInLlxd6f6rqkgPu/5nHLg0cXCscXoozRrP51DRT3j9QNl99AP53T2Q=
  2421 """)
  2196 """)
  2422 
  2197 
  2423 ##file activate_this.py
  2198 ##file activate_this.py
  2424 ACTIVATE_THIS = convert("""
  2199 ACTIVATE_THIS = convert("""
  2425 eJyNU01v2zAMvetXEB4K21jmDOstQA4dMGCHbeihlyEIDMWmG62yJEiKE//7kXKdpN2KzYBt8euR
  2200 eJyNU01v2zAMvetXEB4K21jnDOstQA4dMGCHbeihlyEIDMWmE62yJEiKE//7kXKdpEWLzYBt8evx
  2426 fKSyLPs8wiEo8wh4wqZTGou4V6Hm0wJa1cSiTkJdr8+GsoTRHuCotBayiWqQEYGtMCgfD1KjGYBe
  2201 kRSzLPs6wiEoswM8YdMpjUXcq1Dz6RZa1cSiTkJdr86GsoTRHuCotBayiWqQEYGtMCgfD1KjGYBe
  2427 5a3p0cRKiAe2NtLADikftnDco0ko/SFEVgEZ8aRC5GLux7i3BpSJ6J1H+i7A2CjiHq9z7JRZuuQq
  2202 5a3p0cRKiEe2NtLAFikftnDco0ko/SFEVgEZ8aRCZDIPY9xbA8pE9M4jfW/B2CjiHq9zbJVZuOQq
  2428 siwTIvpxJYCeuWaBpwZdhB+yxy/eWz+ZvVSU8C4E9FFZkyxFsvCT/ZzL8gcz9aXVE14Yyp2M+2W0
  2203 siwTIvpxKYCembPAU4Muwi/Z4zfvrZ/MXipKeB8C+qisSZYiWfjJfs+0/MFMdWn1hJcO5U7G/SLa
  2429 y7n5mp0qN+avKXvbsyyzUqjeWR8hjGE+2iCE1W1tQ82hsCZN9UzlJr+/e/iab8WfqsmPI6pWeUPd
  2204 xVx8zU6VG/PXLXvfsyyzUqjeWR8hjGE+2iCE1W1tQ82hsCJN9dzKaoexyB/uH79TnjwvxcW0ntSb
  2430 FrMsd4H/55poeO9n54COhUs+sZNEzNtg/wanpjpuqHJaxs76HtZryI/K3H7KJ/KDIhqcbJ7kI4ar
  2205 yZ8jq1Z5Q1UXsyy3gf9nbjTEj7NzQMfCJa/YSmrQ+2D/BqfiOi6sclrGzvoeVivIj8rcfcmnIQRF
  2431 XL+sMgXnX0D+Te2Iy5xdP8yueSlQB/x/ED2BTAtyE3K4SYUN6AMNfbO63f4lBW3bUJPbTL+mjSxS
  2206 7XCyeZI7DFe5/lhlCs5PRf5QW66VXT/NrlQ46oD/D6InkOmi3IQcbhKxAX2g4a+Xd5s3UtCtG2py
  2432 PyRfJkZRgj+VbFv+EzHFi5pKwUEepa4JslMnwkowSRCXI+m5XvEOvtuBrxHdhLalG0JofYBok6qj
  2207 m8eg6WYWqR6SL5OjKMGfSrYt/6kxxQtOpeAgj1LXBNmpE2ElmCSIy5H0zFd8gJ924HWijWhb2hRC
  2433 YdN2dEngUlbC4PG60M1WEN0piu7Nq7on0mgyyUw3iV1etLo6r/81biWdQ9MWHFaePWZYaq+nmp+t
  2208 6wNEm1QdDZtuSZcEprIUBo/XRNcbQe1OUbQ/r3hPTaPJJDNtFLu8KHV5XoNr3Eo6h6YtOKw8e8yw
  2434 s3az+sj7eA0jfgPfeoN1
  2209 VF5PnJ+ts3a9/Mz38RpG/AUSzYUW
  2435 """)
  2210 """)
  2436 
  2211 
  2437 MH_MAGIC = 0xfeedface
  2212 MH_MAGIC = 0xfeedface
  2438 MH_CIGAM = 0xcefaedfe
  2213 MH_CIGAM = 0xcefaedfe
  2439 MH_MAGIC_64 = 0xfeedfacf
  2214 MH_MAGIC_64 = 0xfeedfacf